希望你能帮助我,因为我现在有点绝望。我使用线程,我希望它们都修改同一个二维数组。所以我用一个指向2D数组的指针创建了一个结构,但是它不起作用。这是我的密码

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”2D数组的函数
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”变量是指向我在主函数中创建的2D数组的指针。好吧,至少我是这么想的,但我有这些错误
 **request for member 'XY' in something not a structure or union**
 **request for member 'b' in something not a structure or union**
 **request for member 'd' in something not a structure or union**
 **request for member 'f' in something not a structure or union**
 **request for member 'h' in something not a structure or union**
  passing argument 3 of 'crearMatriz' from incompatible pointer type [enabled by        default]
    main.c: 59:6: note: expected 'struct celdaMatriz ** (*) [(unsigned int) (totaly)]'         but argument is of type 'struct celdaMatriz **

错误来自createMatrix函数,最后一个来自main函数。顺便说一下,我正在使用linux和C。
谢谢。希望你能帮助我。
编辑
我刚修正了一个错误,这个
*从不兼容的指针类型传递'crearMatriz'的参数3[默认启用]
main.c:59:6:注意:应为“struct celdaMatriz*([(unsigned int)(totaly)”,但参数的类型为“struct celdaMatriz*
已经修复。所以现在的问题是我访问matriz[I][j]>XY='';不正确
希望你能帮助我,因为我现在有点绝望。我使用线程,我希望它们都修改同一个二维数组。所以我用一个指向2D数组的指针创建了一个结构,但是它不起作用。这是我的密码
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”2D数组的函数
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”变量是指向我在主函数中创建的2D数组的指针。好吧,至少我是这么想的,但我有这些错误
 **request for member 'XY' in something not a structure or union**
 **request for member 'b' in something not a structure or union**
 **request for member 'd' in something not a structure or union**
 **request for member 'f' in something not a structure or union**
 **request for member 'h' in something not a structure or union**
  passing argument 3 of 'crearMatriz' from incompatible pointer type [enabled by        default]
    main.c: 59:6: note: expected 'struct celdaMatriz ** (*) [(unsigned int) (totaly)]'         but argument is of type 'struct celdaMatriz **

错误来自createMatrix函数,最后一个来自main函数。顺便说一下,我正在使用linux和C。
谢谢。希望你能帮助我。
编辑
我刚修正了一个错误,这个
*从不兼容的指针类型传递'crearMatriz'的参数3[默认启用]
main.c:59:6:注意:应为“struct celdaMatriz*([(unsigned int)(totaly)”,但参数的类型为“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));
}

最后是新的void 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");
     }
}

就这样。感谢所有帮助我解决这个问题的人

最佳答案

我想问题是你想这样打电话给我,

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

C(C99)不喜欢。问题是creatMatrizp1->matriz类型,但是您的struct celdaMatriz **原型需要一个createMatriz,因为C忽略了struct * (*) [totalY]
如果您想保持[totalX]的定义不变,我建议您使用双指针。

08-27 19:56