בעיה מוזרה בשפת C

ogispan

New member
בעיה מוזרה בשפת C

אני מצרף קובץ של תוכנית שכתבתי ב VISUAL C התוכנית הראשית קוראת לפונקצייה בשם HASHING, וכאשר זאת מסתיימת לרוץ, היא קוראת לעוד פונקציה בשם MAKE_ARR. בדקתי בדיבאגר, ואין שום שגיאה בפונקציה HASHING, אולם הפונקציה MAKE_ARR אינה מתבצעת... כאילו שהמחשב פשוט מדלג על הקריאה ל MAKE_ARR מישהו בבקשה יכול לבדוק לי מה בדיוק הבעיה? אודה לכם מאוד!!! (לשנות את הסיומת ל CPP)
 

hope2drive

New member
אי אפשר לשמור את הקובץ שלך

למה הפכת אותו לפורמט תמונה? תעלה אותו בתור txt או פשוט תדביק את התוכן שלו בהודעה (עם שימוש בתחילת וסיום קוד)
 

ogispan

New member
הנה הקוד

//Made By - Ofir Gispan //I.D - 040185167 //26/04/2004 #include <string.h> #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <math.h> #include <iostream.h> #include <iso646.h> #include <math.h> struct table { char info; int visited; long times; table *next; }; //*********************************make_arr**************************************// void make_arr(table *hash) { long arr[300]; int i,counter=0; table *helper; for (i=0;i<=39;i++) { if (hash.visited!=0) { helper=&hash; while (helper->visited==1) { arr[counter]=helper->times; counter++; helper=helper->next; } } } for(i=0;i<=counter;i++) cout<<"ofir"; //this cout does not apear!!!!!!!! } //*********************************make_new**************************************// table *make_new() { table y; y.times=y.visited=0; return(&y); } //**********************************hashing file******************************// void hashing() { table hash[40],*helper; FILE *fin; char chr,chr1; int mod,i,flag=0; int counter; for (i=0;i<=40;i++) hash.visited=hash.times=0; fin=fopen("dugma.txt","r"); while (!feof(fin)) { chr1=fread(&chr,sizeof(chr),1,fin); if (!feof(fin)) { mod=chr%40; helper=&hash[mod]; while (helper->visited==1) { if (helper->info==chr) { helper->times++; flag=1; helper=helper->next; } else helper=helper->next; } if (flag==0) { helper->info=chr; helper->times=helper->visited=1; helper->next=make_new(); counter++; } else flag=0; } } for (i=0;i<=3;i++) { if (hash.visited!=0) { helper=&hash; while (helper->visited==1) { cout<<helper->info<<'='<<helper->times<<endl; helper=helper->next; } } } make_arr(hash); fclose(fin); } //*********************************main******************************************// void main() { hashing(); }
 

ogispan

New member
שימו לב....

לשורה שמכילה את המשפט // this cout does not apear!!!!!! עשיתי את השורה הזאת כדי לראות אם התוכנית ביכלל מגיעה אליו... בפלט אין שום איזכור למילה OFIR ככה שהמחשב ביכלל לא מגיע לשורה הזאת....
 

hope2drive

New member
לשורה הזאת הוא לא מגיע

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

ogispan

New member
או קיי...

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

vinney

Well-known member
מתי שמת לב שהוא לא מדפיס?

בסיום ריצת התוכנית, אחרי שהיא הסתיימה? או תוך כדי הריצה?
 

ogispan

New member
בסיום התוכנית

בחלון הפלט. אני רואה שהשורה שלי לא מופיעה ביכלל.... כשעשיתי דיבגר, ראיתי שהוא מגיע לשורה COUT, עובר לשורה הבאה PRINTF ורק אותה מדפיס
 

ogispan

New member
מה זה FLUSH?

איך זה אמור להראות ביכלל? אתה יכול לתת לי דוגמא של COUT עם FLUSH? שאני אראה למה אתה מתכוון?
 

vinney

Well-known member
דעה אישית

הלולאה while (helper->visited==1) לא עוצרת בזמן (אם בכלל).
 

annefan

New member
כמה הערות

א. ויני צודק:
while (helper->visited==1)​
לא יוצא משם. ב. יש לך בעיה אחרת ב-make_new. אתה מחזיר מהפונקתיה מצביע למשתנה שיוצא מה-scope, כלומר מצביע לזבל. ג. מה הקומפיילר שלך? אתה אמור לקבל warning על ב. ד. איזו שפה זו? C או ++C?
 
למעלה