דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. המרת מספר שלילי ל ushort

המרת מספר שלילי ל ushort

מתוזמן נעוץ נעול הועבר ארכיון code613m
16 פוסטים 3 כותבים 828 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • רחמיםר מנותק
    רחמיםר מנותק
    רחמים מורחק
    כתב ב נערך לאחרונה על ידי
    #5

    מוציא שגיאה:

    Arithmetic operation resulted in an overflow.
    

    פורסם במקור בפורום CODE613 ב09/03/2014 19:50 (+02:00)

    תגובה 1 תגובה אחרונה
    0
    • clickoneC מנותק
      clickoneC מנותק
      clickone
      כתב ב נערך לאחרונה על ידי
      #6

      מה הערך של code1.value?
      עושה רושם שהבעייה נמצאת בערך שהוא מכיל, כי השגיאה היא שגיאה של הצפה (ז"א שהערך המושם גדול ממה שהמשתנה יכול להכיל)

      פורסם במקור בפורום CODE613 ב09/03/2014 20:05 (+02:00)

      אין טסט כמו פרודקשן.

      המייל שלי urivpn@gmail.com

      תגובה 1 תגובה אחרונה
      0
      • רחמיםר מנותק
        רחמיםר מנותק
        רחמים מורחק
        כתב ב נערך לאחרונה על ידי
        #7

        @ClickOne

        מה הערך של code1.value?
        עושה רושם שהבעייה נמצאת בערך שהוא מכיל, כי השגיאה היא שגיאה של הצפה (ז"א שהערך המושם גדול ממה שהמשתנה יכוללהכיל)

        הערך שלו כמו שכתוב למעלה (-512) וזו הצפה כיון שזה מחוץ לטווח של UShort שהוא בין 0 ל 65535

        פורסם במקור בפורום CODE613 ב09/03/2014 20:08 (+02:00)

        תגובה 1 תגובה אחרונה
        0
        • dovidD מחובר
          dovidD מחובר
          dovid ניהול
          כתב ב נערך לאחרונה על ידי
          #8

          @רחמים

          מוציא שגיאה:

          Arithmetic operation resulted in an overflow.
          

          סליחה, הקוד שלי הוא קשקוש הן בזה שוהא לא פותר, והן בתוכנו (הוא חסר משמעות)... אני מיהרתי מידי.

          אדהכי והכי ראיתי שאפשר לתת לVB.NET את ההתנהגות של C#. פשוט בC# בהגדרות הקומפילציה של הפרוייקט בברירת מחדל מסומן לא לבדוק גלישה, ובVB הברירת מחדל היא לבדוק, תוכל לשנות זאת במאפייני הפרוייקט, בכרטסת Compile תלחץ על Advanced ושם תנקה את התיבת סימון עם ה"Check Overflow". אח"כ תוכל לכתוב בדיוק כמו בהודעה הראשונה שלך באשכול והכל יעבוד טוב.

          פורסם במקור בפורום CODE613 ב09/03/2014 20:08 (+02:00)

          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

          בכל נושא אפשר ליצור קשר dovid@tchumim.com

          תגובה 1 תגובה אחרונה
          0
          • dovidD מחובר
            dovidD מחובר
            dovid ניהול
            כתב ב נערך לאחרונה על ידי
            #9

            והנה קוד סוף סוף שיכפר על משוגתי:

            Dim n As UShort = (i + UShort.MaxValue) Mod UShort.MaxValue
            

            פורסם במקור בפורום CODE613 ב09/03/2014 20:10 (+02:00)

            מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

            בכל נושא אפשר ליצור קשר dovid@tchumim.com

            תגובה 1 תגובה אחרונה
            0
            • רחמיםר מנותק
              רחמיםר מנותק
              רחמים מורחק
              כתב ב נערך לאחרונה על ידי
              #10

              צריך להוסיף 1 כדי להגיע לאותה תוצאה שמתקבלת ב C# או בVB כאשר מגדירים לא לבדוק גלישה, כך:

              Dim n As UShort = If(i < 0, i + UShort.MaxValue + 1, i Mod UShort.MaxValue)
              

              ועדיין זה טוב רק להמרת מספר שלילי ל UShort אבל אם המספר הוא מעל 65535 זה לא מביא את אותה התוצאה כמו ב C#.

              פורסם במקור בפורום CODE613 ב09/03/2014 20:17 (+02:00)

              תגובה 1 תגובה אחרונה
              1
              • רחמיםר מנותק
                רחמיםר מנותק
                רחמים מורחק
                כתב ב נערך לאחרונה על ידי
                #11

                @דוד ל.ט.

                אדהכי והכי ראיתי שאפשר לתת לVB.NET את ההתנהגות של C#. פשוט בC# בהגדרות הקומפילציה של הפרוייקט בברירת מחדל מסומן לא לבדוק גלישה, ובVB הברירת מחדל היא לבדוק, תוכל לשנות זאת במאפייני הפרוייקט, בכרטסת Compile תלחץ על Advanced ושם תנקה את התיבת סימון עם ה"Check Overflow". אח"כ תוכל לכתוב בדיוק כמו בהודעה הראשונה שלך באשכול והכל יעבוד טוב.

                אכן זה מה שקורה, אבל אני לא מבין את זה אם הוא לא בודק גלישה ולא מוציא שגיאה מילא אבל על פי איזה חישוב הוא הגיע ל 65024 ???

                פורסם במקור בפורום CODE613 ב09/03/2014 20:20 (+02:00)

                תגובה 1 תגובה אחרונה
                0
                • רחמיםר מנותק
                  רחמיםר מנותק
                  רחמים מורחק
                  כתב ב נערך לאחרונה על ידי
                  #12

                  @דוד ל.ט.

                  אגב כל ההמרות מסוג הCXxxx לא עושות משהו של ממש, כלומר כל מקום שזה אפשרי, זה אפשרי גם בלעדי הפונקציה.
                  זה שימושי כדי לגשת לחברים של המחלקה ע"י ההשלמה אוטומטית וכו', אבל לא יודע לי על משהו נוסף.

                  אם אתה מסב את המספר 1 מטיפוס integer לטיפוס byte אתה למעשה מקבל את אותו מספר אבל הוא כבר לא תופס 4 ביתים אלא רק בית 1 ! וזו יכולה להיות נפק''מ להרבה דברים.
                  אם אתה לא משתמש בפונקציות ההסבה ולא קופצות שגיאות זה משום שהמהדר 'ניחש' טוב וידע בעצמו איפה להכניס את ההסבה, עיין ברפלקטור ותראה, כך שלמעשה תמיד יש הסבות רק כיון שזו שפה מאוד עילית אנו לא מרגישים בזה.

                  לדוגמא באותו קוד שאני עובד כעת לתרגם אותו לVB היו עוד כמה שגיאות לאחר התרגום שנבעו מהצורה שבה המהדר מחליט להכניס הסבות בין טיפוסים, שהמהדר של C# החליט להמיר איזה byte ל int והמהדר של VB החליט להשאיר את זה ב byte
                  והכל בגלל שהמתכנת ב C# כתב קוד שרץ לו טוב ולא הוציא שגיאות אבל היה 'חסר' הסבות 'מפורשות' והן הושלמו אוטומית והוא אפילו לא הרגיש! ואז כשמחליפים מהדר פתאום כל זה קופץ.

                  פורסם במקור בפורום CODE613 ב09/03/2014 20:27 (+02:00)

                  תגובה 1 תגובה אחרונה
                  0
                  • dovidD מחובר
                    dovidD מחובר
                    dovid ניהול
                    כתב ב נערך לאחרונה על ידי
                    #13

                    @רחמים

                    אם אתה מסב את המספר 1 מטיפוס integer לטיפוס byte

                    ואני אמרתי שאפשר להסב בלי להזדקק לCByte.

                    פורסם במקור בפורום CODE613 ב09/03/2014 20:49 (+02:00)

                    מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                    בכל נושא אפשר ליצור קשר dovid@tchumim.com

                    תגובה 1 תגובה אחרונה
                    0
                    • dovidD מחובר
                      dovidD מחובר
                      dovid ניהול
                      כתב ב נערך לאחרונה על ידי
                      #14

                      @רחמים

                      @דוד ל.ט.
                      אדהכי והכי ראיתי שאפשר לתת לVB.NET את ההתנהגות של C#. פשוט בC# בהגדרות הקומפילציה של הפרוייקט בברירת מחדל מסומן לא לבדוק גלישה, ובVB הברירת מחדל היא לבדוק, תוכל לשנות זאת במאפייני הפרוייקט, בכרטסת Compile תלחץ על Advanced ושם תנקה את התיבת סימון עם ה"Check Overflow". אח"כ תוכל לכתוב בדיוק כמו בהודעה הראשונה שלך באשכול והכל יעבוד טוב.

                      אכן זה מה שקורה, אבל אני לא מבין את זה אם הוא לא בודק גלישה ולא מוציא שגיאה מילא אבל על פי איזה חישוב הוא הגיע ל 65024 ???

                      ואני שובר את הראש להבין את C# 🙂

                      פורסם במקור בפורום CODE613 ב09/03/2014 20:50 (+02:00)

                      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                      בכל נושא אפשר ליצור קשר dovid@tchumim.com

                      תגובה 1 תגובה אחרונה
                      0
                      • dovidD מחובר
                        dovidD מחובר
                        dovid ניהול
                        כתב ב נערך לאחרונה על ידי
                        #15

                        רחמים, אתה צודק, רק כעת הבנתי את הלוגיקה של C#.
                        הוא מתייחס לאוסף המפרים המוגבל כמעגלי. הראשון הוא הבא בתור אחרי האחרון ולהפך.
                        לפי זה המקסימום +1 זה אפס ולא 1. ו-1 זה המקסימום.
                        זה נראה לי תקין:

                        Dim n As UShort = (i + (UShort.MaxValue + 1)) Mod (UShort.MaxValue + 1)
                        

                        ובקשר לVB אתה טועה, הוא סבור בדיוק כמו C#, לפחות אצלי.
                        עריכה:
                        כדי להיווכח בהבדל עליך כנראה לשנות משהו בקוד כל שהוא, אחרת הוא לא מקמפל שוב (הוא בודק כנראה שזה כבר מקומפל מפעם קודמת).

                        פורסם במקור בפורום CODE613 ב09/03/2014 21:18 (+02:00)

                        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                        בכל נושא אפשר ליצור קשר dovid@tchumim.com

                        תגובה 1 תגובה אחרונה
                        1
                        • רחמיםר מנותק
                          רחמיםר מנותק
                          רחמים מורחק
                          כתב ב נערך לאחרונה על ידי
                          #16

                          @דוד ל.ט.

                          הוא מתייחס לאוסף המפרים המוגבל כמעגלי. הראשון הוא הבא בתור אחרי האחרון ולהפך.
                          לפי זה המקסימום +1 זה אפס ולא 1. ו-1 זה המקסימום.

                          למה זה כך?

                          @דוד ל.ט.

                          ובקשר לVB אתה טועה, הוא סבור בדיוק כמו C#, לפחות אצלי.

                          אם אני מגדיר בVB שלא יבדוק גלישה אז הוא מתנהג כמו C#

                          אבל אני כן רוצה שהוא יבדוק גלישה! זה מונע הרבה שגיאות.

                          בכל אופן המסקנה שאני הגעתי אליה היא זו:

                          Dim num2 As UShort = BitConverter.ToUInt16(BitConverter.GetBytes(code1.Value), 0)
                          

                          כשעושים כך אין שגיאות גלישה והתוצאה ממש כמו ב C#

                          מה שרואים כאן זה שלפני שממירים ל ushort צריך להמיר את המספר השלילי לביתים ואת הביתים ל ushort ואז ברור שלא תהיה גלישה. וזה מה שC# עושה באופן אוטומטי.
                          ואני חושב אם תתבונן בנושא הסיביות (כשעושים להם shift) תראה שהמסקנה שלך ושלי עולות בקנה אחד.

                          פורסם במקור בפורום CODE613 ב09/03/2014 22:12 (+02:00)

                          תגובה 1 תגובה אחרונה
                          1

                          בא תתחבר לדף היומי!
                          • התחברות

                          • אין לך חשבון עדיין? הרשמה

                          • התחברו או הירשמו כדי לחפש.
                          • פוסט ראשון
                            פוסט אחרון
                          0
                          • דף הבית
                          • קטגוריות
                          • פוסטים אחרונים
                          • משתמשים
                          • חיפוש
                          • חוקי הפורום