שאלה בממשק עברי - Struct בשפת C

Shlomi TC

New member
שאלה בממשק עברי - Struct בשפת C

לא אעמיק ואכתוב את השאלה כולה אך אשאל את הנקודה הספציפית בה נתקעתי.
הוגדרו שני המבנים הבאים: #define N 8 typedef struct { int mar[N]; } byte_type; typedef struct { byte_type byte1; byte_type byte2; } word_type;
הוכנה הפונקצייה הבאה: word_type rotate_left_word(word_type word);
בתוך ה MAIN הוגדר: word_type x;
האם תתאפשר קריאה בצורה זו לפונקצייה?: x=rotate_left_word(x); האם גם BYTE1 וגם BYTE2 יעברו? אם כן, מסיבה לא ברורה אחרי שקראתי לפונקציה, חלק מהתאים השתנו. נניח שב x.byte1.mar היו הערכים 1 1 0 1 0 0 0 1 וב x.byte2.mar היו הערכים 0 1 1 0 1 1 0 0 לאחר ההעברה לפונקציה, פתאום הם משתנים ל: ב x.byte1.mar יהיו הערכים 1 0 1 0 0 0 0 1 וב x.byte2.mar יהיו הערכים 0 1 1 1 1 0 0 1 לפני ההעברה הדפסתי את המערך ומיד לאחר ההעברה ובתוך הפונקציה שוב הדפסתי וראיתי שהתוכן השתנה, שום פעולה נוספת ביניהם לא ארעה.
 

vinney

Well-known member
אתה לא יכול לשים את STRUCT

כLVALUE של השמה. אתה צריך להעביר BYREF או להחזיר מצביע. זה התקמפל לך בכלל???
 

Shlomi TC

New member
התקמפל כמו גדול

בתוך הפונקציה עשיתי RETURN ל WORD והוא מחזיר את זה יפה מאוד. עבד גם בפונקציה שהשתמשתי ב BYTE בלבד - על אותו עקרון של WORD אבל במקום להכיל שדה word.byte1/2.mar יש לי byte.mar.
 

Moridin

New member
דווקא אפשר...

http://www-h.eng.cam.ac.uk/help/tpl/languages/C++/Thinking_in_C++/tic0119.html#Heading310
 

Zack DA

New member
הסיבה שאתה מתפלא היא,

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

Shlomi TC

New member
ניסיון להעלות את קטע התוכנית

התוכנית תבקש מהמשתמש להכניס 16 מספרים כאשר ה 8 הראשונים הולכים ל x.byte1 וה 8 האחרונים יילכו ל x.byte2. לאחר מכן תשאל התוכנית את המשתמש אם ירצה לבצע את הפעולה ROL (להזיז את כל הספרות מיקום אחד שמאלה). התוכנית תקרא לפונקציה rotate_left_word ובצע את המשימה. אז שוב אחזור על הבעיה, לפני קריאת הפונקציה, מוצגים הערכים בסדר גמור כמו שהוכנסו. בשנייה שהערכים עוברים, חלקם משתנים. ודבר נוסף שעליתי עליו, נראה כאילו פעולת ההזזה מתבצעת פעמיים ולא פעם אחת, כנראה טעות שלי בכתיבת הפונקצייה, אשמח אם מישהו יימצא מה הבעיה.
זו הקריאה לפונקציה: x=rotate_left_word(x);
זו הפונקציה: word_type rotate_left_word(word_type word) תודה רבה!
 

KoVaTeMBeL

New member
הבעיה בהצגה

בתוך הפונקציה rotate_left_word ובסוף התכנית
for(i=0 ; i<N ; i++) { printf("%d ", word.byte1.mar); printf("%d ", word.byte2.mar); }

אתה מציג אות אחת מbyte1, ואז אות אחת מbyte2 במקום להדפיס את כל byte1 ואחריו את כל byte2
 

Pumi

New member
לא יעזור לך הרבה מה שאתה מנסה

כל עוד איך לך compiler שיודע להתמודד עם השמות של structs, זה לא יעבוד לך כמו שצריך. תנסה להעביר pointers ותסגור עניין.
 
למעלה