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處。