עבור לתוכן

c - איך שולחים מערך דו ממדי לפונקציה?

Featured Replies

פורסם

איך שולחים את המערך הדו-ממדי 'mat' לפונקציה checkMat?

(כמו שזה עכשיו זה לא פועל)

#include<stdio.h>
int checkMat(int **mat, int rows);


void main(){
int mat[][3]= {{1,2,3},{1,3,4},{4,2,1}};
printf("%d", checkMat(mat, 3));
}


int checkMat(int **mat, int rows){


int i, first=0 , second=0;


for(i=0; i<rows; i++){
first= first+mat[i][i];
second= second+ mat[rows-1-i][i];
}
if(first==second)return 1;
return 0;
}

פורסם

אתה צריך להעביר אותו כמו שאתה מגדיר אותו, דהיינו:

int checkMat(int mat[][3], int rows);

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

צריך לזכור ש-**int זה לא "מערך דו מימדי" - זה סה"כ מצביע למצביע. אפשר להשתמש בזה על מנת לבנות מערך דו מימדי בגודל שאינו ידוע מראש (באמצעות malloc כמובן). יש למעשה שתי דרכים לעשות את זה:

1. להקצות מערך של מצביעים, ואז לכל מצביע להקצות מערך, דהיינו:

int **p = (int**)malloc(sizeof(int*) * rows);
for (i = 0 ; i < rows ; i++) {
p[i] = (int*)malloc(sizeof(int) * cols];
}

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

2. לדמות מערך דו מימדי באמצעות מערך חד מימדי. על מנת ליצור מערך עם m שורות ו-n עמודות יוצרים מערך חד מימדי בגודל m*n ואז בשביל לגשת לתא i,j ניגשים לאינדקס i*n+j. היתרון של השיטה הזו הוא שככה המערך יושב בבלוק רציף בזכרון, ואתה מקצה ומשחרר את כולו במכה אחת.

פורסם
  • מחבר

אוקי,

אבל זו לא הייתה השאלה.

נתונה לי הפונקציה שרשמתי, ואליה אני צריכה לשלוח את את המטריצה (שגם אותה רשמתי ;) ).

מה אני צריכה להוסיף לmain כדי שאוכל לשלוח את המטריצה לפונקציה?

פורסם

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

ארכיון

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

דיונים חדשים