ABA


"|++C| מי יכול להסביר לי למה הקוד הזה כן עובד?"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #14735 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 14735
idan192

   17:29   11.05.08   
אל הפורום  
  |++C| מי יכול להסביר לי למה הקוד הזה כן עובד?  
 
   ערכתי לאחרונה בתאריך 11.05.08 בשעה 17:32 בברכה, idan192
 
Queue.cpp

#include <iostream>
#include "Queue.h"
using namespace std;

int main(){
Queue<int> qi;

((((qi.insert(5)).insert(6)).insert(7)).remove()).insert(8);
cout << "the tail is: " << qi.tail() << endl;
while (!qi.empty()){
cout << qi.head()<< " ";
qi.remove();
}
cout << endl << "Finished" << endl;
return 0;
}


Queue.h

template <class T>
class Queue{
public:
Queue(){
top = 0;
header = 0;
array = new T[0];
}
~Queue(){*array=NULL;}
inline Queue& Queue::insert(const T num){
array[top] = (T)num;
top++;
return *this;
}
inline Queue& Queue::remove(){
array[header] = 0;
header++;
return *this;
}
inline T Queue::tail(){
return array[top-1];
}
inline T Queue::empty(){
return !(top-header);
}
inline T Queue::head(){
return array[header];
}
private:
T* array;
int header;
int top;
};


כפי שאתם רואים בקונסטרקטור, array מאותחל לגודל 0 ובכל זאת אני מצליח להוסיף איברים.
האם זה בגלל שאח"כ הנתונים שאני מכניס גם מצביעים לזכרון הקבועים?
אם כן, למה הוא מחייב אותי בכלל לאתחל ולא יכולתי פשוט בקונסטקטור להצהיר ;array = NULL* (כשאז יש שגיאת זמן ריצה)?


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  ברפרוף מהיר Net_Boy  11.05.08 22:20 1
     ביררתי את העניין איתך בפרטי והבנתי למה :) באמת זה דורס כנראה... idan192 11.05.08 22:26 2
  עוד שאלה, הפעם ב-C. idan192 12.05.08 13:23 3
     השאלה מה אתה תרצה לעשות איתו בהמשך ... Net_Boy  12.05.08 15:12 4
         בדיוק בגלל זה לא עשיתי את זה idan192 12.05.08 15:23 5

       
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   22:20   11.05.08   
אל הפורום  
  1. ברפרוף מהיר  
בתגובה להודעה מספר 0
 
   זה שזה עובד זה לא אומר שזה תקין , מה שקורה זה פשוט דורס זיכרון ובמקרה זה לא הפריע לדברים אחרים...
באיטרציה אחרת של ריצה זה היה יכול לדרוס זיכרון שלא היית רוצה שידרסו אותו, צריך להרחיב את המערך הפנימי בכל הכנסה .

ואת ההמשך של השאלה לא כל כך הבנתי , לא הבנתי למה אי אפשר לעשות array = NULL , אני רואה שרשמת *array = NULL אולי התבלבלת ? כי את הערך שהפוינטר בברירת המחדל מצביע עליו אתה לא יכול לשנות כל עוד הוא לא הוקצה כמו שצריך


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
idan192

   22:26   11.05.08   
אל הפורום  
  2. ביררתי את העניין איתך בפרטי והבנתי למה :) באמת זה דורס כנראה...  
בתגובה להודעה מספר 1
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
idan192

   13:23   12.05.08   
אל הפורום  
  3. עוד שאלה, הפעם ב-C.  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 12.05.08 בשעה 13:25 בברכה, idan192
 
אם אני רוצה לשלוח מערך int בגודל 3 (למשל) לפונקציה אחרת, איך אני אמור לאתחל אותה?
דבר כזה נחשב חוקי (או שאחרי האתחול הוא מאתחל שוב בגלל הסוגריים המלבניים - למרות שזה לא נראה ככה לפי ה-Watch ששמתי עליו)?

int* temparr = (int*)malloc(sizeof(int)*3);
temparr[0] = 0;
temparr[1] = 1;
temparr[2] = 1;

יש אפשרות אתחול יותר נקייה (למשל אתחול בצורה הישנה של {temparr[] = {0,1,1)?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   15:12   12.05.08   
אל הפורום  
  4. השאלה מה אתה תרצה לעשות איתו בהמשך ...  
בתגובה להודעה מספר 3
 
   ערכתי לאחרונה בתאריך 12.05.08 בשעה 15:12 בברכה, Net_Boy
 
בגדול אין בעייה להגדיר
{temparr[] = {0,1,1
ולקרוא לפונקציה ולשלוח לה temparr
אבל אחרי שהפונקציה שמגדירה אותו יוצאת מה scope הלך המערך

אז זה תלוי בתרגיל ובאופן שאתה צריך את המערך...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
idan192

   15:23   12.05.08   
אל הפורום  
  5. בדיוק בגלל זה לא עשיתי את זה  
בתגובה להודעה מספר 4
 
   כי אני שולח את ה-temparr לפונקציה אחרת (שתאחסן אותו).
"בפוקס" ה-temparr האומנם נשאר, אבל הוא עלול להדרס... כידוע.

אז מה אתה אמור?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net