שאלה קטנה בC:

  • פותח הנושא neko
  • פורסם בתאריך

neko

New member
שאלה קטנה בC:

כתבתי בקובץ HEADER:
struct opcode { char[] name; int code; };​
והוא זרק לי שגיאה על ה[]. החלפתי ל*, יען POINTER. האם זה יפריע לי כשאח"כ אפנה לNAME כמערך? האם יש בעצם הבדל קריטי בין מערך לPOINTER שיצביע בסופו של דבר לתא ראשון במערך? האם להשאר את זה כך, או לקבוע אורך תקני (נגיד MAX_NAME) ולקבע את המערך בו?
 

tami120

New member
re

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

neko

New member
המממ... אני מניח שאני יכול לקבוע

ערך שרירותי מקסימלי. אני כותב קומפיילר+סימולטור לאסמבלר בסיסי, ולא נראה לי שמישהו ירצה להגדיר שם פעולה (ADD, MUL, SLT וכד') באורך של למעלה מ20 תוים למשל. אבל האם תהיה בעיה בהרצת התוכנית אם הSTRUCT יגדיר את זה כPOINTER, אבל בתוכנית עצמה יוגדר כמערך?
 

tami120

New member
re

אם הקצאת מקום זה צריך לעבוד אתה יכול לתת דוגמא למה התכוונת בדיוק?
 

neko

New member
אמרנו שבHEADER יש את זה:

struct opcode { char* name; int code; };​
עכשיו נגיד שכתבתי בקובץ C:
struct opcode mycode; mycode.name="add"; mycode.code=0x3;​
או למשל:
char commandAdd[MAX_COMMAND_LENGTH]="add"; struct opcode mycode; mycode.name=commandAdd; mycode.code=0x3;​
שניהם אמורים לעבוד, נכון?
 
שינהם יעבדו

כל עוד אתה לא *מניח* ש-NAME הוא מצביע לזיכרון שצריך לשחרר אותו. כלומר, אם אתה מתכנן להציב לתוך NAME מחרוזות קבועות בקוד (כמו "ADD"), אסור לך לבצע FREE על NAME. אם אתה בטוח ב-100% ש-NAME *תמיד* יצביע על שטח זיכרון דינמי, אז אתה יכול בבטחה לשחרר את NAME בעזרת FREE. בד"כ, אחריות השחרור של הזיכרון היא גם ככה שייכת למי שביצע את ההשמה/הקצאה הראשונה לתוך NAME, ולכן הוא גם אמור לדעת מה לעשות עם NAME ברגע שלא צריך אותו יותר. ישנם יוצאי דופן, אבל בלי עוד מידע על הקוד, זה מה שיש לי לומר...
 

neko

New member
שאלה אחרת לגמרי, אבל גם בC:

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

the new L

New member
אם אתה יכול

לכתוב ב c++, אני הייתי ממליץ לעשות משהו כזה:
int getHexValue(const string &strHex) { stringstream myStream(strHex); int nConverted; myStream >> setbase(16) >> nConverted; return nConverted; }​
 

eyalbd

New member
כן, תקרא את התיעוד

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

ברנדל

New member
ואם בא לך לכתוב..

INT axtoi(LPCTSTR pch) { TCHAR ch; INT n = 0; while((ch = *pch++) != 0) { if (ch >= 'A' && ch <= 'F') { ch -= 'A'; ch += 10; } else { ch -= '0'; } n = 16 * n + ch; } return n; }​
 
למעלה