Whatsup - לינוקס, תוכנה חופשית וקוד פתוח בעברית

תמיכת לינוקס כללית - משתנה כאתחול גודל מערך סטטי.

Anonymous - 26/11/2017 - 13:49
נושא ההודעה: משתנה כאתחול גודל מערך סטטי.
1.
בספר לימוד של ++C אני קורא את הפסקאות הבאות בהקשר של המספר באתחול גודל מערך סטטי.
ו:
קוד:
The value within the square brackets must be a constant value determined at compile time. It can be a literal value or a
symbolic constant, but it cannot be a variable.

וכן:
קוד:

Static arrays have sizes determined at compile time, while the size of dynamic arrays may be supplied at run time, if necessary.

בפועל אני מצליח לאתחל משתנים במערכים סטטיים ללא כל בעיה, יש למישהו הסבר?


2.
האם יש דרך להשתמש בלולאה מבוססת טווח, על מערך דינאמי?
Anonymous - 26/11/2017 - 15:46
נושא ההודעה:
1. אם אתה משתמש ב-gcc לקמפל את הקוד ולא מתעקש על הצמדות לתקן, הוא משתמש בהרחבה פנימית ומאפשר את זה:
http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html

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

2. אם ב-"מערך דינאמי" אתה מתכוון לסתם חתיכת זיכרון שהקצית עם malloc, אני לא בטוח, אני חושב שלא.
בדרך כלל כשרוצים מערך דינאמי ב-++C משתמשים ב-vector ואז לולאות טווח עובדות מצוין.


--לב
Anonymous - 26/11/2017 - 19:19
נושא ההודעה:
Anonymous :
1. אם אתה משתמש ב-gcc לקמפל את הקוד ולא מתעקש על הצמדות לתקן, הוא משתמש בהרחבה פנימית ומאפשר את זה:
http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html

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

2. אם ב-"מערך דינאמי" אתה מתכוון לסתם חתיכת זיכרון שהקצית עם malloc, אני לא בטוח, אני חושב שלא.
בדרך כלל כשרוצים מערך דינאמי ב-++C משתמשים ב-vector ואז לולאות טווח עובדות מצוין.


--לב

אני משתמש ב-"++g". אני מדבר על הקצאה עם new למשתנה מצביע. לגבי וקטורים אני יודע שזה עובד, וזה גם עובד בערכים סטטיים.
Anonymous - 26/11/2017 - 19:21
נושא ההודעה:
c++IST :
Anonymous :
1. אם אתה משתמש ב-gcc לקמפל את הקוד ולא מתעקש על הצמדות לתקן, הוא משתמש בהרחבה פנימית ומאפשר את זה:
http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html

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

2. אם ב-"מערך דינאמי" אתה מתכוון לסתם חתיכת זיכרון שהקצית עם malloc, אני לא בטוח, אני חושב שלא.
בדרך כלל כשרוצים מערך דינאמי ב-++C משתמשים ב-vector ואז לולאות טווח עובדות מצוין.


--לב

אני משתמש ב-"++g". אני מדבר על הקצאה עם new למשתנה מצביע. לגבי וקטורים אני יודע שזה עובד, וזה גם עובד בערכים סטטיים.

ערכים סטיטים == מערכים סטטיים
borsood - 27/11/2017 - 07:33
נושא ההודעה:
מצד אחד אתה מדבר על מערך סטטי שיכול להיות מאותחל רק מקבועים או מסטטיים.
מצד שני אתה מדבר על new שמאותחל בזמן ריצה.
תן דוגמת קוד ומה לא ברור לך.
(הערה לימודית: ב++c מודרני לא משתמשים במערכים והשימוש בהקצאת זכרון ע"י new מוגבל מאד)
Anonymous - 27/11/2017 - 08:59
נושא ההודעה: הבט בשאלה למעלה
borsood :
מצד אחד אתה מדבר על מערך סטטי שיכול להיות מאותחל רק מקבועים או מסטטיים.
מצד שני אתה מדבר על new שמאותחל בזמן ריצה.
תן דוגמת קוד ומה לא ברור לך.
(הערה לימודית: ב++c מודרני לא משתמשים במערכים והשימוש בהקצאת זכרון ע"י new מוגבל מאד)

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

אם אתה רוצה קוד בכל אופן, לגבי שאלה 1:
קוד:
int x;
cin >> x;
int y[x];

חוקי? בספר כאמור כתוב שלא חוקי, בפועל כן עובד אצלי.

לגבי שאלה 2
קוד:
int * x;
x = new int [5]
for (int z:x);

הקוד אינו חוקי. השאלה אם יש דרך כן להשתמש ב-"Range-based for loop" - על מערך דינאמי?
Anonymous - 27/11/2017 - 09:48
נושא ההודעה: Re: הבט בשאלה למעלה
c++IST :
borsood :
מצד אחד אתה מדבר על מערך סטטי שיכול להיות מאותחל רק מקבועים או מסטטיים.
מצד שני אתה מדבר על new שמאותחל בזמן ריצה.
תן דוגמת קוד ומה לא ברור לך.
(הערה לימודית: ב++c מודרני לא משתמשים במערכים והשימוש בהקצאת זכרון ע"י new מוגבל מאד)

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

אם אתה רוצה קוד בכל אופן, לגבי שאלה 1:
קוד:
int x;
cin >> x;
int y[x];

חוקי? בספר כאמור כתוב שלא חוקי, בפועל כן עובד אצלי.

לגבי שאלה 2
קוד:
int * x;
x = new int [5]
for (int z:x);

הקוד אינו חוקי. השאלה אם יש דרך כן להשתמש ב-"Range-based for loop" - על מערך דינאמי?


כדי שהקוד השני יעבוד צריך איזה איטרטור לעבוד איתו, ואין כזה מובנה בשפה ואתה לא רוצה כזה.
בשביל זה יש הרחבות
borsood - 28/11/2017 - 07:32
נושא ההודעה: Re: הבט בשאלה למעלה
c++IST :

אם אתה רוצה קוד בכל אופן, לגבי שאלה 1:

חוקי? בספר כאמור כתוב שלא חוקי, בפועל כן עובד אצלי.

לגבי שאלה 2
קוד:
int * x;
x = new int [5]
for (int z:x);

הקוד אינו חוקי. השאלה אם יש דרך כן להשתמש ב-"Range-based for loop" - על מערך דינאמי?

1. זו אכן הרחבה לא סטנדרטית של הקומפיילר שלך: gcc -Wall -Pedantic נותן לדוגמה:
קוד:
tmp.cpp:7:10: warning: ISO C++ forbids variable length array ‘y’ [-Wvla]
   int y[x];
          ^

2. בקוד שלך לפחות x אינו מערך ולכן אי אפשר להריץ לולאה מעליו. עם y זה עובד.
קוד:
  for (auto z : y) {
    cout << "z" << "=" << z << endl;
  }

Anonymous - 28/11/2017 - 08:29
נושא ההודעה: Re: משתנה כאתחול גודל מערך סטטי.
c++IST :
1.
בספר לימוד של ++C אני קורא את הפסקאות הבאות בהקשר של המספר באתחול גודל מערך סטטי.
ו:
קוד:
The value within the square brackets must be a constant value determined at compile time. It can be a literal value or a
symbolic constant, but it cannot be a variable.

וכן:
קוד:

Static arrays have sizes determined at compile time, while the size of dynamic arrays may be supplied at run time, if necessary.

בפועל אני מצליח לאתחל משתנים במערכים סטטיים ללא כל בעיה, יש למישהו הסבר?


2.
האם יש דרך להשתמש בלולאה מבוססת טווח, על מערך דינאמי?


ככל הנראה אתה מבלבל בין איתחול (init) והכרזה .

static std::array<int,3> x; זו הכרזה אבל השורה x[0] = 0; היא איתחול.

זו הסיבה שכשיש לך משתנה שהוא סטטי בstruct/class אתה מבצע איתחול מחוץ ל class (או בתוך בתוך פונקציה).

לגבי השאלה השנייה אתה צריך להכריז משהוא שייצן begin ו end ואז זה אפשרי (לפי טיפוס)
כל הזמנים הם GMT + 2 שעות