我正在尝试为棋盘游戏制作网格,我知道棋盘的最大尺寸,但是根据用户在命令行输入的内容,它也可以更小。我已经制作了以下程序,它成功编译但是当我将维度写入命令行时,它会显示“Segmentation fault(core dumped)”。谁能告诉我我做错了什么?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BOARD_WIDTH 80
#define BOARD_HEIGHT 52
int i;
int j;
int width;
int height;
int generations;
int grid[BOARD_WIDTH][BOARD_HEIGHT];
int main(int argc, char *argv[])
{
if (argc < 2)
{
printf("Not enough arguments entered\n");
exit(1);
}
else
{
width = atoi(argv[2]);
height = atoi(argv[3]);
generations = atoi(argv[4]);
}
for(i=0;i<width;i++)
for(j=0;j<height;j++)
printf("%2d", grid[i][j]);
}
答案 0 :(得分:2)
很多事情
当你声明变量时,你已经设置了一个固定的BOARD_WIDTH和BOARD_HEIGHT,所以如果传入的值高于命令行上的值,它就不会起作用。
但主要是你想要打印什么?您尚未将grid
初始化为任何特定内容,因此您打印出随机内存。
首先,你必须使用'new'初始化你的网格:看这里 Create a 2D array with variable sized dimensions
然后,您必须将这些变量初始化为某些内容。然后你可以打印出来。
如果您向我们展示了您传递给该计划的内容,那将更容易为您提供帮助。但所有上述原因都是一个开始。
如果您没有将3个参数传递给该程序,它将会崩溃,因为您使用的是3。
虽然你正在使用argv [2]来进行argv [4] - 你应该使用argv [1]来进行argv [3]。所以在目前的状态下它会崩溃,除非你传递4个论据。
答案 1 :(得分:0)
在使用它们之前,请确保argv [2],argv [3],argv [4]中有一些内容。它可能应该阅读
if(argc < 5)
{
exit(1);
}
答案 2 :(得分:0)
你可以有两种方法来解决你的问题,首先你可以创建最大大小的数组并只使用活动元素,第二,你可以在每次游戏开始时创建数组。 对于第二个选项,您需要提供游戏大小的输入信息。 第一种方法已经由您实现(因为您有静态板表) 如果你想在每次游戏开始时创建它,只需在将字符串值更改为整数后创建它:
a = atoi(argv[2])
b = atoi(argv[3])
i = int[a][b]
答案 3 :(得分:0)
我将假设您呈现的代码只是一个片段。如果是这样,我怀疑你的主要问题是你正在为你的论点解决错误的指数。第一个参数位于索引1(文件名为零)。 argc则是包含文件名的参数总数。
假设您使用的所有参数都显示在代码段中,您应该总共有四个索引,其宽度,高度和代数分别位于索引1,2和3处。