希望你能帮到我,因为我现在有点绝望了。我正在使用线程,我希望他们都修改相同的2D数组。所以我创建了一个带有指向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”变量是指向我在main函数中创建的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. 谢谢。希望您能够帮助我。
EDITED
我刚刚修正了一个错误 * 从不兼容的指针类型[默认启用]传递'crearMatriz'的参数3 main.c:59:6:注意:预期'struct celdaMatriz * ()[(unsigned int)(totaly)]'但参数类型为'struct celdaMatriz * 已经修好了。所以现在的问题是我正在访问matriz [i] [j] - &gt; XY ='';不正确 希望你能帮助我,因为我现在有点绝望了。我正在使用线程,我希望他们都修改相同的2D数组。所以我创建了一个带有指向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”变量是指向我在main函数中创建的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] - &gt; XY ='';错误地
EDIT 你好。我只想告诉你我已经找到了问题的答案。我不会发送指向矩阵的指针,而是将其用作全局变量,这样所有线程都可以修改它。因此解决方案是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");
}
}
就是这样。感谢所有帮助我解决这个问题的人
答案 0 :(得分:1)
我想问题是你试图像这样呼叫creatMatriz
,
createMatriz(p1->totalX, p1->totalY, p1->matriz);
和C(C99)不喜欢它。问题是p1->matriz
的类型为struct celdaMatriz **
,但您createMatriz
的原型要求struct * (*) [totalY]
,因为C忽略[totalX]
。
如果你想保持parameter
的定义不变,我建议你只使用双指针。