8

文字列を含む2D配列を関数に渡そうとしています。]トークンの前に期待される式を取得し続けます。

このコードのポイントは、単語検索パズルを読んでから、そのパズルの単語を見つけることです。前方検索、バックワード検索、そして上下検索の関数を作成します。

このエラーを取り除くにはどうすればよいですか?エラーは、forward関数を呼び出す一番下にあります。

    /*Andrea Hatfield CPE 101 October 31st, 2012*/
    #include <stdio.h>
    #include <string.h>

    int forward(char words[][8], char puzzle[][11]);


    int main()
    {
    char puzzle[11][11];
    char words[8][8];
    FILE *fin, *fwords;
    int i = 0;
    int j= 0;

    fin = fopen("puzzle.in", "r"); 
    fwords = fopen("words.in", "r");


    if(fin == NULL) /*Reads in the puzzle file*/
    printf("File does not exist");
    else
    {
            while(fscanf(fin,"%s", puzzle[i])!=EOF)
            {
                    printf("%s\n", puzzle[i]);
                    i++;
            }


    }

    if(fwords == NULL) /*Reads in the words the puzzle will search for */
    printf("File does not exist");
    else
    {
            while(fscanf(fwords, "%s", words[j])!=EOF)
            {
                    printf("%s\n", words[j]);
            }
    }


    forward(&words[][8], &puzzle[][11]); /*Error at this point*/
    return(0);
    }
4

2 に答える 2

5

あなたがやりたいことを得るのは少し難しいですが、ここに問題があります:

forward(&words[][8], &puzzle[][11]);

代わりにこれを試してください:

forward(words, puzzle);

ここから言及する必要がある他の2つのオプションがあります:

#define ROWS 4
#define COLS 5

void func(int array[ROWS][COLS]) {
  int i, j;

  for (i=0; i<ROWS; i++) {
    for (j=0; j<COLS; j++) {
      array[i][j] = i*j;
    }
  }
}

void func_vla(int rows, int cols, int array[rows][cols]) {
  int i, j;

  for (i=0; i<rows; i++) {
    for (j=0; j<cols; j++) {
      array[i][j] = i*j;
    }
  }
}

int main() {
  int x[ROWS][COLS];

  func(x);
  func_vla(ROWS, COLS, x);
}
于 2012-11-02T23:13:58.683 に答える
3

直接電話する必要があります

 forward(words, puzzle);

ただし、コードにエラーがあります。j++読み取り中に読み取りサイクルでを忘れたため、配列の他のメンバーをwords上書きして初期化していないことになります。words[0]

また、実際の状況では、実行時にアレイサイズを選択することが望ましい場合があります。それを行う簡単な方法は、幅と高さの両方に適度に大きな制限を選択し、0x90のソリューションを使用することです(30x20のパズルが必要であり、たとえば、ROWSとCOLSでコンパイルしたので、簡単に処理できます。 1024)。

より複雑な方法は、malloc()(charsへのポインターへのポインターを使用して)使用し、使用可能なメモリーによって制限されて、両方の配列を動的に割り当てることです。forward次に、それらのディメンションを関数に渡します。

int forward(char **words, char **puzzle, size_t w_w, size_t w_h, size_t p_w, size_t p_h)
{

}

ただし、へのループ呼び出しmalloc()と、メモリ不足状態をインターセプトするために毎回その戻り値をチェックする必要があることを考えると、割り当て部分はより複雑になります。また、シナリオによっては、メモリの割り当てを解除したい場合があります(たとえば、パズルを繰り返し実行する場合)。これにより、さらに複雑になります。

于 2012-11-02T23:37:55.153 に答える