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

c++-מערך דינאמי של מצביעים


TecNodRom

Recommended Posts

שלום רב!

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

char**temp;

temp=(char**)malloc(sizeovstring*sizeof(char*));

אז אם אני עושה כך:

	temp[0]="xyz";
temp[1]="assssssssssbc";
temp[2]="aqq";
temp[3]="aaa";
temp[4]="phg";

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

אך כאשר אני עושה

cin.getline(temp[i],sizeof(char*)); 

התוכנית קורסת לי.

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

תודה רבה!

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

קודם כל, אם אתה עובד ב-++C, יש סיבה שאתה עובד עם מערכים, malloc ו-*char במקום לעבוד עם vector, new ו-string?

מהו ה-i שבו התכנית קורסת לך?

חוץ מזה, הפרמטר השני שמועבר ל-cin.getline צריך להיות מספר התווים המקסימלי במערך. ככה אתה סתם מעביר לו 4 (שזה sizeof של *char), וגם הפרמטר שמועבר ל-malloc צריך להיות גודל המערך, ולפי השם של מה שאתה מעביר לו (sizeofstring) נראה לי שאתה מעביר לו ערך לא נכון.

יעזור אם תתן קצת יותר מידע.

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

אנחנו רק בתחילת הקורס ולכן אמרו לנו להשתמש בשפת c אך עם הקלט ופלט של C++.

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

cin.getline(temp[i],sizeof(char*)); 

התוכנית הראשית זה כך:

	cout<<"Enter Length of strings"<<endl;
cin>>sizeovstring;
r=strfunc(sizeovstring);

כאשר

	int sizeovstring;
char**r;

וזו הגדרת הפונקציה:

char**strfunc(int sizeovstring){

sizeovstring-אמור להיות מספר המחרוזות שברצונו של המשתמש להקליד.

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

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

אני מבין אז למה לא להשתמש ב-string ו-vector, אבל כן יותר נכון להשתמש ב-new במקום malloc. נו, שוין.

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

אתה מקצע מערך של sizeovstring מצביעים, כלומר הוא יכיל sizeovstring מחרוזות. איברי המערך לא מאותחלים לכלום בשלב הזה. גם את איברי המערך אתה צריך לאתחל (באמצעות malloc או new). יש מבין?

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

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

char**strfunc(int sizeovstring){
char**temp;
int i,flag;
char *tempf1;
temp=(char**)malloc(sizeovstring*sizeof(char*));
for(i=0;i<sizeovstring;i++){
cout<<"Enter string"<<endl;
cin.getline(temp[i],sizeof(char*));

}


do{
flag=0;
for(i=0;i<(4);i++){
if (strcmp(temp[i],temp[i+1])==1){
tempf1=temp[i];
temp[i]=temp[i+1];
temp[i+1]=tempf1;
flag=1;
}
}
}while(flag==1);

return temp;


}

מצטער, אך לא הבנתי מה אמרת שיש לעשות.

איך מאתחלים מערך באמצעות מלוק?

איך יש להקצות את המערך?

תודה רבה!

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

אוקי, התוכנית שלך כמעט סבבה, למעט שתי בעיות:

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

לפני שאתה יכול לעשות getline לתוך [temp[i, אתה צריך לדאוג ש-[temp[i יצביע לאיזשהו מערך תקני של char. את המערך הזה אתה צריך גם להקצות באמצעות malloc (הגודל שלו צריך להיות הגודל המקסימלי של מחרוזת שאתה מרשה שהמשתמש יכניס + 1).

ב. הטעות השנייה היא שהפרמטר השני שאתה מעביר ל-getline צריך להיות גודל המערך שאותו הקצית ב-א'.

תעשה את זה ואז הקוד יעבוד.

כמובן, בסוף התוכנית תזכור לשחרר את כל הזכרון שהקצית באמצעות free.

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

אוף!

זה פשוט לא הולך לי.

בבקשה תראה לי דוגמא למה אתה מתכוון.

איך אני עושה שהנ"ל יצביע למערך תקני של צ'אר והגודל המקסימלי נקבע ע"י המשתמש-תלוי מה הוא מכניס.

ואת ב ניסיתי לעשות

cin.getline(temp[i],sizeovstring); 

וזה נדפק לגמרי....

בבקשה תראה לי דוגמא

תודה רבה.

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

char**strfunc(int sizeovstring){
char**temp;
int i,flag;
char *tempf1;
temp=(char**)malloc(sizeovstring*sizeof(char*));
for(i=0;i<sizeovstring;i++){
cout<<"Enter string"<<endl;
cin.getline(temp[i],sizeof(char*));
}
do{
flag=0;
for(i=0;i<(4);i++){
if (strcmp(temp[i],temp[i+1])==1){
tempf1=temp[i];
temp[i]=temp[i+1];
temp[i+1]=tempf1;
flag=1;
}
}
}while(flag==1);

for(i=0;i<5;i++){
cout<<temp[i]<<endl;
}

return temp;


}
int main(){
int sizeovstring;
char**r;

cout<<"Enter Length of strings"<<endl;
cin>>sizeovstring;
r=strfunc(sizeovstring);

}

sizeovstring-גודל שהפונקציה מקבלת ויוצרת מערך תווים בגודל זה וקולטת למערך זה מחרוזות

לאחר מכן הפונקציה ממיינת את המחרוזות לפי הסדר מדפיסה את המערך ומחזירה את המערך

לתוכנית הראשית

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

:facepalm:

זה הקוד שכבר העלית!

תעלה את הקוד אחרי התיקון שניסית לעשות.

אני חוזר ואומר:

לפני שאתה יכול לעשות getline לתוך [temp[i, אתה צריך לדאוג ש-[temp[i יצביע לאיזשהו מערך תקני של char. את המערך הזה אתה צריך גם להקצות באמצעות malloc (הגודל שלו צריך להיות הגודל המקסימלי של מחרוזת שאתה מרשה שהמשתמש יכניס + 1).

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

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

והצבעתי מכל תא במערך המצביעים למערך החדש

אז התוכנית לא נופלת

אך גם לא עושה את מה שצריך

התקדמנו קצת(:

char**strfunc(int sizeovstring){
char**temp;
int i,flag;
char*tem;
char *tempf1;
tem=(char*)malloc((sizeovstring+1)*sizeof(char));
for(i=0;i<(sizeovstring+1);i++){
tem[i]='\0';
}

temp=(char**)malloc(sizeovstring*sizeof(char*));
for(i=0;i<(sizeovstring);i++){
temp[i]=tem;
}
for(i=0;i<sizeovstring;i++){
cout<<"Enter string"<<endl;
cin.getline(temp[i],sizeovstring);
}
do{
flag=0;
for(i=0;i<(4);i++){
if (strcmp(temp[i],temp[i+1])==1){
tempf1=temp[i];
temp[i]=temp[i+1];
temp[i+1]=tempf1;
flag=1;
}
}
}while(flag==1);

for(i=0;i<5;i++){
cout<<temp[i]<<endl;
}

return temp;


}
int main(){
int sizeovstring;
char**r;

cout<<"Enter Length of strings"<<endl;
cin>>sizeovstring;
r=strfunc(sizeovstring);

}

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

כי עכשיו כל האיברים ב-temp מצביעים לאותו מערך בדיוק. מה הרווחת כאן?

כל איבר של temp צריך להצביע למערך אחר.

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

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

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

אז לפי דבריך, יוצא שלכל temp[i[ צריך שיהיה לו מערך משלו, איך אני יכול ליצור כל-כך הרבה מערכים? הרי אם לדוגמא המשתמש הכניס שהוא רוצה לרשום 10 מחרוזות.

אז יווצר לי מערך של מצביעים שהוא של 10

אז לכל אחד כזה אני אמור ליצור מערך משלו ולהצביע מ temp על המערך הזה

איך עושים דבר כזה?(שלכל תא בדינאמי יהיה מערך משלו)

תודה רבה.

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

סליחה, שכחתי להעתיק את תחילת השאלה

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

כמו כן על התכנית למיין אותם לפי סדר מילוני ולהדפיס שנית.

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

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

ארכיון

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

×
  • צור חדש...