לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #1  
ישן 01-11-2008, 20:52
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
(שפת C) להקצות מקום למערך חד-מימדי מסוג char * ?

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

קוד:
char *arr[] = { "Sunday", "Monday" /* etc. */ };

האם הדרך הנ"ל נחשבת "חוקית"\"תקנית"\"מקובלת"?

הרי אני יודע שכאשר משתמשים במצביע, חובה להקצות לו מקום לפני הכנסת מידע (ומנגד, כאן אני לא מקצה מקום למחרוזות של הימים).
משום מה כאשר הצהרתי על המערך הסטטי הנ"ל וכתבתי את הקוד הבא:
קוד:
for (i=0; i<7; ) printf("%s", arr[i++]);

זה עבד טוב, לא היו בעיות כלל.

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

שאלה בנושא אחר:
איפה ב-VS אני יכול ליצור פרויקט שיתקמפל לפי תקן C90 ?
יש שם כל מיני אפשרויות ואני לא מבין בהם בכלל...

תודה רבה!

נערך לאחרונה ע"י dorM בתאריך 01-11-2008 בשעה 20:55.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #4  
ישן 02-11-2008, 00:59
  rtasjugythh rtasjugythh אינו מחובר  
 
חבר מתאריך: 08.10.08
הודעות: 177
בתגובה להודעה מספר 1 שנכתבה על ידי dorM שמתחילה ב "(שפת C) להקצות מקום למערך חד-מימדי מסוג char * ?"

ציטוט:
במקור נכתב על ידי dorM
אני רוצה ליצור מערך המכיל את שמות הימים, לדוגמא, ואני עושה זאת באופן הבא:

קוד:
char *arr[] = { "Sunday", "Monday" /* etc. */ };

האם הדרך הנ"ל נחשבת "חוקית"\"תקנית"\"מקובלת"?


זה חוקי ותקני. השאלה היא האם זה עושה את מה שאתה רוצה. char הוא מערך של מצביעים. המערך מאותחל להצביע לכתובות של המחרוזות "Sunday", "Monday" וכו'.


ציטוט:
במקור נכתב על ידי dorM
הרי אני יודע שכאשר משתמשים במצביע, חובה להקצות לו מקום לפני הכנסת מידע (ומנגד, כאן אני לא מקצה מקום למחרוזות של הימים).
משום מה כאשר הצהרתי על המערך הסטטי הנ"ל וכתבתי את הקוד הבא:
קוד:
for (i=0; i<7; ) printf("%s", arr[i++]);

זה עבד טוב, לא היו בעיות כלל.


כשאתה עובד עם מצביע, ברגע שיצרת אותו הקצית לו מקום. התכוונת להגיד זה שחובה שהמצביע יצביע לזיכרון שהוקצה גם הוא, ובמקרה שאתה לא משתמש בזיכרון של מישהו אחר, אתה חייב להקצות לו מקום. לדוגמה:
קוד:
int *pi = 0; // *pi = 5 // is illegal, since pi doesn't point to a valid int pi = (int*)malloc(sizeof(int)); *pi = 12; free(pi);

כאן אני מקצה זיכרון ל-int, שם את הכתובת של הזיכרון הזה ב-pi ועובד איתו.
אצלך יש מערך (arr[]‎) של מצביעים (char*‎). הגודל של המערך שלך הוא 7*4=28 בתים. זה משתנה שהגדרת וההגדרה שלו מקצה לו זיכרון.
את המערך איתחלת עם הכתובות של המחרוזות "Sunday", "Monday" וכו'. כל מחרוזת שאתה כותב בקוד C שלך שייכת לאחד משני מקרים: אתחול של מערך של תווים (לא המקרה שלך), וכל מקרה אחר. בכל מקרה אחר היא הופכת למערך אנונימי של תווים שמאוחסן היכנשהו בזיכרון. אז כאן יש לנו שבעה מערכים אנונימיים של תווים שמאוחסנים היכנשהו בזיכרון, ובתוך arr[]‎ נמצאות הכתובות שלהם. הזיכרון לכל מחרוזת תווים מהסוג השני מוקצה ברגע שכותבים אותה בקוד.
למען השלמות נציין שהמקרה הראשון הוא רק כשכותבים משהו כזה:
קוד:
char string[] = "string";

כשכותבים, לדוגמה:
קוד:
char *string = "string"

מדובר כבר במקרה השני - יש מצביע בשם string שמצביע למערך תווים אנונימי שהתוכן שלו הוא "string". (ו-NULL בסוף)

ציטוט:
במקור נכתב על ידי dorM
שאלה נוספת:
האם בקוד הנ"ל (של ההצהרה על המערך),
מה שאני עושה זה מצביע אחד ל-X איברים במערך שהוא מצביע על ה-char הראשון באיבר הראשון,
או,
שזה X מצביעים כמספר איברי המערך, וכל אחד מהם מצביע על ה-char הראשון בכל איבר שבמערך?


מה שאתה עושה, כמו שכתבתי למעלה, זה מערך אחד בשם arr[]‎ בגודל 28 בתים שמכיל 7 מצביעים, שכל אחד מהם מצביע לתו הראשון של המחרוזות שיצרת.

ציטוט:
במקור נכתב על ידי dorM
שאלה בנושא אחר:
איפה ב-VS אני יכול ליצור פרויקט שיתקמפל לפי תקן C90 ?
יש שם כל מיני אפשרויות ואני לא מבין בהם בכלל...


אא"כ אתה משתמש בגרסה מאוד ישנה של VS, הקוד שלך מתקמפל בצורה שדי תואמת את C89/C90. תמיכה ב-C99 לא נראה שיש כוונה להוסיף.

ציטוט:
במקור נכתב על ידי dorM
תודה רבה!

תודה לך.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 06:45

הדף נוצר ב 0.06 שניות עם 10 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר