مجموعة C ++ مخصصة ديناميكيًا من المصفوفات ذات الأبعاد الثابتة
-
05-07-2019 - |
سؤال
أحتاج إلى إنشاء هيكل يحمل عددًا متغيرًا من المصفوفات الثابتة لـ char [2] ، أي chars.
سؤالي هو ، كيف يمكنني تخصيص الذاكرة لعدد X من char [2].
جربت هذا (على افتراض أن int x محددة):
char** m = NULL;
m = new char[x][2];
...
delete [] m;
(لم ينجح)
أدرك أنه يمكنني استخدام std :: vectoru003Cchar[2]> كحاوية ، لكنني أشعر بالفضول حول كيفية القيام بذلك مع المؤشرات الخام.
أنا جديد جدًا على C ++ وأحاول التعلم.
المحلول
في التعليمات البرمجية الخاصة بك ، لا يتطابق نوع مكالمة "M" الخاصة بك. ما تريده هو:
char (*m)[2] = NULL;
m = new char[x][2];
...
delete [] m;
M هو مؤشر إلى صفائف من اثنين من chars ، وتتصل الجديدة للحصول على مجموعة من صفائف X من 2 chars والنقطة M في الأول.
نصائح أخرى
أعتقد أن الكود التالي أكثر قابلية للقراءة من char[n][2]
:
typedef char wchar[2]; // array of two chars
const size_t n = 100; // some const
wchar* x = new wchar[n]; // array of wchars, where wchar is array of two chars
// here is still a problem that you could write the following
x[5][5] = 0; // not what you expected?
delete[] x; // clean up
إذا أدركنا الهيكل الداخلي لـ WCAR ، فسيكون الرمز أكثر قابلية للقراءة إذا أعلننا ذلك على النحو التالي:
// using struct is just gives names to chars in wchar, without performance drop
struct wchar {
char h;
char l;
};
...
const size_t n = 100; // some const
wchar* x = new wchar[n]; // array of wchars
x[0].h = 0;
x[0].l = 0;
delete[] x; // clean up
وأخيراً ، لأننا نستخدم C ++ ، لا حاجة لاستخدام صفائف C:
const size_t n = 100; // some const
typedef std::tr1::array<wchar, n> my_arr;
my_arr* x = new my_arr;
(*x)[0].h = 0;
(*x)[0].l = 0;
delete x;
خيار واحد أكثر آمنة مع التحقق من المدى الزمني التجميع:
template<int n_max>
struct array_n {
char v[2*n_max];
template<size_t n, size_t s>
char& get() {
BOOST_STATIC_ASSERT( s < 2 );
BOOST_STATIC_ASSERT( n < n_max );
return v[n*2+s];
};
};
int main( int argc, char**argv)
{
const size_t n = 100; // some const
typedef array_n<100> my_arr;
my_arr* x = new my_arr;
x->get<10, 1>() = 0; // ok
x->get<50, 0>() = 0; // ok
x->get<10, 2>() = 0; // compile time error
x->get<500, 0>() = 0; // compile time error
delete x;
}
سوف ينتهي بك الأمر إلى تحديد حجم الصفيف ، ثم استخدامه الجديد ، وعلاجه كصفيف ثنائي الأبعاد.
ولكن ، من أجل مناقشة جيدة حول هذا قد ترغب في النظر إلى:http://www.velocityreviews.com/forums/t283481-dynamic-multidimensial-arrays.html
unsigned x=10;
typedef char A2[2];
A2 *m=new A2[x];
m[0][1]='a';
m[9][0]='b';
delete[] m;
C صفيفات متعددة الأبعاد (حيث تكون جميع الأبعاد باستثناء الأبعاد الأولى ثابتة) يتم وضعها بشكل متجاور.
إذا كنت تريد صفيفًا متعدد الأبعاد (يحتمل أن يكون خشنًا) ، وهو عبارة عن صفيف 1D من المصفوفات 1D ، فعليك أن تتلاشى:
char **m=new char *[x];
for (unsigned i=0;i<x;++i) m[i]=new char[2];
...
for (unsigned i=0;i<x;++i) delete[] m[i];
delete[] m;