• 0
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[i] = new int[2];

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

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

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

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

تم تعديل بواسطه C77431
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

7 إجابة على هذا السؤال .

  • 0

سؤال يا أخي ..

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

int* pvalue(nullptr);

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

سؤال يا أخي ..

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

int* pvalue(nullptr);

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

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

int number=10;

int number(10);

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

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

للتفاصیل

تم تعديل بواسطه C77431
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أها...

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

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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

انا حاليا في تعلم 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[i] = new int[2];

int **pvalue;
pvalue = new int*[3];
for(int i = 0; i < 3; ++i)
pvalue[i] = 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]=i;

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

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

system("pause");
return 0;
}

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

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

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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

تحياتي...

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شکرا لک أخي 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)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

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

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


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

تم تعديل بواسطه C77431
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .