עבור לתוכן

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

Featured Replies

פורסם
  • מחבר

קראתי אבל אני עדיין לא מבין למה.

אחרי שאני ''שולף'' את האות הפונקציה מצביע לNULL אבל האות קיימת אצלי במשתנה

אז אי אפשר להשתמש בפונקציה הזאת להוציא מהקלט הזה את האות האחרונה?

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

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

פורסם
  • מחבר

זה מוסיף לי אחרי ה'a' " ואז מופיעים הפקודות שכתבתי לפני.

פורסם
  • מחבר

סדרתי את זה בעזרת:



g[strlen(g) - 1] = '\0';

מקווה שזה לא יעשה בעיות בהמשך

פורסם
  • מחבר

ברגע שמבצעים פעולת הזזה של ביט : s>>=1לא ניתן להשתמש בו שוב?

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

פורסם

אני מציע לך שתעשה חזרה על אופרטורים ותבין מה ההבדל בין אופרטור & ואופרטור =&.

פורסם
  • מחבר

קראתי שוב...

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

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

אם הבנתי נכון כאשר אני רוצה לבדוק ביט אחד שמאלה אני עושה :b>>1 ואז אם b היה למשל: 00000101 הוא ניהיה 00000010

ואז אני עושה בדיקה b&1==1

לא ככה?

פורסם

אתה יודע, מותר לשלב יותר מאופרטור אחד בביטוי. אתה לא חייב להגדיר משתנה, להפעיל עליו <<, לשמור את התוצאה במשתנה חדש, ואז להפעיל על זה &. אפשר לעשות הכל בשורה אחת פשוטה וברורה.

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

פורסם
  • מחבר

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

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



for(i=0;i<=12;i++){

k=0;

B|=*s[i];

while(k<=7){

if(b&1==1){

printf("%d,",d);

d++;

k++;

j++;

b>>=1;

if(j==16){

printf("/n");

j=0;

}

}else{

d++;

k++;

b>>=1;

}

}

}

אני יודע שזה שהקוד לא אלגנטי..

פורסם

מאקרו? מי אמר בכלל לכתוב מאקרו?

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

כמו שאמרתי קודם: כתוב את שלוש הפונקציות הנ"ל (הוספת מספר לקבוצה, הוצאת מספר מקבוצה, בדיקה האם מספר בקבוצה). כתוב main שבודק שהן עובדות (אל תתעצל - בדוק כל מיני מקרים, גם מספרים קטנים וגם גדולים, תכניס הרבה מספרים ולא רק אחד, וכן הלאה). אחרי שאתה יודע שהן עובדות, אתה יכול להשתמש בהן ולהיות בטוח ב-99% שהן בסדר, ואם יש לך באג אז הבאג הוא לא בהן.

פורסם
  • מחבר

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

אבל עדיין זה מוצא לי מספרים בתאים שבכלל לא נגעתי בהם אני מכניס לפונקציה 1,2,3,4 וזה מוצא לי אותם ומוסיף לי 86,87

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

פורסם

האם כתבת את כל שלוש הפונקציות?

האם בדקת את שלושתן?

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

אם כן, תעלה לכאן את הקוד שלך.

פורסם
  • מחבר

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



void print_set(){

set *b;

int k=0;

b=checkname();//b-point to the group

for(int i=0;i<128;i++){

if(checkbit1(b,i)==1){

printf("%d,",i);

k=1;

}

}

if(k==0){

printf("the group is empty\n");

}

printf("\n");

} int checkbit1(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;

}

}


פורסם

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

פורסם
  • מחבר

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



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;

}

ארכיון

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

דיונים חדשים