0

我正在尝试为棋盘游戏制作网格,我知道该板的最大尺寸,但它也可以根据用户在命令中输入的内容线。我做了下面的程序,它编译成功,但是当我在命令行中写入维度时,它说'分段错误(核心转储)'。谁能告诉我我做错了什么?C编程 - 基于命令行参数的数组大小

#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]); 
} 
+1

你的命令行是什么?如果只输入2个参数,程序将会崩溃。 – 2013-05-14 14:42:20

+0

@klas我的命令行是./gol 7 6 5 – Ibz 2013-05-14 14:47:38

+0

那么你应该'atoi'' argv [1]','argv [2]'和'argv [3]'。阅读并遵循Salgars答案中的指针。 – 2013-05-14 14:50:38

回答

2

许多事情

您设置的固定BOARD_WIDTH和BOARD_HEIGHT当你声明变量,所以如果你在更高的价值传递比在命令行上它行不通。

但主要是你想要打印什么?您尚未初始化任何特定的grid,因此您正在打印随机存储器。

首先,你必须用“新”来初始化网格:看看这里为 Create a 2D array with variable sized dimensions

然后,你就必须真正初始化这些变量的东西。然后你可以打印出来。

如果您向我们展示了您传递给程序的内容,它将会更容易帮助您。但所有上述原因都是一个开始。

此外,它会崩溃,如果你没有在3个arguements传递给程序为你使用3

尽管你使用的argv [2]做argv [4] - 你应该使用argv [1]到argv [3]。所以在目前的状态下它会崩溃,除非你通过4个论据。

+0

另外,你正在检查argc <2,但是你正在使用3!它应该是如果argc <4 – Salgar 2013-05-14 14:51:38

+0

感谢iam现在使用argv [1]到argv [3]。 Iam通过这个程序'./gol 7 6 5'期待一个宽度7和高度6的网格出现,我没有意识到我必须初始化网格。对不起,编程新手。林不知道你的意思是我必须初始化这些变量之前打印出来 – Ibz 2013-05-14 14:58:46

+0

'grid'具有文件范围,所以它被初始化为全0。 'new'是C++,但问题是标记为C. – 2013-05-14 15:07:14

0

在使用它们之前,请确保argv [2],argv [3],argv [4]中有某些内容。它可能应该读 if(argc < 5) { exit(1); }

0

你可以有两种方式,您的问题,第一,您可以创建的最大大小排列,并且只使用有源元件,第二你可以创建每个游戏开始时间阵列。 对于第二个选项,您需要提供游戏大小的输入信息。 第一种方法已经由您来实现(因为你有静态板表) 如果u要创建它每次游戏开始简单改变字符串值的整数后创建它:

a = atoi(argv[2]) 
b = atoi(argv[3]) 
i = int[a][b] 
+0

您认为我开始使用的方法更容易吗 – Ibz 2013-05-14 15:00:43

+0

这些方法之间的主要区别表明了使用情况。如果在一次程序执行期间表格经常以不同的大小使用,那么你的方法是很好的(程序将会更快,因为不会使用额外的内存分配),但是如果你只使用表格一次,最好分配它一次与参数值。 – cerkiewny 2013-05-14 15:02:10

+0

此外,您需要阅读其他答案,因为您的代码是越野车。 – cerkiewny 2013-05-14 15:04:19

0

我假设你提供的代码只是一个片段。如果是这样,我的怀疑是你的主要问题是你正在为你的论点处理错误的索引。第一个参数在索引1处(文件名称为零)。 argc则是包含文件名的参数总数。

假设您正在使用的所有参数都显示在代码段中,那么您应该共有四个索引,宽度,高度和世代分别位于索引1,2和3处。