עבור לתוכן

בעיה במעבר על מערך שפת C

Featured Replies

פורסם

שלום לכולם!

הפונקציה הבאה הבאה אמורה למצוא כמה רחובות שונים קיימים

מה לא בסדר בה?

תעזרו בבקשה,מי שיכול

(זה נראה מחורבש - תעשו קופי פייסט לתוכנה וזה יסתדר)

void FindStreetCountAndMaxCountInStreet(Person *personArr[],int persons_count,int *street_count,int *max_count_in_street)

{

char **dif_names;

int i,j;

*street_count=0;

for(i=0;i<persons_count;i++)//רץ כמספר האנשים בעיר

{

for(j=0;j<=street_count;j++)//רצ כמספר הרחובות השונים-כאשר המספר גד על כל שם רחוב שונה חדש שנמצא

//אם שם הרחוב שונה מכל שאר הרחובות שמאוחסנים במערך המצביעים למחרוזות

if( strcmp(personArr->address.pStreetName,dif_names[j]) )

{

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

*street_count+=1;

// printf("\n\n\ncount = %d\n\n\n",*street_count);

//תקצה דינמית זיכרון למערך המצביעים למחרוזות

dif_names=(char**)realloc(*street_count*sizeof(char*));

//תקצה דינמית זיכרון עבור שם הרחוב שחדש שנמצא

dif_names[*street_count-1]=(char*)malloc(strlen(personArr->address.pStreetName)+1);

strcpy(dif_names[*street_count-1],personArr->address.pStreetName);

}

}

}

פורסם

תערוך את ההודעה ותכניס את קטע הקוד לתוך תגית code בצורת # שלמעלה

עד אז לא נוכל לעזור לך

פורסם

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

חוץ מזה, תנאי העצירה של הלולאה הפנימית שגוי, וגם האלגוריתם של הלולאה הפנימית שגוי.

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

פורסם

^^^

מטורפת מטורפת, אבל למה אתה לא אומר לו מה לעשות בנידון ?

פורסם

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

"אתה לא משחרר שום זכרון שהוקצה" = "אתה צריך לשחרר את כל הזכרון שהוקצה".

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

פורסם

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

פורסם

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

פורסם
  • מחבר

#שלום!

קודם כל תחדלו מלהתקוטט זהו פורום שנועד לעזור לאנשים ולא זירת התקתשויות :)

שנית לגבי הבעיה שהצגתי.

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

הפונקציה אמורה לעשות שני דברים:

1. להחזיר (by poynter) את מספר הרחובות השונים שקיימים במערך המצביעים למבנה(למשל: אלנבי,הרצל,פנקס... סה"כ 3)

2. להחזיר(כנ"ל) את המספר המקסימלי של אנשים שגרים באותו רחוב(למשל: אלנבי 1,אלנבי 45,אלנבי 234,אלנבי 23....סה"כ 4)

הפונקציה:

void FindStreetCountAndMaxCountInStreet(Person *personArr[],int persons_count,int *street_count,int *max_count_in_street)

מקבלת:

Person *personArr[] //מערך מצביעים למבנים מסוג Person//
int persons_count //מספר האנשים(בעצם מספר הבמנים)//
int *street_count //מה שהפונקציה אמורה להחזיר - מספר הרחובות השונים//
int *max_count_in_street //מה שהפונקציה צריכה להחזיר - מספר מקסימלי של אנשים שגרים באותו רחוב//

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


void FindStreetCountAndMaxCountInStreet(Person *personArr[],int persons_count,int *street_count,int *max_count_in_street)
{
int i;

*street_count=0 ;


for(i=0;i<persons_count;i++)
if(strcmp(personArr[i]->address.pStreetName,personArr[i+1]->address.pStreetName));
(*street_count)++;


printf("num = %d\n",*street_count);
}

פורסם

ערוך את הכותרת כך שתכיל את תמצית השאלה.

אני לא אבקש פעם שלישית.

חוץ מזה, אסור לשים ; אחרי if. זו כנראה הבעיה שלך.

אגב, הקוד שלך עובד רק אם כל האנשים שגרים באותו רחוב מופיעים ברצף (כלומר, אם האיש הראשון והשלישי גרים באלנבי והאיש השני גר ברחוב הרצל, אז לפי הפונקציה שלך הם גרים ב-3 רחובות שונים). חוץ מזה, שים לב שכשאתה בודק את האיש האחרון, אתה חורג מגבולות המערך.

אגב, אל תאמר "יש לי שגיאה". תאמר מהי השגיאה.

פורסם
  • מחבר

תמצית השאלה?

אני לא בטוח שאני מבין למה אתה מתכוון - אבל פירטתי מה אמורה לעשות הפונקציה.

שנית מותר לשים ; אחרי if, זה פשוט לא יבצע כלום, אכן לא שמתי לב ל ";" .

מחקתי אותם, וזוהי לא הבעיה - לדעתי הבעיה היא איכשהו בתוכן ה if, והכוונה היא ל strcmp .

שאמרתי : "אני מקבל שגיאה" אז הכוונה היא שהתוכנית רצה ללא errors למטה ומבצעת את הפונקציות שקדמו עד לפונקציה הבעייתית.

תוכן ההודעה שאני מקבל :unhandled exception in filename.exe:0X0000005:access volation

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

תודה

פורסם

תמצית השאלה - משהו בסגנון "בעיה עם מעבר על מערך ב-C", או משהו כזה.

כמו שאמרתי, הבעיה היא שאתה חורג מגבולות המערך. כשאתה בא לטפל באיש האחרון במערך (כלומר i==persons_count-1), הגישה ל-[personArr[i+1 חורגת מגבולות המערך.

פורסם
  • מחבר

תודה רבה!!!

שקלתי לקפוץ מהחלון, עכשיו אשנה את דעתי.

אחלה פורום, עונים על שאלות בצורה טובה ומהירה!

חזק ואמץ

פורסם
  • מחבר

אם כוונתך ל"שפת C" - אז אין לי מושג איך לשנות את זה עכשיו

ארכיון

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

דיונים חדשים