2016-05-19 12 views
0

から割り当て、私は取得しています警告:
警告:以下のコードをコンパイルしながら、互換性のないポインタ型

警告:互換性のないポインタ型から割り当て
maze-> mazeValue = mazeValue。

これは迷路解決コードです。試しましたが問題を特定できませんでした。
char mazeValue[BUFFERSIZE][BUFFERSIZE]char \*\* mazeValue**に変更すると、実行されなかったプログラムがコンパイルされます。 Windowsはアラートをスローします。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 

#define BUFFERSIZE (1000) 
#define MAZE_ENTRANCE '.' 


struct maze { 
    char ** mazeValue; 
    int startx, starty; 
    int numrows; 
    int initdir; 
}; 

void ReadMaze(struct maze * maze); 

int main(int argc, char *argv[]) { 
    struct maze maze; 


    ReadMaze(&maze); 
    printf("Thanks"); 
    //PrintStage(&maze); 

    return EXIT_SUCCESS; 
} 


/* Creates a maze from a file */ 

void ReadMaze(struct maze * maze) { 
    char buffer[BUFFERSIZE]; 
    char mazeValue[BUFFERSIZE][BUFFERSIZE]; 
    //char workingMaze [BUFFERSIZE][BUFFERSIZE]; 
    //char ** map; 
    int rows = 0, foundentrance = 0, foundexit = 0; 
    int columns = 0, i = 0; 

    /* Determine number of rows in maze */ 


    while (fgets(buffer, BUFFERSIZE, stdin)){ 

     //puts(buffer); 
     columns = strlen(buffer); 

     /* 
     for(i=0; buffer[i] != '\0'; i++) 
     { 
      //printf("Row: %d\n", rows); 
      //putchar(buffer[i]); 
      //printf("\n"); 
      mazeValue[rows][i] = buffer[i]; 
      //putchar(mazeValue[rows][i]); 
      //printf("\n"); 
     } 
     */ 

     strcpy(mazeValue[rows], buffer); 

     for (i = strlen(mazeValue[rows]) - 1; isspace(mazeValue[rows][i]); --i) 
      mazeValue[rows][i] = 0; 

     /* Check for entrance and save the location if it finds */ 

     if (!foundentrance && rows == 0) { 
      i = 0; 

      printf("rows %d\n", rows); 
      printf("i %d\n", i); 

      while (mazeValue[rows][i] != MAZE_ENTRANCE && mazeValue[rows][i++]){ 

       if (mazeValue[rows][i] == MAZE_ENTRANCE) { 
        maze->startx = i; 
        maze->starty = rows; 
        foundentrance = 1; 
       } 
      } 
     } 
     ++rows; 
    } 

    maze->mazeValue = mazeValue; 
    maze->numrows = rows; 

    printf("maze->startx %d\n", maze->startx); 
    printf("maze->starty %d\n", maze->starty); 

    printf("\n"); 
    printf("Stage 1\n"); 
    printf("=======\n"); 
    printf("maze has %d rows and %d columns\n\n", rows, columns); 

    i=0; 
    int j; 

    for(i=0; i<=rows; ++i) 
    { 
     for(j=0; j<=columns; ++j){ 
      printf("%c", mazeValue[i][j]); 
      printf("%c", mazeValue[i][j]); 
     } 
     printf("\n"); 
    } 

    printf("\n"); 
    printf("foundentrance: %d\n", foundentrance); 

} 
+5

今なぜ私たちは多くの「迷路解決コード」の問題を見ていますか?それはある種の課題の一部ですか? –

答えて

2

割り当てが機能しても、そのことはできません。ローカル配列を格納しようとしていて、後で使用しますが、これは許可されておらず、未定義の動作をします。

ローカル配列を使用せず、構造内のデータをヒープ割り当て(malloc()を使用)する必要があります。

まずプレーンな文字ポインタであることを構造体のメンバーを変更します。

char *mazeValue; /* Single-star! */ 

そして、好きなことを割り当てる:

maze->mazeValue = malloc(BUFFERSIZE * BUFFERSIZE); 

はその後、2D-インデックスする自分が、それははるかに簡単だん:

maze->mazeValue[y * BUFFERSIZE + x] = '?'; 

もちろん、xyは両方とも0およびBUFFERSIZE - 1

注:あなたは本当にBUFFERSIZEが一定になるようにしたい場合は、あなたの代わりに2次元アレイに戻って、構造体に直接配列を宣言することができます。

char mazeValue[BUFFERSIZE][BUFFERSIZE]; 
1

ポインタは異なるタイプがあります。 struct内のmazevalueは、ポインタへのポインタです。

ReadMazemazevalueは2D配列です。 2D配列へのポインタは、配列へのポインタの型を持ち、このintのように宣言されています(*mazevalue)[BUFFERSIZE]

ただし、構造体のポインタを変更しても問題は解決しません。 ReadMazemazevalueはローカル変数であり、関数が終了すると上書きできます。この場合、構造内の値を上書きすることができます。

最良の選択肢は、構造体を同じに保ち、ReadMaze関数を変更することです。この場合、ポインタへのポインタとしてmazevalueが必要です。次に、必要に応じてmallocの2D配列を作成することができます。

void ReadMaze(struct maze * maze) { 
    char **mazeValue; 

    mazevalue = malloc(BUFFERSIZE * sizeof(char*)); 
    for (i=0; i<BUFFERSIZE; i++) 
    { 
     mazevalue[i] = malloc(BUFFERSIZE); 
    } 
    // Other code below... 

} 

アプリケーションに必要な行と列の必要な数だけを最適化して割り当てることもできます。

+0

ありがとうございました。上記のコードを実装した後、今はエラーが出ません。しかし、迷路を印刷している間は、迷惑な文字はほとんど印刷されません。
──;; pp→→;; – user6344678

関連する問題