سؤال

ومرحبا أواجه بعض المشاكل مع 2D صفيف حيوية.

int main()
{
   double **M;
   int M_dimension;
   int i;

   M_dimension = 10;

   M = new double *[M_dimension];
   for (i=0;i<M_dimension;i++)
   {
      M[i] = new double[M_dimension];
   }

   M[0][0] = 1.0;

...
}

والبرنامج يعمل ولكن أود أن تهيئة 2D مجموعة باستخدام هذه الوظيفة:

void initialize2D(double **M,int M_dimension)
{
   int i;
   M = new double *[M_dimension];
   for (i=0;i<M_dimension;i++)
   {
      M[i] = new double[M_dimension];
   }
}

وأخيرا البرنامج يبدو مثل هذا:

int main()
{
   double **M;
   int M_dimension;
   int i;

   M_dimension = 10;

   initialize2D(M,M_dimension);        

   M[0][0] = 1.0; //crash

...
}

ومما يؤسف له أنها تعطل في M[0][0] = 1.0;

وشكرا على اي مساعدة أو اقتراحات.

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

المحلول

ويتم تمرير M من حيث القيمة، بدلا من الإشارة. initialize2D يحتاج إلى تغيير قيمة M المؤشر إلى مؤشر مثل أن يشير إلى الذاكرة المخصصة

وحاول تغيير التوقيع وظيفة لهذا بدلا من ذلك:

void initialize2D(double **&M,int M_dimension)

أو

void initialize2D(double ***M,int M_dimension) {
    ...
    *M = new double *[M_dimension];
    ...
}

نصائح أخرى

وتحتاج إلى تمرير إشارة إلى double** بدلا من double** إلى وظيفة، وإلا فإن التعديل عمله لمؤشر بعد تعيين M في reslut من new تضيع على الخروج من وظيفة.

وما قد تكون المشكلة هو المكان الذي يعلن معلمة عدد صحيح مثل M_dimension كثافة العمليات باطلا initialize2D (مزدوج ** M، الباحث M_dimension)

وثم تهيئة صفيف حيوية على النحو التالي: M [ط] = جديد مزدوج [M_dimension]؛

وحيث يتعلق الأمر تناقض لأنك أعلن M_dimension متغير كعدد ثم استخدامه كما مزدوج

وتحاول ذلك على النحو التالي: إما تغيير نوع البيانات من مجموعة أو M_dimension، حتى ذلك الحين كلا منهم لديهم نفس نوع البيانات.

ونأمل أن هذا سوف تساعدك على الخروج

لماذا لا يتم استخدام std::vector أو Boost.MultiArray

وسيكون من السهل جدا ممارسة لتحديد مجموعة 2-الابعاد كما ناقلات عام ناقلات في C ++

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