0

私は迷路を解くプログラムを書いています。開始正方形「o」で始まり、「*」で終わります。「#」は壁であり、「。」探索できる正方形です。アルゴリズムは、プログラムの開始時に開始スクエアを空のキューに追加することです。その後の各ステップでは、キューから正方形を取り出し、それがすでに記録されている正方形であるか、仕上げの正方形であるか、または探索可能であるかどうかを確認します。探索可能な場合は、隣接する壁以外の正方形をキューに追加します。私の問題は、キューに開始正方形を追加すると、セグメンテーションエラーが発生し、その理由がわからないことです。関連するコードは次のとおりです。

mazeQ.c:

#include <stdio.h>
#include <stdlib.h>
#include "QueueInterface.h"

int main(void)
{
    Queue Q;
    InitializeQueue(&Q);

    int row;
    int column;

    int x;
    int y;

    scanf("%d %d", &column, &row); //scan dimensions of maze

    char input[row][column];
    ItemType maze[row][column];
    for(x = 0; x <= row; x++) {
            fgets(input[x],column+2,stdin);
    }
    row++;

    for (x = 1; x < row; x++){
            for (y = 0; y < column; y++) {
                    maze[x][y].squareType = input[x][y];
                    maze[x][y].xCoordinate = x-1;
                    maze[x][y].yCoordinate = y;
                    maze[x][y].recordedSquare = 0;
            }
    }

    for(x = 1; x < row; x++){
            for(y = 0; y < column; y++) {
                    if (maze[x][y].squareType == 'o')
                      Insert(maze[x][y],&Q);  //INSERTED HERE
            }
    }
    for (x = 1; x < row; x++) {
            for (y = 0; y < column; y++) {
                    printf("%c", maze[x][y].squareType);
            }
    printf("\n");
    }

}

UserTypes.h:

#include <stdio.h>
#include <stdlib.h>
typedef struct {
    char squareType;
    int xCoordinate;
    int yCoordinate;
    int recordedSquare;
} ItemType;

以下の2つのファイルは、そのままにしておく必要があります。QueueImplementation.c:

#include <stdio.h>                   
#include <stdlib.h>                 
#include "QueueInterface.h"         


void SystemError(char *errorMsg) {fprintf(stderr,errorMsg);}

void InitializeQueue(Queue *Q)
{
  Q->Front = NULL;
  Q->Rear  = NULL;
}

int Empty(Queue *Q)
{
  return (Q->Front == NULL);
}

int Insert(ItemType R, Queue *Q)
{   
  QueueNode *Temp;
                                               /* attempt to allocate */
  Temp = (QueueNode *) malloc(sizeof(QueueNode));       /* a new node */

  if (Temp == NULL) {               /* Temp = NULL signals allocation */
     SystemError("system storage is exhausted");           /* failure */
     return 0;
  } else {
     Temp->Item = R;
     Temp->Link = NULL;
     if ( Q->Rear == NULL ) {
        Q->Front = Temp;
        Q->Rear = Temp;
     } else {
        Q->Rear->Link = Temp;
        Q->Rear = Temp;
     }
   }
   return 1;
}

QueueInterface.h:

#include "UserTypes.h"                          /* get ItemType definition */

typedef  struct  QueueNodeTag {
        ItemType               Item;   
        struct  QueueNodeTag  *Link;
     }QueueNode;

typedef  struct {                                 /* a queue is empty iff */
        QueueNode  *Front;                       /* its Front == NULL */
        QueueNode  *Rear;
     }Queue;


/* defined operations */

extern void InitializeQueue(Queue *Q);
  /* Initialize the queue Q to be the empty queue */

extern int Empty(Queue *Q);
  /* Returns TRUE == 1 if and only if the queue Q is empty */

extern int Full(Queue *Q);
  /* Returns TRUE == 1 if and only if the queue Q is full */

extern int Insert(ItemType R, Queue *Q);
  /* If Q is not full, insert a new item R onto the rear of Q */

extern int Remove(Queue *Q, ItemType *F);
  /* If Q is non-empty, remove the frontmost item of Q and put it in F */

プログラムは、mazeQ<sampleMazeと入力して実行されます

sampleMaze

12 10
############
#..........#
#.#.######.#
#.#....#...#
#.###.*#.#.#
#...####.#.#
#.#.#..#.#.#
#.#.#.##.#.#
#o#......#.#
############
4

2 に答える 2

1

なぜセグメンテーション違反になるのかわかりません。私はそれを実行することによってこの出力を得ました:

$ gcc *.c -o maze
$ ./maze <sample 
ļ##
ļ####
ļ######
ļ########
##########
############
###########.
#########...
#######.....
#####......#

さて、いくつかのクリーンアップの後、私はこのコードを取得しました:

#include <stdio.h>
#include <stdlib.h>
#include "QueueInterface.h"

int main(void)
{
    Queue Q;
    InitializeQueue(&Q);

    int row;
    int column;

    int x;
    int y;

    scanf("%d %d\n", &column, &row); //scan dimensions of maze


    char input[row][column+2];
    ItemType maze[row][column];
    for(x = 0; x < row; x++) {
            fgets(input[x],column+2,stdin);
    }

    for (x = 0; x < row; x++){
            for (y = 0; y < column; y++) {
                    maze[x][y].squareType = input[x][y];
                    maze[x][y].xCoordinate = x;
                    maze[x][y].yCoordinate = y;
                    maze[x][y].recordedSquare = 0;
            }
    }

    for(x = 0; x < row; x++){
            for(y = 0; y < column; y++) {
                    if (maze[x][y].squareType == 'o')
                      Insert(maze[x][y],&Q);  //INSERTED HERE
            }
    }
    for (x = 0; x < row; x++) {
            for (y = 0; y < column; y++) {
                    printf("%c", maze[x][y].squareType);
            }
    printf("\n");
    }

}

そしてそれは出力です:

############
#..........#
#.#.######.#
#.#....#...#
#.###.*#.#.#
#...####.#.#
#.#.#..#.#.#
#.#.#.##.#.#
#o#......#.#
############

それを試してみてください。

于 2012-10-14T04:41:24.460 に答える
0

どうやら問題は、プログラム ファイルを入れようとしていたディレクトリに、メモリを占有する他のジャンク ファイルが多すぎることでした。私がしなければならなかったのは、プログラムファイルを別のディレクトリに移動することだけでした..新しいプログラムには常に新しいディレクトリを作成するという教訓を学んだようです。みんな助けてくれてありがとう。

于 2012-10-14T12:18:58.223 に答える