2013-09-22 117 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])。我寫的錯誤來自該函數 –