我的代码出现分段错误。我的代码是:
#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;
我想做的是访问我的结构体数组中的第一个结构体,然后对获取的信息ive做一些事情。每当我运行以下代码时,什么都不会打印,并且出现段错误
最佳答案
您创建的变量将保持活动状态,直到其前的大括号}
对应的大括号{
。
每对大括号和{ ... }
中的内容都称为代码块,通过此定义,我们可以说变量在声明的代码块中仍然有效。
您在函数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
有价值的内存像这样:
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/