2013-09-22 118 views
1

希望你能帮助我,因为我现在有点绝望。我正在使用线程,我希望他们都修改相同的二维数组。所以我做了一个指向二维数组的指针,但它不起作用。这个是我的代码指针结构动态二维阵列

typedef struct { 
    char XY; 
    int b; 
    int d; 
    int f; 
    int h; 

} celdaMatriz; 

typedef struct { 
    int totalX; 
    int totalY; 
    celdaMatriz **matriz; 
    char direction; 
    int i; 
    int j; 
    int cont; 

} parameter; 

正如你可以看到参数具有变量“celdaMatriz matriz **”(我对西班牙的遗憾在我的代码)。现在来的函数初始化“celdaMatriz”二维数组

void createMatriz(int totalX, int totalY, celdaMatriz **matriz[totalX][totalY]) 
{ 
    int i,j; 
    for(i=0;i<totalX; i++){ 
     for(j=0; j<totalX;j++){ 
      matriz[i][j]->XY=' '; 
      matriz[i][j]->b=0; 
      matriz[i][j]->d=0; 
      matriz[i][j]->f=0; 
      matriz[i][j]->h=0; 
     } 
    } 

    matriz[0][3]->XY='/'; 
    matriz[2][0]->XY='*'; 
    matriz[2][1]->XY='*'; 
    matriz[0][2]->XY='*'; 
    matriz[2][2]->XY='*'; 
    matriz[1][3]->XY='*'; 
    matriz[3][3]->XY='*'; 
} 

功能createMatriz会发生变化,但是这是想法。所以,现在我的主要功能

int main(int argc,char *argv[]) 
{ 
    int i,j; 
    celdaMatriz **matriz = malloc(sizeof (*matriz) * 4); 
    for (i=0; i < 4; ++i) 
     matriz[i] = malloc(sizeof (**matriz) * 4); 

    crateMatriz(4,4,matriz); 
    parameter *p1,p2; 

    parameter *p1 = malloc(sizeof(*p1)); 
    p1->totalX=4; 
    p1->totalY=4; 
    p1->i=0; 
    p1->j=0; 
    p1->cont=0; 
    p1->direction= 'f'; 
    p1->matriz= matriz; 
    return 0; 
} 

所以任何时候我想创建一个新的线程创建一个新的参数变量及其“matriz”变量的指针二维数组我在主函数创建。嗯,至少是这样的想法,但我得到这些错误

​​

的误差来自createMatrix功能,从main函数的最后一个。顺便说一下,我使用的是Linux和C. 谢谢。希望您能够帮助我。

编辑

我只固定一个错误,这个* 从不相容指针类型传递 'crearMatriz' 的参数3 [启用默认] main.c中:59:6:注:预期“结构celdaMatriz *)[(unsigned int)(totaly)]'但参数类型为'struct celdaMatriz * 已经修复。所以现在的问题是我正在访问matriz [i] [j] - > XY ='';不正确 希望你能帮助我,因为我现在有点绝望。我正在使用线程,我希望他们都修改相同的二维数组。所以我做了一个指向二维数组的指针,但它不起作用。这是我的代码

typedef struct { 
    char XY; 
    int b; 
    int d; 
    int f; 
    int h; 

} celdaMatriz; 

typedef struct { 
    int totalX; 
    int totalY; 
    celdaMatriz **matriz; 
    char direction; 
    int i; 
    int j; 
    int cont; 

} parameter; 

正如你可以看到参数具有变量“celdaMatriz matriz **”(我对西班牙的遗憾在我的代码)。现在到了一个函数来初始化一个“celdaMatriz”二维数组

void createMatriz(int totalX, int totalY, celdaMatriz **matriz[totalX][totalY]) 
{ 
    int i,j; 
    for(i=0;i<totalX; i++){ 
     for(j=0; j<totalX;j++){ 
      matriz[i][j]->XY=' '; 
      matriz[i][j]->b=0; 
      matriz[i][j]->d=0; 
      matriz[i][j]->f=0; 
      matriz[i][j]->h=0; 
     } 
    } 

    matriz[0][3]->XY='/'; 
    matriz[2][0]->XY='*'; 
    matriz[2][1]->XY='*'; 
    matriz[0][2]->XY='*'; 
    matriz[2][2]->XY='*'; 
    matriz[1][3]->XY='*'; 
    matriz[3][3]->XY='*'; 
} 

功能createMatriz会发生变化,但是这是想法。所以,现在我的主要功能

int main(int argc,char *argv[]) 
{ 
    int i,j; 
    celdaMatriz **matriz = malloc(sizeof (*matriz) * 4); 
    for (i=0; i < 4; ++i) 
     matriz[i] = malloc(sizeof (**matriz) * 4); 

    crateMatriz(4,4,matriz); 
    parameter *p1,p2; 

    parameter *p1 = malloc(sizeof(*p1)); 
    p1->totalX=4; 
    p1->totalY=4; 
    p1->i=0; 
    p1->j=0; 
    p1->cont=0; 
    p1->direction= 'f'; 
    p1->matriz= matriz; 
    return 0; 
} 

所以任何时候我想创建一个新的线程创建一个新的参数变量及其“matriz”变量的指针二维数组我在主函数创建。嗯,至少是这样的想法,但我得到这些错误

​​

的误差来自createMatrix功能,并从主函数中的最后一个。顺便说一下,我使用的是Linux和C. 谢谢。希望您能够帮助我。

EDIT

我只固定一个错误,这个 * 从兼容的指针类型[默认启用] 主传递 'crearMatriz' 的参数3。c:59:6:note:expected'struct celdaMatriz *)[(unsigned int)(totaly)]'but argument is of type'struct celdaMatriz * 已经修复。所以现在的问题是我正在访问matriz [i] [j] - > XY ='';不正确

编辑 嗨。我只是想让你知道我已经找到了解决问题的答案。我不会将指针发送到矩阵,而是将其用作全局变量,这样所有线程都可以对其进行修改。因此,解决办法是1-声明全局celdaMatriz ** matriz

celdaMatriz **matriz; 

接下来,我改变了内存分配

matriz = (celdaMatriz **) malloc(4 * sizeof(celdaMatriz *)); 

for (i = 0; i < 4; ++i) 
{ 
    matriz[i] = (celdaMatriz *) malloc(4 * sizeof(celdaMatriz)); 
} 

最后,新的孔隙createMatriz功能:

void crearMatriz(int totalX, int totalY) 
{ 
    int i=0,j=0; 
    for(i=0; i<totalX;i++){ 
     for(j=0; j<totalY; j++){ 
      celdaMatriz *nodo = malloc(sizeof(celdaMatriz)); 
      nodo->b=0; 
      nodo->d=0; 
      nodo->f=0; 
      nodo->h=0; 
      nodo->casilla=0; 
      matriz[i+j*totalY]=(celdaMatriz *)nodo; 

     } 
    } 

    matriz[12]->casilla=1; 
    for(i=0; i<totalX; i++){ 
     for(j=0; j<totalY; j++){ 
      printf(" %d ", matriz[i+j*totalY]->casilla); 
     } 
     printf("\n"); 
    } 
} 

就是这样。感谢大家谁这个问题

+0

哪一行是59行? – SJuan76

+0

void createMatriz(int totalX,int totalY,celdaMatriz * matriz [totalX] [totalY]) –

+0

@ SJuan76他的代码大小是正确的,而你的代码是不正确的。他希望分配四个'celdaMatriz',而不是四个指向指针的指针。您的代码分配了4个字节的指针大小。 – WhozCraig

回答

1

我猜测,问题是,你想叫creatMatriz这样帮我,

 createMatriz(p1->totalX, p1->totalY, p1->matriz); 

和C(C99)不喜欢它。问题是p1->matriz的类型为struct celdaMatriz **,但是您的原型createMatriz要求输入struct * (*) [totalY],因为C忽略了[totalX]

如果你想保持parameter的定义不变,我建议你只使用双指针。

+0

嗨,我在这里错误地写了我的代码,实际上就像你说的那样。与一个双指针,所以真正的功能是无效的createMatriz(int totalX,int totalY,celdaMatriz ** matriz [totalX] [totalY])。我写的错误来自该函数 –