2014-04-14 65 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