2013-11-14 20 views
1

当我尝试动态地分配像运行时错误时尝试动态数组分配的功能

array = new double *[genome_size]; 
for(int i=0; i<genome_size; i++) 
    array[i] = new double[max_size](); 

是没有问题的,而且一切都很好矩阵,直到我试图做一个函数来完成这项工作像

void createArray(double **array, int max_size, int genome_size) 
{ 
    array = new double *[genome_size]; 
    for(int i=0; i<genome_size; i++) 
     array[i] = new double[max_size](); 
} 

,并使用功能

double **avgWing1; 
createArray(avgWing1, max_size, genome_size); 

我得到运行时错误。我很好奇为什么?

任何想法赞赏。

+2

出于兴趣,你就知道这是代表一个矩阵一个可怕的方式? – 111111

+0

我不寻找更好的表示家伙,但我喜欢听到你的方式@ 111111 – dare

+0

首先,你使用ADT,理想情况下来自数字库,如boost uBlas或NT2更好。 (他们将提供矩阵和矢量类型)。然而,如果你必须自己推出,那么最好有一个带有m * n个元素的'double *',然后像'array [j * m + i]'或者其他什么来计算偏移量。 – 111111

回答

3

问题是你如何传递参数。在您调用该方法之后,avgWing1的值未更改。你需要要么返回,或传递参数作为参考:

void createArray(double ** &array, int max_size, int genome_size) 
//      ^here 
+0

它像你说的那样工作,但我没有明白,为什么当数组是一个指针本身时,我需要一个引用? – dare

+0

@dare当你传递指针时,参数是所述指针的**副本**。您需要引用来告诉编译器,您需要的是对传递的指针的引用。否则,函数内的赋值将应用于副本(参数)而不是'avgWing1',并且当函数返回时,'array'的值将丢失。 –

+0

当我调用createArray时,我传递了地址,并且知道我很困惑。 – dare

2

我认为问题是,你需要传递指针鼠标指针:)有些事情是如此

void createArray(double ***array, int max_size, int genome_size) 
{ 
    *array = new double *[genome_size]; 
    for(int i=0; i<genome_size; i++) 
     (*array)[i] = new double[max_size](); 
} 


double **avgWing1; 
createArray(&avgWing1, max_size, genome_size); 
2

指针avgWing1在createArray功能本身是一个变量,被传递到createArray函数作为参数double** array通过价值 ...

这意味着,内createArraydouble** array只是一个局部变量,它将被设置为值avgWing1,并且仅存在于函数内部。您将分配double *数组并将指针存储到局部变量中,但是一旦您离开该函数,该值将会丢失,您将无法确定您在哪里分配了所有内容。 avgWing1将保留之前的值。

你最简单的解决办法是从返回的createArray指针:

double** createArray(int max_size, int genome_size) 
{ 
    double** array = new double *[genome_size]; 
    for(int i=0; i<genome_size; i++) 
     array[i] = new double[max_size](); 
    return array; 
} 

用法:

double **avgWing1 = createArray(max_size, genome_size); 
相关问题