2014-04-14 17 views
0

下面是一个代码剪断,我有一个更大的计划指针在C/C++编译但给人段错误错误

double *pos_x_h[224]; 
double *pos_y_h[224]; 
const double A = 1;   
const int N = 224; 
double d_0;  
double alpha;  


void initialize(double nu, int rows = 16, int columns = 14) { 
    double d = 1/double(columns); 
    d_0 = d * (1 - pow(2.0, nu - 8)); 
    alpha = d - d_0; 
    double dx = d; 
    double dy = d * sqrt(3.0)/2; 

    for (int j = 0; j < rows; j++) { 
     for (int i = 0; i < columns; i++) { 
      int n = i + j * columns; 
      *pos_x_h[n] = i * dx + (j % 2) * dx/2.0; 
      *pos_y_h[n] = j * dy; 
     } 
    } 
} 

int main(int argc, char *argv[]) { 
    double nu=7.5; 
    int rows=16; 
    int columns=14; 

    initialize(nu); 

return 0; 
} 

代码编译,但它是给出了赛格故障错误。看不到这是为什么。我要通过array_size吗?

+0

'I + J * columns'会清醒地访问超出数组界限的元素。 – devnull

+0

'void initialize(double nu,int rows = 16,int columns = 14);''和'initialize(nu);'? – someuser

+4

您声明了2个指针数组,但从不初始化它们。 –

回答

1
double *pos_x_h[224]; 
double *pos_y_h[224]; 

是指针数组,但你使用它们wihtout分配内存

*pos_x_h[n] = i * dx + (j % 2) * dx/2.0; 
*pos_y_h[n] = j * dy; 

大概就像是

pos_x_h[n] = malloc(sizeof(double)); 
*pos_x_h[n] = i * dx + (j % 2) * dx/2.0; 
pos_y_h[n] = malloc(sizeof(double)); 
*pos_y_h[n] = j * dy; 

如果需要alocate初始化函数外存储器(为什么会你呢?它是初始化函数)你可以在主要做

int i = 0; 
    for(;i< 224;++i) 
    { 
     pos_x_h[i] = malloc(sizeof(double)); 
     pos_y_h[i] = malloc(sizeof(double)); 
    } 
+0

啊。现在,它引发了一个错误,说我在函数初始化中将void转换为double时出现错误(alpha和d_0的行)。另外,是否可以在声明指针/外部初始化函数时分配内存? – Krishna

+0

@MisterSpock我不明白你到底有什么错误。我添加的行,与malloc?那么你可能使用C++编译器而不是C,在这种情况下你最好使用operator new,或者添加cast来加倍。要在函数之外初始化它们,您应该在主函数中循环分配内存。 – Dabo

+0

@MisterSpock也,如果你使用的是C++编译器,你可能会使用'std :: vector'而不是数组。另外,从你的问题中删除'C'标记,因为C和C++是不同的语言。 – PeterT

3

使用pos_x_hpos_y_h作为指针数组似乎没有任何意义。

更改此:

double *pos_x_h[224]; 
double *pos_y_h[224]; 

要这样:

double pos_x_h[224]; 
double pos_y_h[224]; 

这:

*pos_x_h[n] = i * dx + (j % 2) * dx/2.0; 
*pos_y_h[n] = j * dy; 

更改为:

pos_x_h[n] = i * dx + (j % 2) * dx/2.0; 
pos_y_h[n] = j * dy; 

如果你真的坚持使用指针数组,那么你可以使用这个(除了以上):

double *pos_x_h_ptr[224]; 
double *pos_y_h_ptr[224]; 
for (int n=0; n<224; n++) 
{ 
    pos_x_h_ptr[n] = pos_x_h+n; 
    pos_y_h_ptr[n] = pos_y_h+n; 
} 
+0

这是较大代码的一部分。在这种情况下,这些数组需要是指针。 – Krishna

+0

@MisterSpock,数组中的每个条目都有一个地址。例如,如果您只需将数组''pos_x_h'中的条目'i'的地址传递给'func()',那么只需调用'func(pos_x_h + i)'或'func(&pos_x_h [i ])'。或者,您可以初始化两个指针数组,并用这些'pos_x_h'和'pos_y_h'数组的条目地址填充它们。例如(仅在一个数组上):'double * ptr_array [224]; for(i = 0; i <224; i ++)ptr_array [i] = pos_x_h + i;'。 –

+0

它表示无法在作业中将'double **'转换为'double *'。指针正在杀死我,我似乎是c/C++中的一个n00b。 – Krishna