עבור לתוכן

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

Featured Replies

פורסם

יש לי פונקציה שצריכה לקבל מצביע למערך דו מימדי

הבעיה היא שאני לא מבין איך לשלוח מצביע כזה


void PaintPoint (char **arr, int nCol, int nRow, char cChar)
{
*(*(arr + nRow) + nCol) = cChar;
}


void main(void)
{
char arr[8][8] = {0};
PaintPoint(&arr, 4, 4, 'X');
}

ניסיתי כל מני אפשרויות (וגם את גוגל), ואני פשוט לא מצליח להעביר מצביע למערך

פורסם

תשלח אותו בלי &, המערך שהקצת הוא מטיפוס char** אין צורך להוסיף לו &.

פורסם
  • מחבר

ניסיתי את זה, עדיין יש שגיאה

IntelliSense: argument of type "char (*)[8]" is incompatible with parameter of type "char **" zz
פורסם

מוזר, אין לי מושג למה זה לא עובד.

אבל אם אתה מקצה את המערך בצורה הזאת:


char** arr = (char**)malloc(8*sizeof(char*));
for(i=0;i<8;++i)
arr[i] = (char*)malloc(8*sizeof(char));

זה יעבוד.

פורסם
  • מחבר

תודה רבה זה בהחלט עובד :)

זה ממש מוזר אבל שחייבים להקצות עם מאלוק ???

פורסם

זה כי **char ו-[8][8]char הם לא אותו טיפוס (בניגוד ל-*char ו-[]char שהם כן אותו טיפוס... בערך).

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

[8][8]char הוא לעומת זאת מערך דו מימדי, בגודל 8 על 8. המערך יושב במקום רצוף בזכרון, ולמעשה הקומפיילר מתרגם אותו מאחורי הקלעים למערך חד מימדי בגודל 64.

פורסם

תודה רבה יואב, חסכת לי המון בלבול בעתיד!

פורסם
  • מחבר

הסבר מצוין! תודה רבה :) :)

ארכיון

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

דיונים חדשים