【问题标题】:pointer inside struct to dynamic 2-D array结构内指向动态二维数组的指针
【发布时间】:2013-09-22 23:34:10
【问题描述】:

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

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”变量是一个指向我在主函数中创建的二维数组的指针。好吧,至少是这样的想法,但我得到了这些错误

 **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=' ';错误地 希望你能帮助我,因为我现在有点绝望。我正在使用线程,我希望它们都修改同一个二维数组。所以我制作了一个带有指向二维数组的指针的结构,但它不起作用。这是我的代码

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”变量是一个指向我在主函数中创建的二维数组的指针。好吧,至少是这样的想法,但我得到了这些错误

 **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"); 
     }
}

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

【问题讨论】:

  • void createMatriz(int totalX, int totalY, celdaMatriz *matriz[totalX][totalY])
  • @SJuan76 他的尺码代码是正确的,而你的代码不正确。他想要分配四个celdaMatriz 的数组,而不是四个指向指针的指针。您的代码分配指针大小 * 4 个字节。
  • 嗯嗯嗯,现在怎么办?
  • @SJuan76 对,sizeof(matriz) 不是struct celdaMatriz 的大小;它的大小是指向sruct celdaMatriz的指针的大小。
  • @AlvaroFallas 您是否打算将此作为 VLA 参数传递?如果是这样,那么指针对指针分配方案不是这样做的方法。如果要使用指针到指针分配方案,则需要以不同方式传递。从参数声明中删除数组下标并传递一个指向指针的指针。 IE。 void createMatriz(int totalX, int totalY, celdaMatriz **matriz)。注意:p1main() 中双重声明。

标签: c arrays pointers struct


【解决方案1】:

我猜问题是你试图像这样调用creatMatriz

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

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

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

【讨论】:

  • 你好,我这里的代码写错了,其实是你说的。使用双指针,所以真正的函数是 void createMatriz(int totalX, int totalY, celdaMatriz **matriz[totalX][totalY])。我写的错误来自那个函数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 2013-04-06
相关资源
最近更新 更多