המרת מספר שלילי ל ushort
-
מה הערך של code1.value?
עושה רושם שהבעייה נמצאת בערך שהוא מכיל, כי השגיאה היא שגיאה של הצפה (ז"א שהערך המושם גדול ממה שהמשתנה יכוללהכיל)הערך שלו כמו שכתוב למעלה (-512) וזו הצפה כיון שזה מחוץ לטווח של UShort שהוא בין 0 ל 65535
פורסם במקור בפורום CODE613 ב09/03/2014 20:08 (+02:00)
-
מוציא שגיאה:
Arithmetic operation resulted in an overflow.
סליחה, הקוד שלי הוא קשקוש הן בזה שוהא לא פותר, והן בתוכנו (הוא חסר משמעות)... אני מיהרתי מידי.
אדהכי והכי ראיתי שאפשר לתת לVB.NET את ההתנהגות של C#. פשוט בC# בהגדרות הקומפילציה של הפרוייקט בברירת מחדל מסומן לא לבדוק גלישה, ובVB הברירת מחדל היא לבדוק, תוכל לשנות זאת במאפייני הפרוייקט, בכרטסת Compile תלחץ על Advanced ושם תנקה את התיבת סימון עם ה"Check Overflow". אח"כ תוכל לכתוב בדיוק כמו בהודעה הראשונה שלך באשכול והכל יעבוד טוב.
פורסם במקור בפורום CODE613 ב09/03/2014 20:08 (+02:00)
-
צריך להוסיף 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)
-
@דוד ל.ט.
אדהכי והכי ראיתי שאפשר לתת לVB.NET את ההתנהגות של C#. פשוט בC# בהגדרות הקומפילציה של הפרוייקט בברירת מחדל מסומן לא לבדוק גלישה, ובVB הברירת מחדל היא לבדוק, תוכל לשנות זאת במאפייני הפרוייקט, בכרטסת Compile תלחץ על Advanced ושם תנקה את התיבת סימון עם ה"Check Overflow". אח"כ תוכל לכתוב בדיוק כמו בהודעה הראשונה שלך באשכול והכל יעבוד טוב.
אכן זה מה שקורה, אבל אני לא מבין את זה אם הוא לא בודק גלישה ולא מוציא שגיאה מילא אבל על פי איזה חישוב הוא הגיע ל 65024 ???
פורסם במקור בפורום CODE613 ב09/03/2014 20:20 (+02:00)
-
@דוד ל.ט.
אגב כל ההמרות מסוג הCXxxx לא עושות משהו של ממש, כלומר כל מקום שזה אפשרי, זה אפשרי גם בלעדי הפונקציה.
זה שימושי כדי לגשת לחברים של המחלקה ע"י ההשלמה אוטומטית וכו', אבל לא יודע לי על משהו נוסף.אם אתה מסב את המספר 1 מטיפוס integer לטיפוס byte אתה למעשה מקבל את אותו מספר אבל הוא כבר לא תופס 4 ביתים אלא רק בית 1 ! וזו יכולה להיות נפק''מ להרבה דברים.
אם אתה לא משתמש בפונקציות ההסבה ולא קופצות שגיאות זה משום שהמהדר 'ניחש' טוב וידע בעצמו איפה להכניס את ההסבה, עיין ברפלקטור ותראה, כך שלמעשה תמיד יש הסבות רק כיון שזו שפה מאוד עילית אנו לא מרגישים בזה.לדוגמא באותו קוד שאני עובד כעת לתרגם אותו לVB היו עוד כמה שגיאות לאחר התרגום שנבעו מהצורה שבה המהדר מחליט להכניס הסבות בין טיפוסים, שהמהדר של C# החליט להמיר איזה byte ל int והמהדר של VB החליט להשאיר את זה ב byte
והכל בגלל שהמתכנת ב C# כתב קוד שרץ לו טוב ולא הוציא שגיאות אבל היה 'חסר' הסבות 'מפורשות' והן הושלמו אוטומית והוא אפילו לא הרגיש! ואז כשמחליפים מהדר פתאום כל זה קופץ.פורסם במקור בפורום CODE613 ב09/03/2014 20:27 (+02:00)
-
@דוד ל.ט.
אדהכי והכי ראיתי שאפשר לתת לVB.NET את ההתנהגות של C#. פשוט בC# בהגדרות הקומפילציה של הפרוייקט בברירת מחדל מסומן לא לבדוק גלישה, ובVB הברירת מחדל היא לבדוק, תוכל לשנות זאת במאפייני הפרוייקט, בכרטסת Compile תלחץ על Advanced ושם תנקה את התיבת סימון עם ה"Check Overflow". אח"כ תוכל לכתוב בדיוק כמו בהודעה הראשונה שלך באשכול והכל יעבוד טוב.אכן זה מה שקורה, אבל אני לא מבין את זה אם הוא לא בודק גלישה ולא מוציא שגיאה מילא אבל על פי איזה חישוב הוא הגיע ל 65024 ???
ואני שובר את הראש להבין את C#
פורסם במקור בפורום CODE613 ב09/03/2014 20:50 (+02:00)
-
רחמים, אתה צודק, רק כעת הבנתי את הלוגיקה של 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)
-
@דוד ל.ט.
הוא מתייחס לאוסף המפרים המוגבל כמעגלי. הראשון הוא הבא בתור אחרי האחרון ולהפך.
לפי זה המקסימום +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)