gpt4 book ai didi

c - 段错误、结构、ncurses、绘图

转载 作者:行者123 更新时间:2023-11-30 17:37:23 25 4
gpt4 key购买 nike

我的代码中出现段错误。我的代码是:

#define STARTING_POINT 5
int main(int argc, char *argv[])
{
input(argc, argv);
parser(argc, argv);
drawingRooms();
return 0;
}


void drawingRooms(room roomInfo[6])
{
int rooms;
int i;
int positionX;
int positionY;
rooms = 0;
initscr();
noecho();
for(rooms = 0; rooms < 6; rooms++)
{
switch(rooms)
{
case 0:
for(i = 0; i <= roomInfo[rooms].length; i++);
{
move(STARTING_POINT + i, STARTING_POINT);
printw("|");
}
break;
}
}
getch();
endwin();
}


void parser(int argc, char **argv)
{
FILE * rooms;
char * theString;
char * theToken;
int width;
int length;
int k;
int x;
int placeInt;
int posX;
int posY;
char a[ROOM_STRING_LENGTH];
item gold;
item monster;
item potion;
item hero;
item stairs;
room roomInfo[6];
rooms = fopen(argv[1], "r");

if(rooms == NULL)
{
printf("error opening file\n");
}
x = 0;
while(fgets(a, ROOM_STRING_LENGTH, rooms) != NULL)
{

theString = malloc((sizeof(char)*(strlen(a)+1)));
strcpy(theString, a);

for(theToken = strtok(theString, " "); theToken; theToken = strtok(NULL, " "))
{
sscanf(theToken, "%dX%d", &length, &width);
roomInfo[x].roomNumber = x;
roomInfo[x].width = width;
roomInfo[x].length = length;

if(theToken[0] == 'd')
{
switch(theToken[1])
{
case 'e':
{
placeInt = theToken[2] - '0';
roomInfo[x].eastDoor = placeInt;
break;
}
case 'w':
{
placeInt = theToken[2] - '0';
roomInfo[x].westDoor = placeInt;
break;
}
case 's':
{
placeInt = theToken[2] - '0';
roomInfo[x].southDoor = placeInt;
break;
}
case 'n':
{
placeInt = theToken[2] - '0';
roomInfo[x].northDoor = placeInt;
break;
}
default:
{
break;
}
}
}

else if(theToken[0] == 'g' || theToken[0] == 'm' || theToken[0] == 'p' || theToken[0] == 'h')
{
k = 0;
while(k <= (strlen(theToken)))
{

switch(theToken[k])
{
case 'g':
posY = theToken[1] - '0';
posX = theToken[3] - '0';

gold.Xposition = posX;
gold.Yposition = posY;
break;

case 'm':
posY = theToken[1] - '0';
posX = theToken[3] - '0';

monster.Xposition = posX;
monster.Yposition = posY;
break;

case 'p':
posY = theToken[1] - '0';
posX = theToken[3] - '0';

potion.Xposition = posX;
potion.Yposition = posY;
break;

case 'h':
posY = theToken[1] - '0';
posX = theToken[3] - '0';

hero.Xposition = posX;
hero.Yposition = posY;
break;

case 's':
posY = theToken[1] - '0';
posX = theToken[3] - '0';

stairs.Xposition = posX;
stairs.Yposition = posY;
break;
}
k++;
}
}
else if(theToken == NULL)
{
printf("end of file");
}
}

if(theToken == NULL)
{
printf("\n");
}
x++;
}
free(theString);
fclose(rooms);
}

我的结构是:

typedef struct 
{
int roomNumber;
int length;
int width;
int eastDoor;
int westDoor;
int southDoor;
int northDoor;
}room;

我想要做的是访问结构数组中的第一个结构,然后使用获取的信息执行某些操作。每当我运行以下代码时,不会打印任何内容,并且出现段错误

最佳答案

您创建的变量将一直保持事件状态,直到出现相应的右大括号 }左大括号的 {在它之前。

每对左右大括号以及 { ... } 内的内容被称为代码块,通过这个定义,我们可以说变量在其声明的代码块内保持事件状态。

您正在声明一个 roomsInfo[6]函数内的数组parser ,看起来您希望能够直接访问它,而不需要从另一个函数执行任何操作: drawingRooms

事情不会像那样发展。

另一件事是,C 编译器不应该允许您在没有参数的情况下调用需要参数的函数。所以你不应该能够调用电话drawingRooms( );无论如何,对于void drawingRooms( room roomInfo[6] ) { ... }像这样定义的。如果它确实允许,那么它可能会考虑 room roomInfo[6]作为未初始化的变量,如下所示:

    void drawingRooms(  )
{
room roomInfo[6];
...
}

无论如何,你应该做的就是喂 drawingRooms使用适当的参数,即地址,指向 6 room 数组的第一个元素的指针结构;如果你已经这样声明了它的功能。

要解决这个具体问题,您有两个选择,我将从简单的一个开始:

1) 制作roomInfo[6]文件范围变量

通过创建 roomInfo[6]全局(文件范围)变量,该变量将在程序的整个生命周期中存在,因此可以从代码中的任何位置访问。为此:

  • 删除行 room roomInfo[6];里面parser功能
  • 删除参数 room roomInfo[6]来自函数drawingRooms
  • 声明room roomInfo[6];高于一切,高于main功能

像这样:

    #define STARTING_POINT 5

//somewhere above the roomInfo declaration, somewhere here
//there has to be the typedef for the room structure,
//either through the inclusion of a header file
//or the typedef struct {...} room; itself

room roomInfo[6];

int main( ... )
{
...
...

2) 将指针推至drawingRooms

为此,您必须首先为 room 数组分配内存。自己构造,这样当 parser 时它就不会被自动杀死。函数结束;然后将指针返回到第一个元素 parser函数,在调用 drawingRooms 时使用返回的地址功能:

  • 替换行 room roomInfo[6];room * roomInfo;parser功能
  • 分配 6 room为您的房间提供具有结构值(value)的内存

像这样:

    roomInfo = calloc( 6, sizeof * roomInfo );
  • 确保您已包含 <stdlib.h><malloc.h> ,对于calloc打电话
  • 将此行添加到 parser 的末尾功能:return roomInfo;
  • 更改parser的返回值来自 void 的函数进入room *
  • main 内使用此返回值调用 drawingRooms 时的函数功能

像这样:

    //either like this:
...
input( argc, argv );
drawingRooms( parser( argc, argv ) );
...

//or like this (allows you to free it inside main):
...
room * roomInfo;
input( argc, argv );
roomInfo = parser( argc, argv );
drawingRooms( roomInfo );
...
  • 如果您的程序要进一步运行,请确保 free分配的内存。

关于c - 段错误、结构、ncurses、绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22413840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com