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

سؤال تخصیص المتحرک لصفائف متعدد الأبعاد

بدأه C77431 في 19 فبراير 2011 · 7 رد · 952 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام علیکم و رحمة الله و برکاته..

( آسف ان یوجد خطأ فی العنوان، اقبلوا من مبتدع اللغة العربیة :) )

سوالی بالاختصار هو کیف یمکننی ذلک؟

انا حالیا فی تعلم dynamic allocation و اقرأ من کتاب.

کما نعلم لصفیف احد الأبعاد (one-dimensional array ) هکذا:

int* pvalue(nullptr);
pvalue=new int[10];

و کُتب فی ذلک الکتاب لمتعدد الأبعاد هکذا:

pvalue=new int[3][2];

( لم یذکر کیفیة تعریف pvalue فی الثانی)

ولکن الثانی بخطأ..

بحثت و وجدت بعض طرق لتعریف متعدد الأبعاد هکذا:

int *pvalue[3];
for(int i = 0; i < 3; ++i)
pvalue = new int[2];

int **pvalue;
pvalue = new int*[3];
for(int i = 0; i < 3; ++i)
pvalue = new int[2];

ولکن الآن سوالی هو، لماذا تعریف ذلک الکتاب بخطأ ( أظن الخطأ فی تعریف pvalue )،

و کیف یمکننی حل هذا المشکل؟

و جزیل الشکر سلفا

تم تعديل هذه المشاركة بواسطة C77431 في 19 فبراير 2011 في 20:27

#2

سؤال يا أخي ..

ما هذه الأقواس التي تحيط ب nullptr .. و ما هي nullptr نفسها؟

int* pvalue(nullptr);

#3
هويدي كتب:

سؤال يا أخي ..

ما هذه الأقواس التي تحيط ب nullptr .. و ما هي nullptr نفسها؟

int* pvalue(nullptr);

نعم اخی هویدی..

بالنسبة للأقواس فهو Functional notation و یمکننا نستخدم ذلک بدل من التساوی و هاتان اثنتان جملتان متساویتان:

int number=10;

int number(10);

و بالنسبة لـnullptr فهو قیمة null للمؤشرات.. یعنی null pointer value..

و لا یمکننا اضافة بالؤشر مثلا ،حینما هذه هی قیمته..

للتفاصیل

تم تعديل هذه المشاركة بواسطة C77431 في 20 فبراير 2011 في 14:59

#4

أها...

هذه بالفعل خاصه بالسي++ .. حيث أنه يعتبر كل نوع هو كائن له constructor .. شكرا يا أخي على الإيضاح

#5
C77431 كتب:

السلام عليکم و رحمة الله و برکاته..

( آسف ان يوجد خطأ في العنوان، اقبلوا من مبتدع اللغة العربية :) )

سوالي بالاختصار هو کيف يمکنني ذلک؟

انا حاليا في تعلم dynamic allocation و اقرأ من کتاب.

کما نعلم لصفيف احد الأبعاد (one-dimensional array ) هکذا:

int* pvalue(nullptr);
pvalue=new int[10];

و کُتب في ذلک الکتاب لمتعدد الأبعاد هکذا:

pvalue=new int[3][2];

( لم يذکر کيفية تعريف pvalue في الثاني)

ولکن الثاني بخطأ..

بحثت و وجدت بعض طرق لتعريف متعدد الأبعاد هکذا:

int *pvalue[3];
for(int i = 0; i < 3; ++i)
pvalue = new int[2];

int **pvalue;
pvalue = new int*[3];
for(int i = 0; i < 3; ++i)
pvalue = new int[2];

ولکن الآن سوالي هو، لماذا تعريف ذلک الکتاب بخطأ ( أظن الخطأ في تعريف pvalue )،

و کيف يمکنني حل هذا المشکل؟

و جزيل الشکر سلفا

اولاً اخي هنلك اختلاف بين مفهومين عليك معرفتهم بشكل صحيح

اولاً Multidimensional array وهي المصفوفه متعدده الابعاد وهي في الحقيقه يمكن عند تعريفها بشكل static وليس dynamic عباره عن مصفوفه احاديه ولكن نعبر عنها بشكل متعدد مثال:

#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
int main()
{
	int a[2][2]={0,1,2,3};

	int *ptr=a[0];
	for(int i=0;i<4;i++)
	{
		cout<<*(ptr++)<<endl;		
	}
	system("pause");
	return 0;
}

هذا يؤكد ان الحجز كان بشكل متتالي بذاكره فهي بتالي مصفوفه احاديه اذا جاز التعبير.

ثانياً: Array of pointers او مصفوفه المصفوفات يسميها البعض احياناً بال dynamic multidimensional array (قد لا تكون dynamic) وانا اعتبر هذا وصف غير دقيق

فهي بالحقيقه عباره عن مصفوفه او pointers يؤشر كل index فيها الى مصفوفه اخرى.

مثال:

#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
int main()
{
	int *a[2];
	a[0]=new int[10];
	a[1]=new int[5];
	system("pause");
	return 0;
}

هنا كما ترى نحن قمنا بتعريف مصفوفه من المؤشرات كل منها يؤشر على مصفوفه.

لو اردنا ان نعتبر a مصفوفه متعدده الابعاد فهذا غير صحيح والسبب هو ان كل عنصر يشير الى مصفوفه بعدد مختلف من العناصر.

لنعمل نفس البرنامج الاول ولكن بمصفوفه احاديه ونتعامل معا كمصفوفه ثنائيه

#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
int main()
{	
	int *a;
	a=new int[100];

	int i,j;

	for(i=0;i<100;i++)
		a=i;

	int *aPtr[10];
	for(i=0;i<10;i++)
	aPtr=&a[i*10];

	for(i=0;i<10;i++)
	{
		for(j=0;j<10;j++)
		cout<<aPtr[j]<<" ";
		cout<<endl;
	}

	system("pause");
	return 0;
}

اتمنى ان تكون عرفت الفكره بشكل صحيح.

واخيراً اخي ان ال nullptr keyword ليست جزء من لغه ال C++ القياسيه وانا جزء من C++\CLI واهي امتداد لل C++ انصحك ان تستخدم ال NULL التي تعرف بال iostream او ان تعرف واحده خاصه بك وطبعاً هي مجرد القيمه 0

1
#6

للمصفوفات ثنائية الأبعاد هناك عدة طرق لفعل الموضوع. أولاً, استخدام المؤشرات سوف يمكنك من إنشاء Jagged Arrays, و ليست محصورة إمكانيات المؤشرات في الـ Multidimensional Arrays. الـ Jagged Arrays هي عبارة عن مصفوفات تحتوي على مصفوفات و التي بدورها قد تحتوي على مصفوفات بحيث يمكن أن تكون كل مصفوفة مختلفة عن الأخرى, أو بمعنى قد يختلف طول كل صف عن الآخر أو كل عامود عن الآخر(هذا يعتمد على كيفية نظرك للمصفوفة نفسها و ماهي الصفوف و ما هي الأعمدة من وجهة نظرك!).

عموماً, أعتذر على التقصير, و لكن هنا رد كتبته منذ مدة في SO إن كان هناك ناحية غير مفهومة, ناقشها معنا بكل سرور :)

http://stackoverflow.com/questions/1946830/multidimensional-variable-size-array-in-c/1946866#1946866

تحياتي...

1
#7

شکرا لک أخي Ali Al-Zyoud..

الشرح کامل و بالتفصيل.. جزاک الله خيرا..

وفقا علي ردک، فالأول هو Pointer to Array ، التي هي ثابت.

والفرق بين مثال الثاني و الثالث هو احد الأبعاد هو ثابت و بعد الثاني هو ديناميکي..

شکرا لک اخي، کان بالتفصيل و مفهوم..

و شکرا لک الأخ Khaled.Alshaya.. دائما اتابع ردود و تعليقاتک هناک مع feed..

ولکن بقي عندي نقطة مجهولة..

ذکرتم بعض طرق لتعريف مصفوفة متعددة الأبعاد، ولکن لا يوجد هذا قول کاتب الکتاب:

pvalue=new int[3][4];

ربما انا أخطأ في تعريف pvalue ولکن لدي هذا Error:

error C2440: '=' : cannot convert from 'int (*)[4]' to 'int *'

و يوجد في الملف ما هو يقول:

hh7net2_12982028121.jpg

(من يعرف أين بيت Ivor؟ :P)

#8

شکرا للجمیع..

وجدتُ الجواب ( فی موقع SO هنا ):

بالاختصار: یجب علینا تعریف pvalue هکذا:

int (*pvalue)[4];
pvalue= new double[3][4];

تم تعديل هذه المشاركة بواسطة C77431 في 20 فبراير 2011 في 19:59

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…