עבור לתוכן

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

Featured Replies

פורסם

הקבוצה היא משתנה ששמו A?

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

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

לא הבנתי....

אז איך אני יכול מקלט כזה:read_set A,2,4,12,54,-1

להכניס לתוך קבוצה A את המשתנים?

A היא מערך של char בגודל 16

פורסם

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

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

פורסם
  • מחבר

הצלחתי לפרק את הstring שהמשתמש הכניס

אני צריך בבקשה הסבר איך בונים ''מילון'', זאת אומרת למשל יש לי "char *b= "abcd אני צריך לקרוא לפונקציה abcd

יש אופציה לעשות switch ב-C למצב כזה?

תודה.

פורסם

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

פורסם
  • מחבר

תודה, אני אנסה ככה.

פורסם

בבקשה.

חוץ מזה, יש כמה דרכים די פשוטות לממש "מילון" פשוט ב-C. דרך אחת היא ליצור struct עם שני שדות - שם של האובייקט והאובייקט עצמו, ואז פשוט להחזיק מערך של ה-struct הזה. כשאתה מקבל מחרוזת אתה פשוט צריך לרוץ על המערך ולחפש את האובייקט עם השם המתאים. זה אמנם פתרון לא יעיל במיוחד, אבל כשמדובר ברשימה קטנה ופשוטה זה לא ממש משנה.

פורסם
  • מחבר

זה מה שעשיתי.



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}

};


אני בודק את הקלט הרלוונטי מהמשתמש בעזרת strcmp

ואז אני נתקל בבעיה....

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

פורסם
  • מחבר

הצלחתי בסוף....הייתי צריך להוסיף * לפונקציה שמקבלת את ה set

איך אני יכול לבדוק אם הפעולה של הדלקת הביט עובדת?

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



void setbit(set *s, int i){

char b;

int j;

j=i;

b=b|1;

i=8%i;

b=b<<i;

*s[j/8]=*s[j/8]|b;

}

אם אני מוריד את השיוויון הקומפיילר פשוט מדלג על זה.

פורסם

שלוש הערות:

1. שים לב שאתה משתמש ב-b בלי שיש בו ערך כלשהו.

2. במקום לעשות x = x | y אתה יכול פשוט לעשות x |= y.

3. אתה משתמש במודולו לא נכון.

פורסם
  • מחבר

תודה. סידרתי

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

יש דרך פשוטה לעשות את זה או שצריך לעבור על כל המערך של הקבוצה ולספור כל ביט שדלוק עד שמגיעים לביט ה127?

זה פשוט לא נראה לי יעיל..

פורסם

אין דרך יותר יעילה, אבל לולאה באורך 128 זה ממש לא דבר כבד.

פורסם
  • מחבר

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

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

ב- שאני משתמש ב strcmp למרות שלפי הקומפיילר שניהם למשל "a" עדיין זה לא שווה ל 0 למרות שזה אמור להיות.



int x=0,i=0,j=0;

char *y,*c,*z;

y=strtok(NULL,",");//group name from string

c=sets[i].name; //group name from sets

while(strcmp(y,c)!=0&&i<13){//check if thr name equal

i++;

c=sets[i].name;

}

if(strcmp(y,c)!=0){

printf("No such group");

return;

}else{

z=strtok(NULL,",");//find num char

x=strtol(z,NULL,0);//convert to int

while(x!=-1&&x<=127){//-1=end of string

set *s=sets[i].s;

char b=0;

int j=x;

B|=1;

x=x%8;

b<<=x;

j=j/8;

*s[j]|=b;
z=strtok(NULL,",");
x=strtol(z,NULL,0);

}

if(x>127){

printf("%d is out of range",x);

return;

}

}

}
void read_set(){

פורסם

strcmp היא case sensitive. כלומר a ו-A הם לא אותו דבר.

חוץ מזה, למה אתה לא משתמש בפונקציה setbit שכתבת קודם?

פורסם
  • מחבר

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

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

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

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


printf("%d,",d);
d++;
*s[j]>>=1
if(*s[j]&=1==1){

d זה int שרץ עד ל 127

ארכיון

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

דיונים חדשים