ווטסאפ - לינוקס, BSD, קוד פתוח ותוכנה חופשית בעברית. Whatsup - Linux, BSD, open source and free software in Hebrew

 
 
  כניסת חברים · רישום · שכחתי סיסמה  
tux the penguin
תגובה לנושא
צפיה בנושא הבא Printable version התחבר כדי לבדוק הודעות פרטיות צפיה בנושא הקודם
אורח · ·
 

הודעה פורסם: 20/06/2018 - 12:49
נושא ההודעה: הקוד מחזיר שגיאה

קוד:

 'c_box' does not name a type


קוד:
#include<iostream>
#include<vector>
using namespace std;

class box {
      public:
      int hor
         ,ver;
};
     box c_box;
     c_box.hor = 1;
     c_box.ver = 1;
int main (){
}

איפה הבעיה?
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
אורח · ·
 

הודעה פורסם: 20/06/2018 - 12:59
נושא ההודעה:

הרכזה צריכה להיות בתוך ה פונקציה.

קוד:
class box {
      public:
      int hor:
        int ver;
};

int main (){
     box c_box;
   
     c_box.hor = 1;
     c_box.ver = 1;
}
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
אורח · ·
 

הודעה פורסם: 20/06/2018 - 17:45
נושא ההודעה: מה האפליה

מה האפליה שאפשר להכריז אבל אי אפשר להשתמש בממברס?
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
צפריראורח · ·
 

הודעה פורסם: 21/06/2018 - 07:00
נושא ההודעה:

מחוץ לפונקציות לא יכול להיות קוד. אתה עדיין יכול להקצות שם זכרון: אתה יכול להגדיר באיזה מקום יישב המשתנה c_box (ואצלך הוא גלובלי לכל התוכנית ואפילו לא סטטי לקובץ, שזה גם לא דבר מומלץ). אבל רק פונקציות מגדירות מה עושים איתו.
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
אורח · ·
 

הודעה פורסם: 21/06/2018 - 15:39
נושא ההודעה:

לא רק הגדרה אלא גם אתחול סטטי (שמגיע עם ההגדרה) מותרים מחוץ לפונקציה. בC++ זה כולל גם אתחול באמצעות קונסטרקטור, יש הטוענים שזה לא מומלץ.
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
אורח · ·
 

הודעה פורסם: 22/06/2018 - 16:11
נושא ההודעה:

Anonymous :
לא רק הגדרה אלא גם אתחול סטטי (שמגיע עם ההגדרה) מותרים מחוץ לפונקציה. בC++ זה כולל גם אתחול באמצעות קונסטרקטור, יש הטוענים שזה לא מומלץ.


אבל הוא לא עשה איתחול סטטי .
אתחול סטטי יראה כך :
קוד:

#include<iostream>

#include<vector>

using namespace std;



class box {

      public:

      int hor

         ,ver;

};

static box c_box = {1,1};

int main (){
   return 0;
}


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

הודעה פורסם: 24/06/2018 - 08:47
נושא ההודעה:

Anonymous :
Anonymous :
לא רק הגדרה אלא גם אתחול סטטי (שמגיע עם ההגדרה) מותרים מחוץ לפונקציה. בC++ זה כולל גם אתחול באמצעות קונסטרקטור, יש הטוענים שזה לא מומלץ.


אבל הוא לא עשה איתחול סטטי .
אתחול סטטי יראה כך :
קוד:

#include<iostream>

#include<vector>

using namespace std;



class box {

      public:

      int hor

         ,ver;

};

static box c_box = {1,1};

int main (){
   return 0;
}


(שים לב לסינטקסט), שימוש בממבר בצורה שהוא עשה דורש זמן ריצה .

בהנחה שמדובר במשתנה אחד שאמור להיות מוצב (שלא כמו בתוכנית כאן שיש 2) , איתחול בקונסטרקטור, צורך פחות זמן ריצה מאתחול רגיל?
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
אורח · ·
 

הודעה פורסם: 24/06/2018 - 09:48
נושא ההודעה:

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

הודעה פורסם: 26/06/2018 - 12:06
נושא ההודעה:

Anonymous :
לא רק הגדרה אלא גם אתחול סטטי (שמגיע עם ההגדרה) מותרים מחוץ לפונקציה. בC++ זה כולל גם אתחול באמצעות קונסטרקטור, יש הטוענים שזה לא מומלץ.


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

הודעה פורסם: 26/06/2018 - 17:55
נושא ההודעה:

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

הודעה פורסם: 26/06/2018 - 21:48
נושא ההודעה:

Anonymous :
הקומפיילר יכול לדאוג לביצוע קונסטרקטור לפני הפונקציה הראשית. כאמור, זה לא מומלץ


ואם הקוד מצוי ב- shared library מה יקרה? היישום שטוען את הספרייה, איך הוא יקרא לקוד האיתחול הזה?

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

הודעה פורסם: 27/06/2018 - 09:20
נושא ההודעה:

ירחמיאל :
Anonymous :
לא רק הגדרה אלא גם אתחול סטטי (שמגיע עם ההגדרה) מותרים מחוץ לפונקציה. בC++ זה כולל גם אתחול באמצעות קונסטרקטור, יש הטוענים שזה לא מומלץ.


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


איתחול בקונסטרטור לא יכול להיות מחוץ לבלוק (פונקציה), יש הבדל מאוד ברור בין הכרזה ואיתחול (זה למה אתה רואה איתחול סטטי בקוד ישן מחוץ ל class.
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
ירחמיאלאורח · ·
 

הודעה פורסם: 27/06/2018 - 18:01
נושא ההודעה:

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


איתחול בקונסטרטור לא יכול להיות מחוץ לבלוק (פונקציה),


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

הרצתי את הקוד הבא:

קוד:

#include <stdio.h>

int calculate() {
  return 111;
}

class Obj {
  public:
  int a;
  Obj(int _a) { a = _a * 222; }
};

Obj z(666);

int result = calculate();

int result_2 = result + 777;

int main() {
  printf("%d\n", result_2);
  return 0;
}


והוא מדפיס "888". מגניב, לא?

(אולי היכולת הזו היא הרחבה של GNU ולא קיימת ב-C++ סטנדרטי?)

בחנתי את פלט האסמבלי, בעזרת:

קוד:

c++ -O0 -S a.cpp


ואני רואה שהמהדר שם את הקוד שמאתחל את סגמנט הנתונים בפונקציה נפרדת (בשם _Z41__static_initialization_and_destruction_0ii). אבל אני לא רואה איפה קוראים לפונקציה הזו. הפונקציה main לא קוראת לה. אולי הלינקר איכשהו יודע לקרוא לפונקציה הזו? מעניין איך זה מתבצע...
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
אורח · ·
 

הודעה פורסם: 27/06/2018 - 19:20
נושא ההודעה:

הקוד שלך לא תקני בעליל (זה לא C ולא C++).
ואתה לא מנסה לגשת למידע (בשונה ממקודם):


אתה צריך להבין את ההבדל בין :
קוד:

Obj z(666);

ל:
קוד:

Obj z(666);
z.a = 666;


Declaration , Definition ו Initialization

וכמובן http://www.informit.com/articles/article.aspx?p=1852519

ולשואל המקורי :

קוד:
struct box  { int x; int y; int z; };
box  c_box{.x = 1, .z = 2};
 
   
תגובה  עם ציטוט חזרה למעלה
חזרה לתוכן הדיון
הצגת הודעות מלפני:     
מעבר אל:  
כל הזמנים הם GMT + 2 שעות
תגובה לנושא
צפיה בנושא הבא Printable version התחבר כדי לבדוק הודעות פרטיות צפיה בנושא הקודם
PNphpBB2 © 2003-2004 

תוכן הדיון

  1. אורח
  2. אורח
  3. אורח
  4. אורח [צפריר]
  5. אורח
  6. אורח
  7. אורח
  8. אורח
  9. אורח [ירחמיאל]
  10. אורח
  11. אורח [ירחמיאל]
  12. אורח
  13. אורח [ירחמיאל]
  14. אורח