עבור לתוכן

הגדרת טיפוס ב typedef ב C

Featured Replies

פורסם
  • מחבר

לא יודע איך הגעתי ל12....תוקן

עשיתי פונקציה שמאפסת.עם לולאת for

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

יכול להיות שפה הבעיה?



int checkbit(set *s,int num){

char b=0;

int i;

i=num;

i=i/8;

num=num%8;

B|=*s[i];

if(b>>num&1==1){

return 1;

}else{

return 0;

}

}

  • תגובות 126
  • צפיות 11k
  • נוצר
  • תגובה אחרונה
פורסם

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

(אגב, כמו שאמרתי כבר קודם, המימוש שלך ממש מסורבל והיה אפשר להחליף אותו בשורת קוד אחת די פשוטה)

איך בדיוק בדקת את התכנית?

האם שמת breakpoint בשורה הראשונה של print_set ובדקת מה המערך מכיל שם?

פורסם
  • מחבר

אני לא יודע אם הבדיקה שאני עושה טובה.

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

אבל שזה מגיע לבדיקת ביט


if(b>>num&1==1)

זה מוצא ביט דלוק למרות שהתא במערך מראה 0 והוא אמור להיות מאותחל.

אני שעות מריץ את הקומפיילר ובודק צעד צעד ולא מוצא למה זה קורה.

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

פורסם
  • מחבר

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

פורסם

לאופרטור == יש קדימות על פני אופרטור &.

תשתמש בסוגריים.

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

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

איך לכתוב הכל בשורת קוד אחת? נתחיל מזה שכשאתה רוצה לשים ערך כלשהו במשתנה ואז לעשות עליו חישוב, אתה לא חייב לעשות את זה בשלוש שורות. לדוגמה, בפונקציה 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. אז פה אותו דבר בדיוק.

פורסם

במקום

int i;
i=num;
i=i/8;
num=num%8;

תכתוב:


int i = num/8;
num %= 8;

פורסם
  • מחבר

זה לא פתר את הבעיה....אבל תודה על ההסבר

פורסם

לשם הנוחות - אתה יכול להדביק כאן את הקוד בשלמותו כולל ההצהרות?

פורסם
  • מחבר



#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#define SIZE 16

typedef 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;

B|=1;

i=i%8;

b<<=i;

*s[j]|=b;

}

 

int checkbit(set *s,int num){

char b=0;

int i=num/8;

num%=8;

B|=*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;

}



פורסם

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

אז זה אומר שיש לך באג ב-setbit ו/או checkbit. אז תדבג אותן ספציפית ותנסה להבין מה הבעיה.

(רמז: קדימות אופרטורים. כמו שאמרתי, אם אתה לא יודע מה קודם למה, תשתמש בסוגריים)

פורסם
  • מחבר

אני לא מצליח למצוא שם בעיה...

זה בסדר?



if(((b>>num)&1)==1){

פורסם
  • מחבר

b מכיל :



B|=*s[i]

פורסם

:facepalm:

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

פורסם
  • מחבר

מופיע שם 1 ו 1- אין לי מושג למה. (למרות הרמז)

ארכיון

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

דיונים חדשים