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

الكتابة خارج حدود مصفوفة

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

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

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

أحاول تطبيق مثال في لغة C++ يتحقق من بعدي مصفوفة، فإذا كانا متساويين فإنه يسأل المستخدم عن رغبته في تصفير قطر المصفوفة، ثم يصفره إن أجاب بنعم.

وإن لم يكن بعدا المصفوفة متساويين فإنه يطبع قيم عناصرها على الشاشة بشكل عادي جداً.

المشكلة: في حال عدم تساوي قطري المصفوفة فإنه يطبع العناصر ثم يظهر لي رسالة خطأ، أظن معناها أنني أكتب خارج حدود المصفوفة، ونصها كالتالي:

DAMAGE: after Normal block (#72) at 0x00141E40

فما معنى الرسالة؟ وما سببها؟

هذا هو الكود، وهو تطبيق لمثال في كتاب الإكسير:

  1.  
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. class Array //بداية الصنف
  6. {
  7. private:
  8. float **array; //مصفوفة ديناميكية ذات بعدين
  9. int d1,d2,ctrd1,ctrd2; //البعد الأول، البعد الثاني، متغير العد الأول، متغير العد الثاني
  10. char choise; //متغير لمعرفة رأي المستخدم في تصفير قطر المصفوفة
  11. Print(); //دالة لطباعة عناصر المصفوفة على الشاشة
  12. public:
  13. Array(int,int); //دالة البناء
  14. ~Array(); //دالة الهدم
  15. Enter(); //دالة إدخال قيم عناصر المصفوفة
  16. BigFunction(); //دالة التصفير
  17. };
  18.  
  19. Array::Array(int a,int b) //نجهز المصفوفة ببعدين على حسب الوسائط المدخلة
  20. {
  21. d1=a;d2=b;
  22. array=new float *[d1];
  23. for (ctrd2=0;ctrd2<d2;ctrd2++)
  24. array[ctrd2]=new float[d2];
  25. }
  26.  
  27. Array::~Array() //نحذف مصفوفة المؤشرات
  28. {
  29. delete [] array;
  30. }
  31.  
  32. Array::Enter() //ندخل عناصر المصفوفة واحداً تلو الآخر
  33. {
  34. cout<<"Enter array's members:n";
  35. for (ctrd1=0;ctrd1<d1;ctrd1++)
  36. for (ctrd2=0;ctrd2<d2;ctrd2++)
  37. {
  38. cout<<"Enter the membert";
  39. cin>>array[ctrd1][ctrd2];
  40. }
  41. }
  42.  
  43. Array::BigFunction() //في حال كانت أبعاد المصفوفة متساوية، نسأل المستخدم عن رغبته في تصفير ا
    لقطر الرئيسي، وإة كان الجواب نعم نقوم بالتصفير
  44. {
  45. if (d1==d2)
  46. {
  47. cout<<"Do you want to zero the main rayon [y/n]?t";
  48. cin>>choise;
  49. if (choise=='y')
  50. {
  51. for (ctrd1=0;ctrd1<d1;ctrd1++)
  52. {array[ctrd1][ctrd1]=0;}
  53. Print();
  54. }
  55. else
  56. Print();
  57. }
  58. else
  59. Print();
  60. }
  61.  
  62. Array::Print() //طباعة قيم عناصر المصفوفة
  63. {
  64. for (ctrd1=0;ctrd1<d1;ctrd1++)
  65. {
  66. for (ctrd2=0;ctrd2<d2;ctrd2++)
  67. {cout<<array[ctrd1][ctrd2]<<"t";}
  68. cout<<endl;
  69. }
  70. }
  71.  
  72. main()
  73. {
  74. int i,j;
  75. cin>>i;cin>>j;
  76. Array a(i,j);
  77. a.Enter();
  78. a.BigFunction();
  79. return 0;
  80. }
  81.  

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

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


#2

السلام عليكــم ورحمـة الله وبركاتــه ،،

اخى الكريم Abboodd

المشكله لديك تكمن فى المشيد حيث انك أثناء قيامك بإنشاء البعد الثانى للمصفوفه تقوم بعمل Loop بعد عناصر البعد الثانى و هذا غير صحيح، لإنه المفترض ان كل عنصر من البعد الأول هو مؤشر لمصفوفة و حجمها - اى عدد عناصرها - هو البعد الثانى و بالتالى الكود الخاص بالمشيد لديك خاطى و الخطأ يظهر هنا فى هذا السطر

 

[color= #0000ff;]for [color= #000000;](ctrd2[color= #000000;]=[color= #ff0000;]0;ctrd2[color= #000000;]<d2;ctrd2[color= #000000;]++[color= #000000;])

حيث المفترض ان يكون d1 بدلا من d2 لإنك تدور على عناصر البعد الأول لتنشئ منهم مصفوفة البعد الثانى، و بالتالى يصبح هذا السطر بعد التعديل كالتالى

 

[color= #0000ff;]for [color= #000000;](ctrd2[color= #000000;]=[color= #ff0000;]0;ctrd2[color= #000000;]<d1;ctrd2[color= #000000;]++[color= #000000;])

و هذه هى النسخه بعد التعديل.

ملاحظه:

1 - ليس من الجيد تعريف متغير على مستوى الكلاس ليتم استخدامه كـ iterator لـ for حيث انه قد يسبب بعض التشتت اثناء قرائة الكود لذا من الأفضل وضح تصريح الـ iterator داخل محتوى الداله او تعريفه اثناء التصريح عن الـ for خصوصا انا هذا المتغير لن يتم استخدامه فى شئ عدا كونه iterator.

2 - عند وضح تصريح الداله او عند تعريفها لا تنسى وضع الكلمه void كقيمه معاده، لإن الكود لن يتم عمل compile له بدونها :D

3 - انا استخدم الـ VS كمحرر للكود لذا فهو يعتبر الكلمه array كلمه محجوزه، بالطبع لن يعترض المترجم على ذلك لإنى لا استخدم الدوت نت و لكنى تعودت عند صنع متغيرات private داخل على مستوى الكلاس ان يبدء اسمهم بـ underscore حتى استطيع تميزهم عن باقى المتغيرات.

 

[color= #007f00;]#include <iostream>

[color= #0000ff;]using [color= #0000ff;]namespace std;

 

[color= #0000ff;]class [color= #0000ff;]Array

[color= #000000;]{

[color= #0000ff;]private[color= #000000;]:

	[color= #0000ff;]float[color= #000000;]** _array;

	[color= #0000ff;]int     _d1,_d2;

	[color= #0000ff;]void    Print[color= #000000;]([color= #000000;]);

[color= #0000ff;]public[color= #000000;]:

	[color= #0000ff;]Array[color= #000000;]([color= #0000ff;]int, [color= #0000ff;]int[color= #000000;]);

	~[color= #0000ff;]Array[color= #000000;]([color= #000000;]);

	[color= #0000ff;]void Enter[color= #000000;]([color= #000000;]);

	[color= #0000ff;]void BigFunction[color= #000000;]([color= #000000;]);

[color= #000000;]};

 

[color= #0000ff;]Array[color= #000000;]::[color= #0000ff;]Array[color= #000000;]([color= #0000ff;]int a,[color= #0000ff;]int b[color= #000000;]) [color= #000000;]: _d1[color= #000000;](a[color= #000000;]), _d2[color= #000000;](b[color= #000000;])

[color= #000000;]{    

	_array[color= #000000;]=[color= #0000ff;]new [color= #0000ff;]float [color= #000000;]*[color= #000000;][_d1[color= #000000;]];

 

	[color= #0000ff;]for [color= #000000;]([color= #0000ff;]int c[color= #000000;]=[color= #ff0000;]0; c[color= #000000;]<_d1; c[color= #000000;]++[color= #000000;])

		_array[color= #000000;][c[color= #000000;]][color= #000000;]=[color= #0000ff;]new [color= #0000ff;]float[color= #000000;][_d2[color= #000000;]];

[color= #000000;]} 

 

[color= #0000ff;]Array[color= #000000;]::~[color= #0000ff;]Array[color= #000000;]([color= #000000;])

[color= #000000;]{ [color= #0000ff;]delete [color= #000000;][[color= #000000;]] _array; [color= #000000;]} 

 

[color= #0000ff;]void [color= #0000ff;]Array[color= #000000;]::[color= #808000;]Enter[color= #000000;]([color= #000000;])

[color= #000000;]{    

	cout[color= #000000;]<<[color= #A31515;]"Enter array's members:n";    

 

	[color= #0000ff;]for [color= #000000;]([color= #0000ff;]int i[color= #000000;]=[color= #ff0000;]0; i[color= #000000;]<_d1; i[color= #000000;]++[color= #000000;])        

		[color= #0000ff;]for [color= #000000;]([color= #0000ff;]int w[color= #000000;]=[color= #ff0000;]0; w[color= #000000;]<_d2; w[color= #000000;]++[color= #000000;])        

		[color= #000000;]{            

			cout[color= #000000;]<<[color= #A31515;]"Enter the membert";

			cin[color= #000000;]>>_array[color= #000000;][i[color= #000000;]][color= #000000;][w[color= #000000;]];

		[color= #000000;]}

[color= #000000;]}

 

[color= #0000ff;]void [color= #0000ff;]Array[color= #000000;]::[color= #808000;]BigFunction[color= #000000;]([color= #000000;])

[color= #000000;]{

	[color= #0000ff;]if [color= #000000;](_d1[color= #000000;]==_d2[color= #000000;])

	[color= #000000;]{

		[color= #0000ff;]char choise;

		cout[color= #000000;]<<[color= #A31515;]"Do you want to zero the main rayon [y/n]?t";

		cin[color= #000000;]>>choise;        

 

		[color= #0000ff;]if [color= #000000;](choise[color= #000000;]==[color= #A31515;]'y'[color= #000000;])        

		[color= #000000;]{            

			[color= #0000ff;]for [color= #000000;]([color= #0000ff;]int i[color= #000000;]=[color= #ff0000;]0; i[color= #000000;]<_d1; i[color= #000000;]++[color= #000000;])            

				_array[color= #000000;][i[color= #000000;]][color= #000000;][i[color= #000000;]][color= #000000;]=[color= #ff0000;]0;

 

			Print[color= #000000;]([color= #000000;]);

		[color= #000000;]}        

		[color= #0000ff;]else            

			Print[color= #000000;]([color= #000000;]);    

	[color= #000000;]}    

	[color= #0000ff;]else        

		Print[color= #000000;]([color= #000000;]);

[color= #000000;]} 

 

[color= #0000ff;]void [color= #0000ff;]Array[color= #000000;]::[color= #808000;]Print[color= #000000;]([color= #000000;])

[color= #000000;]{    

	[color= #0000ff;]for [color= #000000;]([color= #0000ff;]int i[color= #000000;]=[color= #ff0000;]0; i[color= #000000;]<_d1; i[color= #000000;]++[color= #000000;])    

	[color= #000000;]{        

		[color= #0000ff;]for [color= #000000;]([color= #0000ff;]int w[color= #000000;]=[color= #ff0000;]0; w[color= #000000;]<_d2; w[color= #000000;]++[color= #000000;])

			cout[color= #000000;]<<_array[color= #000000;][i[color= #000000;]][color= #000000;][w[color= #000000;]][color= #000000;]<<[color= #A31515;]"t";

 

		cout[color= #000000;]<<endl;

	[color= #000000;]}

[color= #000000;]}

 

[color= #0000ff;]int main[color= #000000;]([color= #000000;])

[color= #000000;]{    

	[color= #0000ff;]int i,j;

	cout [color= #000000;]<< [color= #A31515;]"Enter 1st Dimension: "; cin[color= #000000;]>>i;

	cout [color= #000000;]<< [color= #A31515;]"Enter 2nd Dimension: "; cin[color= #000000;]>>j;

 

	[color= #0000ff;]Array a[color= #000000;](i,j[color= #000000;]);

 

	a.[color= #808000;]Enter[color= #000000;]([color= #000000;]);

	a.[color= #808000;]BigFunction[color= #000000;]([color= #000000;]);

 

	[color= #0000ff;]return [color= #ff0000;]0;

[color= #000000;]}

و الله ولي التوفيق

تم تعديل هذه المشاركة بواسطة Game Expert في 17 يونيو 2009 في 08:03

مدونتي: C++ Tips and Tricks

#3

السلام عليكم

أخى المشكله موجوده فى دالة الهدم

شوف الكود التالى لداله الهدم

Array::~Array() 
 {
 for(int i=0;i<d1;i++)
	 delete [] array;
 delete [] array;	
 }

وقمت بتجربة الكود كاملا على ال devcpp واشتغل بلا مشاكل

والغريب انى عندما قمت بتجربة نفس الكود على الفيجوال سى 6 أعطانى رسالة خطأ

وسبب رسالة الخطأ هو السطر

delete [] array;

تحياتى

تم تعديل هذه المشاركة بواسطة amin_mu123 في 17 يونيو 2009 في 08:04

اللهم صل على سيدنا محمد وعلى آله وصحبه وسلم

#4

الأخ Muhammad alaa:

أولاً مبارك تغيير الاسم :)

ثانياً، فعلاً المشكلة كما قلت، لم أنتبه لها، ثم جربتها على ورقة وكانت النتيجة كما قلت فعلاً، فشكراً لك.

ثالثاً، كأن كتاب الإكسير للأستاذ سلطان الثبيتي أخطاؤه كثيرة، فقد لاحظت الكثير منها. على الرغم من أن شرح الكتاب ممتاز، ربما كان يحتاج بعض المراجعة.

الأخ amin_mu123:

جزاك الله كل خير، لكن دالة الهدم هذه تعمل عندي بشكل جيد تماماً على VC++6. لا أدري لماذا لم تعمل عندك.

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

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


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