שאלה ב-C (אם אפשר לחובב)

yair24

Member
שאלה ב-C (אם אפשר לחובב)

שלום לכולם יש לי שאלה מה הבדל בין שורה לשורה: 1) char x[][]; 2) char **x; 3) char *x[]; 4) char x[][100] 5) char x[100][] 6) char *x[100] ולמה מיועדת כל שורה? תודה לחובב שבודאי יענה לי על השאלה :)
 

IdanR

New member
תן לי לנסות...

קודם כל, שורות 1 ו5 אינן חוקיות כלל וכלל! זאת משום שכשמצהירים על מערך חייבים לציין את הגודל של כל המימדים, פרט לראשון. שורות 3 ו4 הן חוקיות רק כאשר מצהירים עליהם כפרמטרים לפונקציה, זאת משום שלא צוין הגודל שלהם, ואילו בתור פרמטרים זה לא משנה מכיוון שכל מה שצריך זה כתובת. אז בעצם נותרנו עם 2 ו6. שורה 3 - מערך דו-מידי כלשהו. שורה 4 - מערך דו-מימדי כשגודלו של המימד השני הוא 100. שורה 2 - מצביע למערך דו-מימדי, או מערך של מצביעים. שורה 6 - מערך של מצביעים שגודלו הוא 100, או מערך דו-מימדי שגודלו של המימד הראשון הוא 100. מקווה שעזרתי. ;-)
 

ihovav

New member
הערה

אני לא בטוח שאפשר לקבל פרמטר כמו [100][]CHAR, וגם אם כן - רק אם אתה יודע בוודאות שגודל כל מערך בודד במטריצה הוא 100 תאים בדיוק (ממש לא גנרי) וזה בגלל שבזיכרון - המטריצה מיוצגת כבלוק אחד ארוך ולא ב שני מימדים ואם אתה תשלח מערך שאינו תואם (ואני בכלל לא בטוח ש C מאפשרת כזה דבר) יהיה לך בלבול בין בתאים של המערך המקורי ובין ה``העתק`` שלו בפונקציה ניסיתי להסביר את זה כמה שיותר בפשטות - ואני יודע שלא כל ההסבר מדויק לגמרי - אז אם יש שאלות אפשר לפנות אלי אישית או בפורום וחוץ מזה - גם לעידן יש המון ידע ב C - אני בטוח שהוא ישמח לעזור ויוכל לעזור הרבה יותר ממני כי לו יש נסיון (אני מנחש...)
 

IdanR

New member
זה אפשרי - בדקתי את זה

אבל כמו שאמרת, זה מחייב שהמערך יהיה תואם. בדרך-כלל זה לא רעיון טוב במיוחד.
 

yair24

Member
זה אפשרי

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

IdanR

New member
יש עוד דרך...

להעביר מערך דו מימדי אה קובץ מצורף.
 

yair24

Member
אתה צודק אבל...

זה לא המקרה שאני דיברתי עליו אני דיברתי על מקרה שבו במערך בMAIN מוגדר ללא כוכביות בכלל אלא עם סוגריים בלבד כלומר שני המימדים כבר מוגדרים בכל מקרה תודה יאיר
 

yair24

Member
זאת אומרת ..

שבאמת אי אפשר?? טוב לדעת תודה יאיר דרך אגב הייתי באתר שלך הטטריס באמת לא עבד לי אבל הנחש היה מגניב זה קשה לעשות תכנית כזאת? זה בטח בMFC (נושא שתכננתי ללמוד לעומק במילואים אבל מסתבר שהמרצה שלי לSQL החליטה בשבילי שאני אלמד SQL למבחן החוזר אחרי הכישלון החרוץ שאני אנחל מהמבחן הקשהההההההההההההההההההה רצח שהיא נתנה לנו איזה בעסה) ובנימה אופטימית זו אם לא נכנסת לאתר שלי אתה מוזמן הכתובת נמצאתץ פה בפורום איפהשהו יאיר
 

IdanR

New member
B-)

זה לא קשה. כל מה שצריך זה להפעיל קצת את הראש, לתכנן אלגוריתם מתאים, ליישם אותו באמצעות הידע שלך בC או ++C או כל שפה אחרת לצורך העניין, וכמובן להשקיע מזמנך הפנוי. ;-) כשמדובר במשחק-מחשב, יש צורך בהרבה תכנון ועיצוב. למען האמת זה לא בMFC, אבל אני מניח שאפשר לעשות משהו כזה גם בMFC (מן הסתם..). השתמשתי רק בAPI המופשט של ווינדוס, ובGDI לצורך גרפיקה. אגב - ניתן להוריד גם את קוד המקור של התוכנית. ראיתי את האתר שלך... אתר נחמד. :)
 

yair24

Member
אוקיי

איך עושים את הפרצופים האלה? אני אנסה כאן רגע.. :-D :-B B-) :-* :-O אוקיי זה סתם ניסוי דרך אגב הוצאתי 100 בבינה מלאכותית שזה פצצה אה ורציתי לשאול הבנתי שלחובב אין עבודה אפילו שהוא מצטיין מה איתך יש לך עבודה בתכנות? איפה למדת? אני לומד בבראודה בכרמיאל יאיר
 

yair24

Member
חההה

הצלחתי לעשות את הפרצוף עם המשקפי שמש ואני לא זוכר איך עשיתי אותו :)
 

IdanR

New member
פחחחח....

את תסתכל טוב, מתחת להודעה שאתה כותב, יש כזה קישור: ``סמיילים וסימנים לתוכן ההודעה`` יותר פשוט להשתמש בזה מאשר לנסות לנחש. ;-)
 

yair24

Member
חברה אני בשוק!!

מסתבר שאני כן הולך ללמוד MFC במילואים כי איכשהו הצלחתי לקבל 75 (היה פקטור עצבני) ביי
 

ihovav

New member
צדקת - תשובה...

קודם כל אתה צריך להבין משהו : הייצוג של POINTER ומערך הוא רק בשביל המערכת של C כל מערך ב C הוא למעשה POINTER ולכן כאשר אתה שולח מערך לפונקציה - אתה צריך לקלוט אותו כ POINTER למעשה גם []CHAR וגם *CHAR זה אותו דבר אבל המערכת של C יודעת להקצות לך את המקום הדרוש אם אתה מגדיר מערך כמשתנה ולא כPOINTER בגלל שהמערכת מבצעת את ההקצאה - אתה לא צריך לעשות FREE ולא לעשות REALLOC וכ``ו לגבי השאלה : **CHAR - זה POINTER ל POINTER מסוג CHAR - אפשר להקצות את אחת הכוכביות ואז זה POINTER ל מערך, או את שתיהן ואז זה מטריצה(מערך דו מימדי) *[]CHAR - זה מערך של POINTERS ל CHAR - כנ``ל - אפשר להקצות אותם ואז זו מטריצה [][]CHAR - מערך דו מימדי אני לא בטוח למה אתה מתכוון כשאתה כותב סוגריים ריקים...
 

ihovav

New member
תוספת והסבר :

1) כמו שעידן כתב - אין אפשרות להגדיר מערך ללא הגודל - אא``כ זה ב PROTOTYPE של פונקציה 2) כאשר אני אומר שאתה חייב לקבל מערך בפונקציה כ POINTER אני מתכוון שגם אם אתה מקבל אותו כמערך עם סוגריים ריקים - אתה למעשה משתמש ב POINTER מבלי לדעת... כדאי (בשבילך) ללמוד את נושא ה POINTERS טוב טוב - זה אחד מהנושאים החשובים ביותר ב C ואם אתה לא יודע את זה טוב - אתה לא יכול לכתוב תכניות בסיסיות כגון - רשימות מקושרות לסוגיהן, עצים לסוגיהם וכ``ו... כלומר - אתה למעשה מוגבל מאוד בתכנות לכן אני מציע שפשוט תשב ותכתוב תכניות עם POINTERS ותראה מה קורה בכל מקרה שאתה יוצר ככה אתה תוכל לזכור הכי טוב...(מנסיון)
 
למעלה