2016-07-25 8 views
-3

コンパイラはペールCです。これが助けになるのですが、これは本当に重要です。それは家の口頭でのウォークスルーであることを意味し、プログラムはエラーを特定しませんが、動作させることはできません。(c)これに問題があります。プログラムを実行しようとするたびにクラッシュします。

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

#define North 0 
#define East 1 
#define South 2 
#define West 3 

void SetupRooms(); 
void DescribeRoom(unsigned int RN); 
void DescribeExits(unsigned int RN); 
signed int GetDirection(unsigned int RN); 

typedef struct{ 
    char Description[500]; 
    unsigned int Exit[4]; 

}Location; 

Location Room [8]; 

int main(void){ 
    unsigned int Room = 1; 
    signed int Direction; 
    SetupRooms(); 

    while(1){ 
     _clrscr(); 
     DescribeRoom(Room); 
     DescribeExits(Room); 
     Direction = GetDirection(Room); 
     if(Direction == -1){ 
      printf("\n BYE!\n"); 
      exit(0); 
     } 
     if (Direction>0)Room=Direction; 
      else printf("\nSorry you can't go that way...\n"); 
    } 
} 

void SetupRooms(){ 
    strcpy(Room[1].Description, "Welcome to the Simonsen house, come on in!\n"); 
    Room[1].Exit[North]=7; 
    Room[1].Exit[East]=0; 
    Room[1].Exit[South]=0; 
    Room[1].Exit[West]=2; 
    strcpy(Room[2].Description, "You've entered the Hall! Signs of an busy family surround you; a pile of skateboards and an overflowing coat stand. You take off your shoes before continuing.\n"); 
    Room[2].Exit[North]=3; 
    Room[2].Exit[East]=1; 
    Room[2].Exit[South]=0; 
    Room[2].Exit[West]=5; 
    strcpy(Room[3].Description, "Fancy a drink while you're in the kitchen? If you hear a scrabbling noise don’t worry, it’s just Homer the Bearded Dragon.\n"); 
    Room[3].Exit[North]=0; 
    Room[3].Exit[East]=7; 
    Room[3].Exit[South]=2; 
    Room[3].Exit[West]=4; 
    strcpy(Room[4].Description, "So this is the dining room, feel free to play any of the musical instruments\n... or just look at the embarassing childhood photos...\n"); 
    Room[4].Exit[North]=7; 
    Room[4].Exit[East]=3; 
    Room[4].Exit[South]=5; 
    Room[4].Exit[West]=6; 
    strcpy(Room[5].Description, "Welcome to the living room, the centre of the house with its cheerful yellow and blue walls, cream leather corner sofa and hundreds of DVDs. See anything of interest?\n"); 
    Room[5].Exit[North]=4; 
    Room[5].Exit[East]=1; 
    Room[5].Exit[South]=0; 
    Room[5].Exit[West]=0; 
    strcpy(Room[6].Description, "Make sure you don't disturb the person revising! The study is filled with French teaching materials, random cables and liquor...\n"); 
    Room[6].Exit[North]=0; 
    Room[6].Exit[East]=4; 
    Room[6].Exit[South]=8; 
    Room[6].Exit[West]=0; 
    strcpy(Room[7].Description, "You pop on the clogs by the door and explore the garden.\nHow about you have a bounce on the trampoline while you're here?\n"); 
    Room[7].Exit[North]=0; 
    Room[7].Exit[East]=3; 
    Room[7].Exit[South]=4; 
    Room[7].Exit[West]=0; 
    strcpy(Room[8].Description, "The garage light turns on as you walk in and you try not to trip over anything.\n"); 
    Room[8].Exit[North]=6; 
    Room[8].Exit[East]=0; 
    Room[8].Exit[South]=1; 
    Room[8].Exit[West]=0; 
} 

signed int GetDirection(unsigned int RN){ 
int NextRoom = 0; 
unsigned char d; 
printf("Type the first letter of the direction you wish to travel."); 
printf("\nOr type q to quit\n"); 
d = _getch(); 
if (d == 'n') NextRoom = Room[RN].Exit[North]; 
if (d == 'e') NextRoom = Room[RN].Exit[East]; 
if (d == 's') NextRoom = Room[RN].Exit[South]; 
if (d == 'w') NextRoom = Room[RN].Exit[West]; 
if (d == 'q') NextRoom = -1; 

return(NextRoom); 
} 

void DescribeExits(unsigned int RN){ 
    printf("\nExits are available to the: "); 
    if(Room[RN].Exit[North]>0) printf("\n North"); 
    if(Room[RN].Exit[East]>0) printf("\n East"); 
    if(Room[RN].Exit[South]>0) printf("\n South"); 
    if(Room[RN].Exit[West]>0) printf("\n West"); 
} 

void DescribeRoom(unsigned int RN){  
    printf("\n %s", Room[RN].Description); 
} 
+0

あなたのプログラムをデバッグしてクラッシュが発生した場所を確認しましたか? –

+4

配列はCでゼロインデックスされているため、 'Room [8]'へのアクセスは未定義の動作です。 – EOF

+1

これは本当に意味のないタイトルです。問題に合ったものに変更してください。あなたが行っていないので、[ツアー]をして[尋ねる]を読んでください。 – IInspectable

答えて

4

Cの配列は0からインデックスされます。配列には8つのメンバーがあると定義されているため、有効なインデックスは0-7です。しかし部屋[8]にアクセスしました。そのような獣ではありませんか?

関連する問題