מערך דו מימדי

yair24

Member
מערך דו מימדי

שלום, אני לא בטוח שמה שאני מבקש אפשרי אבל: אני צריך ליצור פונקציה שמקבלת כפרמטר מערך דו מימדי וגם שני מספרים שמתארים את הפרמטרים שלו: למשל אם המערך הוא 6X9 אז המספרים הם 6,9 אם 10X20 - אז המספרים הם 10,20 וכו´ בתוך הפונקציה יש שתי לולאות אחת בתוך השניה שרצות על המערך הדו מימדי. המערך עצמו מוגדר בצורה כזאת:
ARRAY[10][20]​
איך אני צריך להגדיר את הפרמטר בפונקציה? ניסיתי עם שתי כוכביות אבל זה לא הולך... (למה נראה לי שזה בכלל בלתי אפשרי? או שאני טועה וזה כן אפשרי?) יאיר
 

emissary

New member
OK

אני מניח שאתה עובד בשפת C או בC++ אז במיין
function(array,x,y)​
X,Y זה הגודל של המערך, וarrary, זה המערך עצמו. ואז בפונקציה עצמה, אני מניח שזה מערך דו מימדי של INT. ושהפונקצתיה זו פונקצית קליטה.X,Y כבר הוגדרו כ #define X מספר #define Y מספר
function(int array[X][Y], int x, int y) { int i, j; for(i = 0; i < x; i++) for(j = 0; j < y; j++) scanf("%d",array[j]); } for(

מקווה שהבנתה, ואם לא שאל מה שלא הבנתה.
 

MotiAd

New member
לא בדיוק...

את המערך בפונקציה אתה צריך להגדיר כך:
function(int array[][Y], int x, int y);​
 

yair24

Member
לא טוב לי... אבל תודה, כי זה עזר לי

אני לא בטוח שמה שאני צריך הוא אפשרי. ועכשיו אחרי שראיתי את הדוגמא שלךך אני כמעט בטוח שזה באמת בלתי אפשרי. בדוגמא שלך הY תמיד קבוע וזה לא טוב לי. אני צריך פונקציה שיודעת לקבל מערך דו מימדי שיכול להיות בכל מיני גדלים גם של הX וגם של הY ולדעתי זה פשוט בלתי אפשרי. אם אני טועה ויש לך פתרון תן לי אותו בבקשה. יאיר
 
מערך גם 5 מימדי הוא קטע רציף בזכרון

הפרמטרים שתקבל יהיה פוינטר לתחילת המערך ובעזרת שאר הפרמטרים תוכל לבנות את הלולאה. כמובן שתצטרך לדעת את מס´ הבתים של כל תא במערך --> sizeof cell [4][2] = pointer + 4*X*sizeof(cell type)+2*sizeof(cell type) ok את האוקי כתבתי שיראה נורמלי
 

yair24

Member
נכון, ויחד עם זאת...

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

yair24

Member
אני אתן את קטע הקוד...

void TableBackGround() { const char tech[10][7]= // Medium { 0x3f,0x3c,0x0,0x0,0x6,0x0,0x3c, 0x3,0x0,0x0,0x0,0x6,0x1,0x26, 0x3,0x0,0x0,0x0,0x6,0x1,0x26, 0x3,0x1,0x3c,0xf,0x27,0x30,0x6, 0x3,0x3,0x6,0x18,0x37,0x18,0xc, 0x3,0x3,0x6,0x18,0x6,0x18,0x18, 0x3,0x3,0x3e,0x18,0x6,0x18,0x30, 0x3,0x3,0x0,0x18,0x6,0x19,0x20, 0x3,0x3,0x6,0x18,0x36,0x19,0x20, 0x3,0x1,0x3c,0xf,0x26,0x19,0x3e }; DrawArray(14,1,tech,10,7); lcd_xy(5,3); LCDPuts("T1 T2 T3 DT VC1 VC2/100"); // print the value string. lcd_xy(2,4); LCDPuts("L:"); // print the value string. lcd_xy(2,5); LCDPuts("M:"); // print the value string. lcd_xy(2,6); LCDPuts("D:"); // print the value string. lcd_xy(2,8); LCDPuts("JMax:"); // print the value string. lcd_xy(12,8); LCDPuts("PulseDelay:"); // print the value string. lcd_xy(2,10); LCDPuts("HIDWar:"); // print the value string. lcd_xy(12,10); LCDPuts("HIDErr:"); // print the value string. lcd_xy(23,10); LCDPuts("HIDPulses:"); // print the value string. }​
ועכשיו הגדרת הפונקציה שמקבלת את המערך:
void DrawArray(int x , int yc , char **Array ,int isize, int jsize) { int y,i,j; y=8*yc; for(i=0;i<isize;i++) { Setxyg(x,y+i); lcd_set_data_auto_write_mode(); for(j=0;j<jsize;j++) InsertData(Array[j]); lcd_reset_data_auto_write_mode(); } }

ככה מוגדרת הפונקציה שימו לב לקריאה אליה ניסיתי גם להגדיר עם שני סוגריים מרובעים ככה: [][] ואז הוא אומר לי SIZE OF TYPE IS UNKNOWN OR ZERO ולא עובר קימפול. אני כמעט בטוח שזה בלתי אפשרי רק אני לא מבין את הסיבה. מי שחושב שהוא יודע את הסיבה למה זה לא עובד שיגיד בבקשה. או לחילופין מי שחושב שזה כן אפשרי שיכתוב איך אני צריך להגדיר את הפונקציה. יאיר
 

jgut

New member
בטח שזה אפשרי!

הנה דוגמא פשוטה:
void func(int* Array, int x, int y) { for (int i = 0; i < y; i++) { for( int j = 0; j < x; j++) { printf("%02x ", Array[i*x +j]); } printf("\n"); } } int main(int argc, char* argv[]) { int* MyArray = new int[6]; for(int i = 0; i < 6; i++ ) { MyArray = i; } func(MyArray, 3, 2); return 0; }
 

jgut

New member
שכחתי להוסיף

שבדוגמא שלי המערך הוא בעצם 2*3. ואתה יכול לראות בהדפסה שהוא מדפיס אותו כמערך דו מימדי. ישנם גם עוד דרכים לפתור את זה עם פיתרון זה לא מתאים לך...
 

yair24

Member
זאת עקיפה יפה ופתרון לבעיה אבל...

אתה יודע להסביר למה הדרך הראשונה לא עובדת? (אני חייב להבין למה) יאיר
 

jgut

New member
כי...

כשמגדירים מערך רב מימדים. הקומפיילר מצפה לקבל את גודל המימדים. המקרה היחידי בו הוא יכול להסתדר בלי, זה אים הגודל של המימד הראשון חסר. אתה יכול להסתכל ב-msdn על Compiler Error C2087. שים לב שבכל מקרה בפונקציה שמקבלת את המערך בתור פוינטר למשהו אתה צריך לחשב את המיקום אליו אתה רוצה לפנות למערך ( לדוגמא Array[x*i+j] ולא כ-
Array[j]
 

yair24

Member
רגע רגע...

הנה קישור לעמוד של הMSDN http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore98/html/c2087.asp לא כתוב שם כלום... רק אומרים מה הדרך הנכונה לעשות ומה הדרך הלא נכונה לעשות. אתה יכול לפרט קצת יותר? יאיר
 

jgut

New member
כן

אני לא מכירה את זה מספיק טוב, אבל יש את המאמר הבא: http://www.iue.indiana.edu/departments/iim/c202/lectures/17.html שמסביר את הנושא של כמה מימדים למערך. בגדול מה שהוא אומר שם זה שאים לא מגדירים את שאר המימדים (מלבד הראשון) הקומפיילר לא יודע כיצד לחשב את המיקום של כל תא במערך. וזה הגיוני כי בגלל שהוא מתייחס לזה בדיוק כמו מערך בעל מימד אחד, הוא צריל לדעת בזמן קומפיציה איך לתרגם את ה- [1][2] לשורה שניה עמודה אחת. לכן הוא צריך לדעת גודל כל שורה שזה בעצם 1 + 2 * 6 במקרה שאורך שורה הוא 6.
 

yair24

Member
ובדוגמא שנתת - אורך שורה הוא 6

ובמערך דו מימדי (למשל) אורך השורה הוא המימד השני. אז חובה לתת את המימד השני שמציין את אורך השורה - עבור ההכפלה אז אם נניח אני מגדיר מערך
I[][]​
הוא לא ידע את אורך השורות ואז כשהוא יבצע את המכפלה אין לו עם מה לבצע את המכפלה (כי לא הגדרתי לו) נכון? יאיר
 

jgut

New member
ככה ניראה לי

אבל יכול להיות שיש פה מישהו בפורום שמכיר את הנושא יתר טוב ולאשר / לתקן את מה שאמרתי...
 

yair24

Member
יכול להיות אבל התשובה שנתת לי

דוקא מראה שלך יש הבנה מספיק גבוהה כדי לענות על עוד שאלות. יאיר
 

WarLord

New member
עד כמה שאני מכיר את הנושא

מערך הוא תמיד אוסף (רצוף) של כתובות בזכרון, לא משנה מה המימדים שלו. החלוקה לשורות ועמודות באמצכות הסוגרים המרובעים היא רק לנוחות המשתמש. הקומפיילר תמיד יתרגם את המימדים לפי מספר שורה * אורך שורה + מספר עמודה. אם נקח מערך חד מימדי בן 8 תאים אז ניתן להתייחס אליו בהרבה אופנים מערך חד מימדי בן 8 תאים מערך דו מימדי עם 2 שורות בת 4 תאים כל אחת מערך תלת מימדי עם 2 תאים בכל מימד וכן הלאה. נסיון נחמד יהיה להגדיר מערך דו מימדי ולהגניס בו ערכים ואז "לרוץ" עליו בעזרת פוינטר כאילו היה חד מימדי ולהדפיס את הערכים למסך.
 

yair24

Member
בגלל זה בדיוק זה לא עובד

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