עבור לתוכן
View in the app

A better way to browse. Learn more.

HWzone

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

בעיית פויינטרים ב C

Featured Replies

פורסם

אני קצת מסתבך סביב עצמי עם פוינטרים לאחרונה.

אני מנסה לבצע השמה פשוטה אך משהו כנראה הסתבך לי.

יש לי שני מבנים,


struct object { void * a; };
typedef struct object* objectP;
typedef struct { objectP array; }objectArr;
typedef objectArr* objectArrP;

התרחיש הוא שאני מקבל בשיטה מסוימת את שני הסטראקטים, כפוינטר אליהם, ומעוניין לבצע השמה של אחד בשני.

בקטע אחר בתכנית, בוצע איתחול למערך של אובג'קטארר בצורה הבאה:


array = (objectP)malloc(sizeof(struct object) * 4);

וכעת יש לי שיטה בערך כזו:


static void addobject(objectArrP list, objectP obj) { list->array[0] = obj; }

כמובן שלא בדיוק 0, ולא בדיוק 4 וכדומה כמובן שזו רק אילוסטרציה להבנת העניין.

הכונה בשיטה זו שאני מקבל את האוביקט הזה ומעוניין שהמערך שלי, שהוא מאותו טיפוס, וכבר איתחלתי לו גודל מסוים במקום אחר בתוכנית, כעת התא ה-0 שלו יצביע לאובייקט הנתון לי.

בקומפילציה אני מקבל את השגיאה הבאה:


error: incompatible types when assigning to type ‘struct object’ from type ‘objectP'

אשמח לעזרתכם בנידון, תודה

פורסם

הטיפוס של [list->array[0 הוא object, והטיפוס של obj הוא objectP. אי אפשר לבצע השמה מאחד לשני. על מנת שזה יעבוד, אתה צריך או ש-array יהיה מטיפוס *objectP, או לעשות השמה של obj* במקום obj.

פורסם
  • מחבר

תודה על המענה הזריז,

שימוש בהשמה עם *obj, האם זה בעצם יפנה את הפוינטר שיש לי ב array[0] לאוביקט הנתון או שיבצע העתקה שלו by value?

פורסם

by value. שים לב ש-[array[0 הוא לא מצביע, אלא אובייקט מטיפוס object.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.