การเขียนโปรแกรม C - ขนาดอาร์เรย์ตามอาร์กิวเมนต์บรรทัดคำสั่ง

ฉันกำลังพยายามสร้างตารางสำหรับเกมกระดาน ฉันรู้ว่าบอร์ดสามารถมีขนาดสูงสุดได้ แต่ก็สามารถเล็กลงได้เช่นกัน ขึ้นอยู่กับสิ่งที่ผู้ใช้ป้อนในบรรทัดคำสั่ง ฉันได้สร้างโปรแกรมต่อไปนี้ มันคอมไพล์ได้สำเร็จ แต่เมื่อฉันเขียนมิติข้อมูลลงในบรรทัดคำสั่งจะมีข้อความว่า '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]);
}

comment
บรรทัดคำสั่งของคุณคืออะไร? โปรแกรมของคุณจะล้มเหลวหากคุณป้อนเพียง 2 อาร์กิวเมนต์   -  person Klas Lindbäck    schedule 14.05.2013
comment
@klas บรรทัดคำสั่งของฉันคือ ./gol 7 6 5   -  person Ibz    schedule 14.05.2013
comment
จากนั้นคุณควร atoi argv[1], argv[2] และ argv[3] อ่านและปฏิบัติตามคำแนะนำในคำตอบของ Salgars   -  person Klas Lindbäck    schedule 14.05.2013
comment
@ KlasLindbäck โอเค ขอบคุณมาก   -  person Ibz    schedule 14.05.2013


คำตอบ (4)


หลายสิ่ง

คุณได้ตั้งค่า BOARD_WIDTH และ BOARD_HEIGHT คงที่เมื่อคุณประกาศตัวแปร ดังนั้นหากคุณส่งค่าที่สูงกว่านั้นในบรรทัดคำสั่ง มันจะไม่ทำงาน

แต่ส่วนใหญ่คุณกำลังพยายามพิมพ์อะไร? คุณไม่ได้กำหนดค่าเริ่มต้น grid เป็นค่าใดโดยเฉพาะ ดังนั้นคุณจึงพิมพ์หน่วยความจำแบบสุ่มออกมา

ประการแรก คุณจะต้องเริ่มต้นกริดของคุณโดยใช้ 'ใหม่': ดูที่นี่สำหรับ สร้างอาร์เรย์ 2 มิติที่มีขนาดแปรผัน

จากนั้นคุณจะต้องเริ่มต้นตัวแปรเหล่านั้นให้เป็นบางสิ่งจริงๆ จากนั้นคุณสามารถพิมพ์ออกมาได้

มันจะช่วยให้คุณง่ายขึ้นหากคุณแสดงให้เราเห็นว่าคุณส่งผ่านเข้าสู่โปรแกรมใดบ้าง แต่เหตุผลทั้งหมดที่กล่าวมาข้างต้นเป็นเพียงจุดเริ่มต้นเท่านั้น

นอกจากนี้มันจะล้มเหลวหากคุณไม่ผ่านการโต้แย้ง 3 ครั้งไปยังโปรแกรมเนื่องจากคุณกำลังใช้ 3

แม้ว่าคุณจะใช้ argv[2] กับ argv[4] - คุณควรใช้ argv[1] กับ argv[3] ดังนั้นในสถานะปัจจุบัน มันจะล้มเหลวเว้นแต่คุณจะผ่านการโต้แย้ง 4 ครั้ง

person Salgar    schedule 14.05.2013
comment
นอกจากนี้ คุณกำลังตรวจสอบว่า argc ‹ 2 แต่คุณกำลังใช้ 3! มันควรจะเป็นถ้า argc ‹ 4 - person Salgar; 14.05.2013
comment
ขอบคุณ ฉันใช้ argv[1] กับ argv[3] ตอนนี้ ฉันกำลังส่งสิ่งนี้ไปยังโปรแกรม ' ./gol 7 6 5 ' โดยคาดว่าจะมีตารางกว้าง 7 และสูง 6 ปรากฏขึ้น ฉันไม่รู้ว่าต้องเริ่มต้นกริด ขออภัยฉันยังใหม่กับการเขียนโปรแกรม ฉันไม่แน่ใจว่าคุณหมายถึงอะไร ฉันต้องเริ่มต้นตัวแปรเหล่านั้นเป็นบางอย่างก่อนที่จะพิมพ์ออกมา - person Ibz; 14.05.2013
comment
grid มีขอบเขตของไฟล์ ดังนั้นจึงเริ่มต้นเป็น 0 ทั้งหมด new คือ C++ แต่คำถามถูกแท็ก C - person Daniel Fischer; 14.05.2013
comment
@DanielFischer โอ้ใช่แล้วนั่นหมายความว่าฉันไม่จำเป็นต้องเริ่มต้นตาราง ฉันต้องการปล่อยให้ตารางทั้งหมดว่างเปล่าเหมือนในช่องว่างและพิมพ์เส้นขอบด้านนอก - person Ibz; 14.05.2013
comment
@Ibz Spaces ไม่ใช่ 0 หากไม่มีการกำหนดค่าเริ่มต้นอย่างชัดเจน grid จะถูกเตรียมใช้งานเป็น 0 ทั้งหมด ดังนั้น หากคุณต้องการสิ่งอื่นใดในนั้น คุณจะต้องตั้งค่า ณ จุดใดจุดหนึ่ง - person Daniel Fischer; 14.05.2013

ตรวจสอบให้แน่ใจว่ามีบางอย่างใน argv[2], argv[3], argv[4] ก่อนที่คุณจะใช้งาน มันน่าจะอ่านว่า if(argc < 5) { exit(1); }

person edtheprogrammerguy    schedule 14.05.2013

คุณสามารถแก้ไขปัญหาของคุณได้ 2 วิธี วิธีแรก คุณสามารถสร้างอาร์เรย์ขนาดสูงสุดและใช้เฉพาะองค์ประกอบที่ใช้งานอยู่ วิธีที่สอง คุณสามารถสร้างอาร์เรย์ทุกครั้งที่เกมของคุณเริ่มต้น สำหรับตัวเลือกที่ 2 คุณจะต้องให้ข้อมูลอินพุตสำหรับขนาดเกม คุณใช้วิธีแรกแล้ว (เนื่องจากคุณมีตารางบอร์ดแบบคงที่) หากคุณต้องการสร้างมันทุกครั้งที่เริ่มเกม เพียงแค่สร้างมันขึ้นมาหลังจากเปลี่ยนค่าสตริงเป็นจำนวนเต็ม:

a = atoi(argv[2])
b = atoi(argv[3])
i = int[a][b]
person cerkiewny    schedule 14.05.2013
comment
คุณคิดว่าวิธีที่ฉันเริ่มใช้ง่ายกว่านี้ไหม - person Ibz; 14.05.2013
comment
ความแตกต่างที่สำคัญระหว่างวิธีการเหล่านั้นบ่งบอกถึงกรณีการใช้งาน วิธีการของคุณนั้นดีถ้าตารางจะถูกใช้บ่อยครั้งในขนาดที่แตกต่างกันในระหว่างการเรียกใช้โปรแกรมหนึ่งครั้ง (โปรแกรมจะเร็วขึ้นเนื่องจากไม่มีการจัดสรรหน่วยความจำเพิ่มเติม) อย่างไรก็ตามหากคุณจะใช้ตารางเพียงครั้งเดียวจะเป็นการดีกว่าที่จะจัดสรรมัน ครั้งเดียวกับค่าอาร์กิวเมนต์ - person cerkiewny; 14.05.2013

ฉันจะถือว่าโค้ดที่คุณนำเสนอเป็นเพียงตัวอย่างข้อมูล หากเป็นเช่นนั้น ฉันสงสัยว่าปัญหาหลักของคุณคือคุณกำลังระบุดัชนีสำหรับข้อโต้แย้งของคุณไม่ถูกต้อง อาร์กิวเมนต์แรกอยู่ที่ดัชนีหนึ่ง (ชื่อไฟล์อยู่ที่ศูนย์) argc คือจำนวนอาร์กิวเมนต์ทั้งหมดรวมทั้งชื่อไฟล์ด้วย

สมมติว่าอาร์กิวเมนต์ทั้งหมดที่คุณใช้แสดงอยู่ในข้อมูลโค้ด คุณควรมีดัชนีทั้งหมด 4 ดัชนีที่มีความกว้าง ความสูง และรุ่นอยู่ที่ดัชนี 1, 2 และ 3 ตามลำดับ

person corahm    schedule 14.05.2013