2012-01-11 43 views
1

我有矩阵M:静态的基质铸造的指针

float M[4][3] = { 
    0, 0, 0, 
    0, 1, 1, 
    1, 0, 1, 
    1, 1, 0}; 

,我需要与使用目的的方法“foo”的投玛:

foo(float **matrix){ 
    printf("%f",matrix[0][0]); 
} 

我成功地编译的代码使用:

foo((float**) M) 

但是当我执行它时,我得到了段错误。哪里不对?我在Ubuntu Oneiric中使用g ++。

在此先感谢。


好,感谢Luchian,而是使用的是什么:

float **M = new float*[4]; 
M[0] = {0,0,0}; 

我知道,它不会编译,但它类似的东西?

+0

见http://stackoverflow.com/a/4810676/78845 – Johnsyweb 2012-01-11 22:27:26

+0

@ juanma2268:一般规则的拇指,如果你需要一个施法使一些编译那么它就是_often_(并不总是)错误,你的演员隐藏了一个问题。我认为这里就是这种情况。 – AAT 2012-01-11 23:00:07

回答

0

好了,老最好的:

float **M = new float*[4]; 
for(int i=0; i<4; i++){ 
    M[i] = new float[3]; 
    for(int j=0; j<3; j++){ 
     M[i][j] = something... 
    } 
} 
0

如果你希望(或需要)做ARITH自己,避免投:

void foo(float **pmatrix) 
{ 
    float *matrix = *pmatrix; 

    for (int r = 0; r < 4; ++r) 
    { 
     for (int c = 0; c < 3; ++c) 
      printf("%f ", matrix[(r * 3) + c]); 
     printf("\n"); 
    } 
} 

float M[4][3] = { 
    0, 0, 0, 
    0, 1, 1, 
    1, 0, 1, 
    1, 1, 0 
}; 

int main() 
{ 
    float *p = &M[0][0]; 
    foo(&p); 
} 

但是这个代码是丑陋且容易出错,如果可能的话遵循Luchian建议和纠正的声明。