الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

المعامل ++

بدأه Abboodd في 18 يونيو 2009 · 4 رد · 423 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله

كيف حالكم إخواني؟

أقوم بكتابة هذا الكود ولكن يظهر خطأ عند تنفيذه، ولم أدر ما السبب، علماً أني أخذته من كتاب الإكسير:

  1.  
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. class num
  6. {
  7. double *itsNum;
  8. public:
  9. num(){itsNum=new double;*itsNum=0;}
  10. num(int x){itsNum=new double;*itsNum=x;}
  11. num(float x){itsNum=new double;*itsNum=x;}
  12. num(long x){itsNum=new double;*itsNum=x;}
  13. num(const num &rhs);
  14. ~num(){delete itsNum;}
  15. GetitsNum() const {return *itsNum;}
  16. void SetitsNum(double x){itsNum=&x;}
  17. num operator ++();
  18. };
  19.  
  20. num::num(const num &rhs)
  21. {
  22. itsNum=new double;
  23. *itsNum=rhs.GetitsNum();
  24. }
  25.  
  26. num num::operator ++()
  27. {
  28. ++(*itsNum);
  29. double x=*itsNum;
  30. num temp;
  31. temp.SetitsNum(x);
  32. return temp;
  33. }
  34.  
  35. void main()
  36. {
  37. int i=12;
  38. num first=i;
  39. ++first;
  40. cout<<first.GetitsNum()<<endl;
  41. num second= ++first;
  42. cout<<second.GetitsNum()<<endl;
  43. }
  44.  

لا يوجد error قبل التنفيذ، ولكن عند تشغيل البرنامج يظهر لي رسالة كهذه:

Expression: _CrtIsValidHeapPointer(pUserData)

فما الحل؟

جزاكم الله خيراً

هذه الجملة خاطئة  :wacko: 


#2

السلام عليكم

void SetitsNum(double x){itsNum=&x;}

أرى أن الخلل هنا أخي الكريم

حول الأمر إلى

*itsNum  = x;

بالتوفيق,,,

SAFETY TIP : Always delete what you new, and free what you malloc, never mix new with free or malloc with delete.

#3

جزاك الله خيراً

لكن لا يبدو أن كلامك صحيح، حيث أني غيرتها ولم أستفد، كما أن المنطقي أن ما كتبته صحيح، حيث أني وضعت عنوان المتغير x في المؤشر itsNum، ولا أريد وضع العنوان كقيمة للمؤشر.

هذه الجملة خاطئة  :wacko: 


#4
اقتباس
كما أن المنطقي أن ما كتبته صحيح، حيث أني وضعت عنوان المتغير x في المؤشر itsNum، ولا أريد وضع العنوان كقيمة للمؤشر.

هل أنت من كتب المثال، أم أنه هكذا في كتاب الإكسير؟؟

لا علينا، أخي الكريم

هل تعلم ما معنا هذا السطر

void SetitsNum(double x){itsNum=&x;}

هكذا أنت تجعل المؤشر يؤشر إلى المتغير x الموجود على الـstack الخاص بالدالة والذي سينتهي بإنتهاء الدالة.

لاحظ أن الخطأ لن يظهر هنا مباشرة

ولكن لاحظ الأمر في دالة الهدم

~num(){delete itsNum;}

سيقوم هذا الأمر بمحاولة تحرير الذاكرة المؤشر عليها (الـstack الخاص بالدالة SetitsNum عند استدعائها في هذه الحالة) وسيظر الخطأ لأننا أصلا لم نقم بحجزها ديناميكيا.

على كل حال هذا الكود، مع التعديل الذي أشرت عليه بمشاركتي السابقة، وقد جربته على VC++2008 و VC++6

 
#include <iostream>
using namespace std;

class num
{
	double *itsNum;
public:
	num(){itsNum=new double;*itsNum=0;}
	num(int x){itsNum=new double;*itsNum=x;}
	num(float x){itsNum=new double;*itsNum=x;}
	num(long x){itsNum=new double;*itsNum=x;}
	num(const num &rhs);	
	~num(){delete itsNum;}
	double GetitsNum() const {return *itsNum;}
	void SetitsNum(double x){*itsNum=x;}
	num operator ++();
};

num::num(const num &rhs)
{
	itsNum=new double;
	*itsNum=rhs.GetitsNum();
}

num num::operator ++()
{
	++(*itsNum);
	double x=*itsNum;
	num temp;
	temp.SetitsNum(x);
	return temp;
}

void main()
{
	int i=12;
	num first=i;
	++first;
	cout<<first.GetitsNum()<<endl;
	num second= ++first;
	cout<<second.GetitsNum()<<endl;
}

ملاحظة أخرى أخي الكريم

GetitsNum() const {return *itsNum;}

عليك تحديد نوع البيانات للقيمة المعادة وهو double في هذه الحالة

بالتوفيق إن شاء الله,, والسلام عليكم,,

تم تعديل هذه المشاركة بواسطة MoHammaD_93 في 18 يونيو 2009 في 17:36

SAFETY TIP : Always delete what you new, and free what you malloc, never mix new with free or malloc with delete.

#5
هل أنت من كتب المثال، أم أنه هكذا في كتاب الإكسير؟؟

هو من كتاب الإكسير، لكني وجدته منطقياً في البداية. وظننت أن حلك خاطئ لأني قرأته هكذا:

*itsNum = &x;

بدلاً من أن أقرأه هكذا:

*itsNum = x;

فاعذرني.

وأظن أن الفكرة الآن وضحت، حيث أن المتغير x يخرج من مجال الرؤية بانتهاء الدالة وبالتالي يصبح المؤشر في منطقة... لنقل غير معروفة.

جزاك الله كل خير :)

هذه الجملة خاطئة  :wacko: 


مواضيع مشابهة