0

我正在尝试为棋盘游戏制作网格,我知道棋盘的最大尺寸,但是根据用户在命令行中输入的内容,它也可以更小。我制作了以下程序,它编译成功,但是当我将尺寸写入命令行时,它显示“分段错误(核心转储)”。谁能告诉我我做错了什么?

#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

4 回答 4

1

很多东西

当你声明变量时,你已经设置了一个固定的 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 次争论,否则它将崩溃。

于 2013-05-14T14:44:12.913 回答
0

我将假设您提供的代码只是一个片段。如果是这样,我怀疑你的主要问题是你为你的论点处理了错误的索引。第一个参数位于索引一(文件名为零)。argc 然后是包括文件名在内的参数总数。

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

于 2013-05-14T15:51:05.357 回答
0

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

于 2013-05-14T14:44:31.820 回答
0

您可以有两种方法来解决您的问题,首先您可以创建最大大小的数组并仅使用活动元素,第二您可以在每次游戏开始时创建数组。对于第二个选项,您需要提供游戏大小的输入信息。第一种方法已经由您实现(因为您有静态棋盘表)如果您想在每次游戏开始时创建它,只需在将字符串值更改为整数后创建它:

a = atoi(argv[2])
b = atoi(argv[3])
i = int[a][b]
于 2013-05-14T14:46:26.457 回答