2011-11-14 74 views
1

我已經在一個函數中填充了一個動態分配的浮點型多數組。通過指針從動態分配的二維數組中獲取值

第二個函數必須獲取數組的值,該數組利用前一個函數中定義的數組的第一個元素的指針。

第二個函數不能訪問正確的內存位置,所以它不起作用,但是如果multy數組是以靜態的方式定義的話。

有人知道爲什麼嗎?

eval_cell應該得到值DIV_INT

float f_imp(float x, float y){ 
    return pow(x,2)+pow(y,2)-1; 
} 


int eval_cell(float* p){ 
    int s[4]; 
    s[0] = f_imp(*p, *(p+1)) <= 0; 
    printf("%f %f\n",*p, *(p+1)); 

    s[1] = f_imp(*(p+3), *(p+4)) <= 0; 
    printf("%f %f\n",*(p+3), *(p+4)); 

    s[2] = f_imp(*(p+9), *(p+10)) <= 0; 
    printf("%f %f\n",*(p+9), *(p+10)); 

    s[3] = f_imp(*(p+6), *(p+7)) <= 0; 
    printf("%f %f\n",*(p+6), *(p+7)); 

    printf("%d%d%d%d\n",s[0],s[1],s[2],s[3]); 
    return s[0]; 
} 

void div_int(float* x1, float* y1,float* x2,float* y2, 
      float* f0, float* f2,float* f6,float* f8){ 
    int i,j,m; 
    float* p; 
    float** a_cell; // array 9x3 contente coordinate vertici e valore funzione 
    *a_cell = (float**) malloc(9*sizeof(float*)); 
    for (i=0;i<9;i++){ 
     a_cell[i] = (float*) malloc(3*sizeof(float)); 
    } 
    a_cell[0][0] = *x1; 
    a_cell[0][1] = *y1; 
    a_cell[0][2] = *f0; 
    a_cell[2][0] = *x2; 
    a_cell[2][1] = *y1; 
    a_cell[2][2] = *f2; 
    a_cell[6][0] = *x1; 
    a_cell[6][1] = *y2; 
    a_cell[6][2] = *f6; 
    a_cell[8][0] = *x2; 
    a_cell[8][1] = *y2; 
    a_cell[8][2] = *f8; 
/*** calcolo dei valori incogniti di a_cell   ***/ 
    a_cell[1][0] = (*x1+*x2)/2; 
    a_cell[1][1] = *y1; 
    a_cell[1][2] = f_imp(a_cell[1][0], a_cell[1][1]); 
    a_cell[3][0] = *x1; 
    a_cell[3][1] = (*y1+*y2)/2; 
    a_cell[3][2] = f_imp(a_cell[3][0], a_cell[3][1]);; 
    a_cell[4][0] = (*x2+*x1)/2; 
    a_cell[4][1] = (*y2+*y1)/2; 
    a_cell[4][2] = f_imp(a_cell[4][0], a_cell[4][1]); 
    a_cell[5][0] = *x2; 
    a_cell[5][1] = (*y2+*y1)/2; 
    a_cell[5][2] = f_imp(a_cell[5][0], a_cell[5][1]); 
    a_cell[7][0] = (*x1+*x2)/2; 
    a_cell[7][1] = *y2; 
    a_cell[7][2] = f_imp(a_cell[7][0], a_cell[7][1]); 

    for (j=0;j<2;j++){ 
     m = j*3; 
     for(i=0;i<2;i++){ 
     m += i; 
     eval_cell(&a_cell[m][0]); 
     } 
    } 
    p = *a_cell; 
    for (i=0;i<9;i++){ 
     for (j=0;j<3;j++){ 
      printf("%f \n",*(p+3*i+j)); 
      printf("%f \n",a_cell[i][j]); 
     printf("\n"); 
     } 
    } 
    free(a_cell); 
    return; 
} 
+2

詞成爲IL codice;)(向我們展示您的代碼,請) – BlackBear

+0

請指定的源代碼。我想這是因爲你以不正確的方式使用指針,只是使用指針作爲指向fload的指針,而它不是指向浮點的指針,而是指向指向浮點的指針...的指針。看到我的答案在http://stackoverflow.com/questions/8122225/array-as-parameter-of-a-function –

回答

2

這是因爲你不正確的方式使用指針: 見a_cell是指向9個指針動態數組的3輛花車動態數組。 所以,當你做eval_cell(&a_cell[m][0])(或只是eval_cell(a_cell[m])這實際上是相同的),你實際上得到指針3陣列的指針。然後,你這樣做:

int eval_cell(float* p){ 

... 
s[2] = f_imp(*(p+9), *(p+10)) <= 0; 

*(p + 9)將獲得第3個浮點數組中的第9個元素,所以這是不正確的。

它以靜態方式工作,因爲內存中的靜態多維數組只是一維數組,因此您可以使用多維索引(通過編譯器)。這就是爲什麼在靜態時你可能會尋址有效的內存區域。

查看更多圖片說明: enter image description here

+0

所以一個動態的多維數組不分配爲一個單一的數組。我不知道。很有用。謝謝。 – Giovanni

+0

當然。順便說一句,你實際上使用malloc自己分配它,在大多數情況下,malloc不會給你連續的內存塊。 –

+0

:)接受你的答案。謝謝。 – Giovanni

0

定義。如果你想有一個完全動態矩陣(二維數組),你必須讓自己的元素訪問功能:

double * 
make_array (unsigned int rows, unsigned int cols) 
{ 
    return malloc (rows * cols * sizeof (double)); 
} 

double * 
array_element (double *a, unsigned int cols, unsigned int i, unsigned int j) 
{ 
    return a + i * cols + j; 
} 

#define A(i,j) (*array_element ((a), (cols), (i), (j))) 

double *a; 
unsigned int rows, cols; 

a = make_array (rows, cols); 
A(3,4) = 3.14; 
printf ("%f\n:" A(3,4)); 

編輯:

在您的程序中

*a_cell = (float**) malloc(9*sizeof(float*)); 

應該

a_cell = (float**) malloc(9*sizeof(float*)); 

27:11

p = *a_cell;