C编程 - 基于命令行参数的数组大小

时间:2013-05-14 14:39:33

标签: c arrays for-loop command-line-arguments conways-game-of-life

我正在尝试为棋盘游戏制作网格,我知道棋盘的最大尺寸,但是根据用户在命令行输入的内容,它也可以更小。我已经制作了以下程序,它成功编译但是当我将维度写入命令行时,它会显示“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]);
}

4 个答案:

答案 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处。