מערך של מערך

matliv

New member
מערך של מערך

אני רוצה לבנות מערך של מערך, כאשר המערך הפנימי הוא של int והחיצוני של מה שמכיל אותו. למשל, הפנימי הוא מערך של שלושה מספרים, למשל מספרי ידיים, רגליים ואוזניים והחיצוני הוא בעל 5 איברים (היצורים שהם בעליהם). האם דבר כזה מחייב שימוש ב-struct או שיש דרך לברוח מזה באמצעות מערכים? ואם באמת חייבים להשתמש ב-struct, אז איך שולחים struct שלם לפונקציה? בתודה מראש!
 

matliv

New member
כי אני לא יודע איך שולחים struct

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

ב C זה יראה משהו כזה:
#include <stdio.h> #include <conio.h> struct Point { int x; int y; }; void increment(struct Point point) // by value { point.x++; point.y++; } void zero(struct Point *point) // by address { point->x = 0; point->y = 0; } void showAll(struct Point *points, int size) // points = the array { int i; for (i = 0; i < size; i++) { printf("\nX = %d\tY = %d",points.x, points.y); } } int main() { int i; struct Point points[10]; clrscr(); puts("\nBefore Increment:"); for (i = 0; i < 10; i++) { zero(&points); } showAll(points, 10); puts("\nAfter Increment:"); for (i = 0; i < 10; i++) { increment(points); // No effect } showAll(points, 10); return 0; }

ב סי++ הטיפוס הוא Point ולא struct Point כפרמטרים לפונקציה.
 
מה הבעיה לשלוח מבנה שלם לפונקציה?

פשוט תגדיר פונקציה שמקבלת אותו.
int MyFunction (struct MyStruct f_structName);​
 

gmorphus

New member
מצביע או reference

אם מדובר במבנה אז יש שתי אפשרויות עדיפות על פני שליחה של המבנה כולו - כאן מתבצעת העתקה של כל המבנה! עדיף להעביר לפונקציה מצביע למבנה. ואם לא רוצים שלפונקציה תהיה אפשרות להשפיע עליו אפשר להעביר מצביע למבנה קבוע const MyStr* pStr באותה מידה אפשר להחליף (אם משתמשים ב++C) את המצביע בrefernce (&) ואז הקריאה לפונקציה תהיה רגילה.
 

matliv

New member
הבנתי מה אמרת לגבי המצביע למבנה.

אבל אולי תוכל להסביר לי מה זה המצביע למבנה קבוע?
 

matliv

New member
ואם כבר...

אז האם זה מה שהתכוונת, ואם כן (וגם אם לא) למה זה לא פועל?
#include <iostream.h> struct animal_s { char name[30]; int legs; float tail_length; }; void set_animal(animal_s*); void show_animal(animal_s*); int main() { animal_s animal_1, animal_2; set_animal(&animal_1); set_animal(&animal_2); show_animal(&animal_1); show_animal(&animal_2); return 0; } void set_animl(animal_s *a) { cout<<"\ninsert name of animal: "; cin.getline( a->name, 30 ); cout<<"\ninsert number of legs: "; cin>>a->legs; cout<<"\ninsert length of tail: "; cin>>a->tail_length; } void show_animal(animal_s *b) { cout<<"\n\nThe animal: "<<b->name; cout<<"\nIt has "<<b->legs<<" legs, and its tail is "<<b->tail_length<<" ft long."; }​
ה error שהוא פולט הוא Error: Unresolved external 'set_animal(animal_s *)' referenced from ואז כתובת הקובץ. זה גם error קצת מוזר, כי בד"כ את הודעות ה error הוא כותב בחום ואת ה error הזה הוא כותב בשחור אדיש. מה זה ה error הזה, למה הוא לא צובע אותו, מה הוא עז? בתודה מראש!
 
../images/Emo6.gif מצא את ההבדלים

void set_animal(animal_s*); . . . void set_animl(animal_s *a) { cout<<"\ninsert name of animal: "; . . . . .​
 

matliv

New member
אהה...

כתבתי animl במקום animal... תודה על עבודת הבילוש. בכל אופן, ניסיתי שוב (אחרי התיקון) ויוצר רושם שהוא באמת עובד, יש רק בעיה אחת: בחיה הראשונה הוא עושה מה שהוא צריך אבל בחיה השנייה הוא לא נותן לי להכניס את שם החיה. כלומר הוא כותב ":insert name of animal" אבל אז מיד קופץ שורה ועובר למספר הרגליים (כאילו לחצתי enter). אולי אתה יכול לפענח גם את זה?
 

gmorphus

New member
תוספת

לגבי unresolved external symbol: מאוד פשוט היה לגלות מה הבעיה שלך. הerror הזה אומר שהקומפיילר ראה הגדרה לפונקציה, אבל הוא לא מוצא את המימוש שלה. במקרה שלך יש שתי אפשרויות, או שכתבת את השם של הפונקציה לא נכון, או שהפרמטרים שאתה מעביר או מחזיר לא נכונים. למשל כשתכתוב class-עם ותיתקל בerror הזה תבין שלמעשה הצהרת על פונקציה בהגדרה של המחלקה (בקובץ h) ולא סיפקת מימוש בקובץ cpp - או שלא עשית את זה כמו שצריך).
 

gmorphus

New member
מצביע למבנה קבוע

אם תגדיר את המצביע כך: const My_Str* pBla, אז תוכל לשנות את ההערך של pBla, כלומר את המיקום שאליו הוא יצביע, אבל לא תוכל לשנות את תוכל התא אליו הוא מצביע. דוגמא:
const int *pInt; int i = 7; pInt = &i; // OK *pInt = 3; // WRONG - will not compile​
(אותו דבר לגבי reference)
 
למעלה