تهيئة صفيف ثنائي الأبعاد مع عدد ديناميكي من الصفوف وعدد الأعمدة الثابتة. C ++

StackOverflow https://stackoverflow.com/questions/4256817

سؤال

أواجه مشكلة في إنشاء صفيف ديناميكي ثنائي الأبعاد في C ++. أريد أن يكون لها رقم ديناميكي (مثل NUMR) من "الصفوف" والرقم الثابت (على سبيل المثال 2) من "الأعمدة".

حاولت فعل ذلك مثل هذا:

const numC = 2;
int numR;
numR = 10;
double *myArray[numC];
myArray = new double[numR];

لسوء الحظ ، لا يعمل. هل من الممكن القيام بذلك بهذه الطريقة؟

بالطبع يمكنني استخدام double **myArray وتهيئته كما لو كان كل من الأبعاد ديناميكيًا (مع استخدام NUMC كمحدد في الحلقة) ولكن أود تجنبها إن أمكن.

شكرا مقدما.

هل كانت مفيدة؟

المحلول

هل من الممكن القيام بذلك بهذه الطريقة؟

نعم:

double (*myArray)[numC] = new double[numR][numC];
// ...
delete[] myArray;

قد يبدو هذا غير عادي بعض الشيء ، لكن 5.3.4 §5 ينص بوضوح على:

نوع من new int[i][10] هو int (*)[10]

لاحظ أن العديد من المبرمجين ليسوا على دراية ببناء CderAtor Centax ولن يفهموا هذا الرمز. أيضا ، التخصيص الديناميكي اليدوي ليس استثناء آمن. بالنسبة لهذه Reeons ، يكون متجه المصفوفات أفضل:

#include <vector>
#include <array>

std::vector<std::array<double, numC> > vec(numR);
// ...
// no manual cleanup necessary

يحل محل std::array مع std::tr1::array أو boost::array, ، اعتمادا على المترجم الخاص بك.

نصائح أخرى

لماذا لا تستخدم أ STD :: ناقلات, ، والاستفادة من البناء:

std::vector<std::vector<int> > my2Darray(2, std::vector<int>(10));
my2Darray[0][0] = 2;

يجب أن تكون هناك حلقة لأنك تحتاج إلى إنشاء صفيف لكل عمود.

أعتقد أن ما تتبعه هو:

double *myArray[numC];
for (int i = 0; i < numC; i++) {
    myArray[i] = new double[numR];
}

// some code...

// Cleanup:
for (int i = 0; i < numC; i++) {
    delete [] myArray[i];
}

هذا يعلن مجموعة من المؤشرات (إلى double) مع numC عناصر ، ثم يخلق مجموعة من doubleS مع numR عناصر لكل عمود في myArray. لا تنس أن تطلق الذاكرة عند الانتهاء من ذلك أو سيكون لديك تسرب ذاكرة.

يجب أن تكون فهارسك صفًا ، ثم العمود.

double** myArray = new double*[numR];
for( unsigned int i = 0; i < numR; i++ ) {
    myArray[i] = new double[numC];
}

الوصول إلى الصف 2 ، العمود 5:

myArray[2][5];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top