מערך בגודל לא ידוע - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

מערך בגודל לא ידוע


I.Robot

Recommended Posts

שלום.

אני צריך מערך בתכנית בפסקל, אבל אני לא יודע יודע מה הגודל שלו ואני מזין לו את הגודל במהלך התכנית, יש איזושהי אפשרות לקבל את הגודל ושרק אז הוא יצור את המערך?

קישור לתוכן
שתף באתרים אחרים

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

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

הפונקציה SIZEOF שהיא נותנת לך גודל של כל משתנה בבתים באפון כזה שתוכל להקצות את הזכרון לדוגמא SIZEOF(INT) A (בלי האות A-רשמתי את זה שיסתדר היישור מימין לשמאל).

יש מספר פקודות אפשרויות להקצאת דינמית MALLOC() , CALLOC() A שתי פונקציות אלו נועדו להקצות שינמי באמצע התוכנית אך כאשר נרצה שעם כל משתנה בתוכנית יגל המערך באחד נעדיף את הפונקציה REALLOC() A ניתן עם פוקצייה זאת אף להגדיר מערך וכפי שאסביר בהמשך.

המבנה(SYNTAX) של זה הוא כאשר IP לדוגמא הינו מצביע מסוג כלשהו נאמר לדוגמא INT

IP=(INT*)REALOC(IP,SIZEOF(INT)*TOTAL) A

הסוגריים (*INT) הם ביצוע CASTING אנו כופים כל משתנה שיוכנס למערך שיהיה מסוג INT לדוגמא הוא FLOAT הוא ישתנה לINT על ידי לקיחת החלק השלם.

IP בסוגריים הוא המצביע למערך המוקצה שאנו רוצים להגדיל או להפחית את גודלו .במקרה ורוצים להקצות מערך חדש כותבים שם NULL וTOTAL הוא הגודל של המערך שאנו רוצים לשנות אליו(אתה מבקש אותו מהמשתמש או שאתה שם אותו בלולאה שהמונה שלה הוא TOTAL כך שכל פעם שהלולאה תחזור על עצמה הוא יקלוט ערך חדש.

עכשיו יש אפשרות לומר בתחילת התוכנית IP=NULL כך שנוכל לשים את זה בלולאה באופן כזה שגם בפעם הראשונה הוא יכיר את המצביע IP לפני שהוא יוקצה.

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

בהקצאה שינמית יש לשחרר בסוף אם אין צורך את המערך מכיון שהוא שונה ממערך רגיל עם FREE() A שבין הסוגריים רושמים את שם המצביע למערך שאותו הקצינו.

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

אני כותב אותה בהודעה הבאה שהכל יהיה מסודר משמאל לימין

קישור לתוכן
שתף באתרים אחרים

int grade,total=o;

int *gptr=null; //מצביע זה הוא המערך שאותו נעשה שיקלוט ציונים

//לא רשמתי את התוכנית במלואה אז לא לנסות להריץ זה לא יעבוד

printf("enter grade, and if you want stop write 0:\n");

do

{

printf("enter grade number.%d:,total+1") //הגדרתי את טוטל 0 בגלל שהוא ישמש במערך גם והמער מתחיל כידוע מ0

scanf(%d,&grade);

gptr=(int*)realoc(gptr,sizeof(int)*(total+1)); \\כמו שאפשר לשים לב בפעם הראשונה שזה יורץ זה יקצה מערך חדש כי המצביע שווה נוול וכמו

\\שהגדרנו בתחילת המערך בפעמים הבאות שיהיה למצביע ערך הוא יגדיל את המערך בהתאם

\\לטוטל שיוגדל ב1

gptr[total]=grade; \\כמו שאנו רואים המצביע שהגדרנו הוא מערך לכל דבר

total++ \\ טוטל יוגדל ב1 לפעם הבאה כמובן שאם קלטנו בציון 0 אז תופסק הלולאה ובעצם לשורה הזאת אין משמעות

}

while (grade!=0); // במקרה והציון שקלטנו הוא 0 הלולאה תפסק

מי שרוצה יכול להשלים את ההתחלה ו(פתיתת התוכנית) כמו כן לא לשכוח את הספרייה

ALLOC.H

ואפשר לסיים יפה עם הדפסת המערך לא כולל האיבר האחרון 0

ולא לשכוח לשחרר את הזכרון בסוף התוכנית עם הפונקציה

free(gptr); \\ משחרר את המקום המוקצה שנתנו למצביע

יש אפשרות גם לבדוק אם הקצאת הזכרון עבדה כי לא תמיד זה עובד אבל זה בפעם אחרת(משפט תנאי) בגלל זה שמשחקים משחקים כבדים לפעמים אין מקום להקצות בזכרון ונמשחק יוצא.

שמחתי לעזור לך ואם יש בעיות אני כאן בשבילך..................

קישור לתוכן
שתף באתרים אחרים

אחלה הסבר.

רק בעיה אחת: הבחור מתכנת בפסקל ולא בC.

העקרון מאוד דומה, תחפש dynamic allocation בגוגל ותוכל למצוא גם על פסקל.

וואו אחי לא שמתי לב שהוא רשם פסקללללללל איזה דפוק אני

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

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...