פורסם 2012 במאי 2213 שנים מחבר לא יודע איך הגעתי ל12....תוקן עשיתי פונקציה שמאפסת.עם לולאת for בדקתי מתחלת התכנית עד סופה את המערך שאמור להשתנות ואין בו שום שינוי. יכול להיות שפה הבעיה? int checkbit(set *s,int num){ char b=0; int i; i=num; i=i/8; num=num%8;=*s[i]; if(b>>num&1==1){ return 1; }else{ return 0; }}
פורסם 2012 במאי 2213 שנים אם בדקת היטב את הפונקציה בנפרד משאר התכנית, ולא ראית שיש בעיה - אז לא פה הבעיה.(אגב, כמו שאמרתי כבר קודם, המימוש שלך ממש מסורבל והיה אפשר להחליף אותו בשורת קוד אחת די פשוטה)איך בדיוק בדקת את התכנית?האם שמת breakpoint בשורה הראשונה של print_set ובדקת מה המערך מכיל שם?
פורסם 2012 במאי 2213 שנים מחבר אני לא יודע אם הבדיקה שאני עושה טובה.אני מסתכל כל הזמן על המערך שאמור להשתנות בתא שאמור להיות בו ביטים דלוקים רשום מספר כלשהו שנוצר לאחר הדלקת הביטים וכל שאר המערך נשאר על 0.אבל שזה מגיע לבדיקת ביט if(b>>num&1==1)זה מוצא ביט דלוק למרות שהתא במערך מראה 0 והוא אמור להיות מאותחל.אני שעות מריץ את הקומפיילר ובודק צעד צעד ולא מוצא למה זה קורה.כמו כן אני לא יודע איך לכתוב הכל בשורת קוד אחת (אשמח ללמוד) ולמרות שהוא מסורבל הוא אמור לעבוד.
פורסם 2012 במאי 2213 שנים מחבר עכשיו שמתי לב שאם אני מכניס מספרים שממוקמים אחרי התא הראשון אז אני לא רואה בכלל שינוי במערך..
פורסם 2012 במאי 2213 שנים לאופרטור == יש קדימות על פני אופרטור &.תשתמש בסוגריים.באופן כללי, כשאתה לא בטוח מי קודם למי, תשתמש בסוגריים.ואם היית בודק מלכתחילה את הפונקציות כהלכה, היית מוצא שהבעיה נמצאת שם (עוד לפני שהיית ניגש להדפיס את הקבוצה).איך לכתוב הכל בשורת קוד אחת? נתחיל מזה שכשאתה רוצה לשים ערך כלשהו במשתנה ואז לעשות עליו חישוב, אתה לא חייב לעשות את זה בשלוש שורות. לדוגמה, בפונקציה setbit עשית:int j;j=i;j=j/8;כשפשוט יכלת לעשות ככה:int j;j = i/8;או אפילו ישר int j = i/8.אותו דבר עבור b.אבל בעצם, אתה יוצר פה משתנים שמחזיקים ביטויים מאוד פשוטים. סתם לדוגמה, אם היית צריך לכתוב פונקציה שמגבלת שלושה פרמטרים a,b,c ומחזירה את הסכום שלהם, האם היית יוצר משתנה זמני, מוסיף לו את a, ואז את b, ואז את c, ואז מחזיר את התוצאה? לא, היית פשוט עושה return a+b+c. אז פה אותו דבר בדיוק.
פורסם 2012 במאי 2213 שנים מחבר #include <stdio.h>#include <string.h>#include <stdlib.h>#define SIZE 16typedef unsigned char set[SIZE];set A,B,C,D,E,F;void read_set();void print_set();void union_set();//void intersect_set();//void sub_set();set* checkname();int checkbit1();set* Initialize();struct{ char *name; set *s;}sets[]={ {"a",&A}, {"b",&B}, {"c",&C}, {"d",&D}, {"e",&E}, {"f",&F}, {"A",&A}, {"B",&B}, {"C",&C}, {"D",&D}, {"E",&E}, {"F",&F}, {"#",NULL}}; void setbit(set *s, int i){ char b=0; int j=i/8;=1; i=i%8; b<<=i; *s[j]|=b;} int checkbit(set *s,int num){ char b=0; int i=num/8; num%=8;=*s[i]; if(((b>>num)&1)==1){ return 1; }else{ return 0; }}set* checkname(){ char *a,*b; int i=0; a=sets[i].name; b=strtok(NULL," ,"); while(strcmp(b,a)!=0&&i<=11){ i++; a=sets[i].name; } if(strcmp(b,a)!=0){ printf("No such group\n"); return 0; }else{ return sets[i].s; } return 0;}set* Initialize(set *s){ for(int i=0;i<=15;i++){ *s[i]=0; } return s;} void func(char *s){ if(strcmp(s,"read_set")==0) { read_set(); return; } if(strcmp(s,"print_set")==0) { print_set(); return; } if(strcmp(s,"union_set")==0) { union_set(); return; } if(strcmp(s,"intersect_set")==0) { //intersect_set(); return; } if(strcmp(s,"sub_set")==0) { // sub_set(); return; } printf("No such set\n"); return ;} void read_set(){ int x=0,i=0,j=0,k=0; char *y,*c,*z; set *s; y=strtok(NULL,",");//group name from string c=sets[i].name; //group name from sets while(strcmp(y,c)!=0&&i<=11){//cheak if the name equal i++; c=sets[i].name; } if(strcmp(y,c)!=0){ printf("No such group\n"); return; }else{ z=strtok(NULL,",");//find num char x=strtol(z,NULL,0);//convert to int s=Initialize(sets[i].s); while(x!=-1&&x<=127){//-1=end of string setbit(s,x);//set the bit z=strtok(NULL,","); x=strtol(z,NULL,0); } if(x>127){ printf("%d is out of range\n",x); return; } }}void print_set(){ set *b; int k=0,j=0; b=checkname();//b-point to the group for(int i=0;i<128;i++){ if((checkbit(b,i))==1){ printf("%d,",i); k=1; j++; if(j==15){ printf("\n"); } } } if(k==0){ printf("the group is empty\n"); } printf("\n");}void union_set(){ set *a,*b,*c; int k=0; a=checkname(); b=checkname(); c=checkname(); Initialize(c); for(int i=0;i<=15;i++){ *c[i]=(*a[i]|*b[i]); } return;} int main(){ int i=1; while(i==1){ char g[100]; fgets(g,100,stdin); g[strlen(g) - 1] = '\0'; char *s=strtok(g," "); if(strcmp(s,"halt")==0){ break; } func(s); } return 0;}
פורסם 2012 במאי 2213 שנים עכשיו שמתי לב שאם אני מכניס מספרים שממוקמים אחרי התא הראשון אז אני לא רואה בכלל שינוי במערך..אז זה אומר שיש לך באג ב-setbit ו/או checkbit. אז תדבג אותן ספציפית ותנסה להבין מה הבעיה.(רמז: קדימות אופרטורים. כמו שאמרתי, אם אתה לא יודע מה קודם למה, תשתמש בסוגריים)
פורסם 2012 במאי 2213 שנים תריץ את התכנית, תשתמש בדיבאגר, תעצור את התכנית בהדפסה שלא עובדת לך נכון ותבדוק שם איזה ערך b מכיל. תנסה לחשוב למה. כבר נתתי לך רמז למה.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.