0

使用しているヘッダーファイルは次のとおりです。

 typedef struct room room;
 struct room {
 char name[21];      
 int num_doughnuts;  
 int num_milkshakes;
 room* portal[4]; 
 };

と私のコード:

struct room* create_room()
{ 
  for(i = 0; i < num_room; i++) 
  {
      room[i] = (struct room*)malloc(sizeof(room));
      printf("input room details\n");
      fgets(input, max_length, stdin);
      sscanf(input, "%s %i %i", room_name, &dnuts, &mshakes);

      strcpy(room[i].name, room_name);  //assign name
      room[i].num_doughnuts = dnuts;  //assign doughnuts
      room[i].num_milkshakes = mshakes;   //assign milkshakes


  }
  return 0;

}

そして、create_room() が呼び出される前に、main 関数で room 構造体を宣言しました。

    struct room room[num_room];

ユーザーが定義した部屋数の文字列と2つの整数を格納するためのユーザー入力を取得することになっています。

expected identifier or '('これらの行について、次のようなエラーが表示され続けます。

      room[i] = (struct room*)malloc(sizeof(room));
      room[i].num_doughnuts = dnuts;  //assign doughnuts
      room[i].num_milkshakes = mshakes;   //assign milkshakes

私も取得しています: 予期しないタイプ '部屋': 名前を割り当てようとすると式が期待されます:

      strcpy(room[i].name, room_name);  //assign name

宣言した方法に何か問題がありますが、何がわかりません。これらの問題のいくつかを見て、いくつかの異なるタイプの解決策を試しましたが、同様のエラーが発生し続けます。

誰でもこれに光を当てることができますか?私は本当に行き詰まっています!とても有難い!

PS は、これらのすべての部屋が作成された後、相互にリンクされたリストに保存され、ポータル [4] が他の部屋へのポインターを保存する必要がある場合に役立ちます。それが私の質問に関係があるかどうかはわかりませんが、追加情報が誰にも害を及ぼすことはありません!

4

3 に答える 3

1

main 関数で配列roomが宣言されていると記述します。その後、 では表示されませんcreate_rooms。つまり、room目に見えるのはによって宣言されたtypedefだけであり、それがコンパイラが文句を言う理由です。

によって宣言された型のグローバル識別子を既に使用しているため、 mainのroom で配列を宣言できないことに注意してください。(宣言がコンパイル エラーを生成しないのはなぜですか? main 内で行われた場合、ローカル宣言はグローバル宣言を隠します。つまり、型は 内では見えません。)roomtypedefmainroommain

解決策: 配列を外部mainで宣言し、別の名前を付けます。

于 2013-05-20T17:48:33.597 に答える
0

問題は次の行にあると思われます。

typedef struct room room;

構造体を参照しようとするたびに、おかしなことをしています。使用していないので、削除してみてください。

于 2013-05-10T00:56:52.240 に答える
0

「部屋」という名前を紛らわしい方法で再利用しています

struct room room[num_room]; /* 部屋と部屋をもう一度? */

コンパイルしていても驚いています。別の変数名を使用してください

また、num_room は const または #define ですか? 部屋の配列を定義し、create_room で部屋ごとに malloc を実行しています。こちらもご確認ください

すばやく汚い方法で、私はそれを機能させました。ヒントを参考にして、具体的な質問があるかどうかを尋ねてください(コメントで):

#include <stdio.h>


typedef struct room room;
 struct room {
 char name[21];
 int num_doughnuts;
 int num_milkshakes;
 room* portal[4];
 };

int num_room = 2;

struct room* create_rooms()
{

        int i;

   /* Create a pointer to rooms */
   struct room *rooms;
   char input[256], room_name[256];
   int dnuts, mshakes;
   int max_length = 256;


   /* Allocate memory for all rooms */
   rooms = malloc( num_room * sizeof(room) );


  for(i = 0; i < num_room; i++)
  {
      printf("input room details\n");
      fgets(input, max_length, stdin);
      sscanf(input, "%s %i %i", room_name, &dnuts, &mshakes);

      strcpy(rooms[i].name, room_name);  //assign name
      rooms[i].num_doughnuts = dnuts;  //assign doughnuts
      rooms[i].num_milkshakes = mshakes;   //assign milkshakes


  }
  return rooms;

}

main()
{
        struct room *rooms;
        int j;

        rooms = create_rooms();

        for ( j=0; j < num_room; j++ )
        {
                printf( "%s, %d %d\n", rooms[j].name, rooms[j].num_doughnuts, rooms[j].num_milkshakes );
        }

        /* free */
        free (rooms );
}
于 2013-05-10T01:02:04.067 に答える