我是编码和调试的新手。作为一项任务,我试图为两个玩家制作一个Nim游戏。但是,只要我在代码中达到了要点,就会给我分段错误。我认为问题可能是指向数组中的错误位置,但是更改这些值没有帮助。最终,我尝试使用gdb进行调试,并说在为数组分配随机数的那一行出现了段错误。我不知道该如何处理调试时得到的信息。这是我将1到6的随机数分配到数组中的部分:
for (int x; x < aantalrijen; x++) {
if (geinitialiseerd == 0) {
fiches[x] = rand()% 6 + 1 ;
geinitialiseerd = 1;
}
printf("\n\tRij %d:\t", x+1);
for (int y = 0; y < fiches[x]; y++) {
printf(" @ ");
}
fichesum = fichesum + fiches[x];
}
}
令人惊讶的是,仅当我输入1或10作为aantalrijen时,我才得到细分错误,但当我在两者之间输入任何内容时,却没有得到细分错误。但是,该代码仍然无法正常工作;当我输入2到9之间的数字时,它仍然不能正常工作。这是我到目前为止编写的全部代码,即使尚未完成:
#include <stdio.h>
#include <stdlib.h>
//Initialiseren van speler namen, wiens beurt het is, de aantal rijen,
de aantal fiches op ieder rij, het totaal aantal fiches en de variant
die gespeeld wordt.
char speler1[10];
char speler2[10];
int geinitialiseerd;
int beurt;
int aantalrijen;
int fiches[10];
int fichesum;
int rijnemen;
int aantalnemen;
int variant;
int output () {
//For loop voor initialisatie van het spel. Hiermee wordt bedoelt dat x aantal rijen een random waarde krijgen tussen 1 en 6. Deze worden ook meteen geprint.
for (int x; x < aantalrijen; x++) {
if (geinitialiseerd == 0) {
fiches[x] = rand()% 6 + 1 ;
geinitialiseerd = 1;
}
printf("\n\tRij %d:\t", x+1);
for (int y = 0; y < fiches[x]; y++) {
printf(" @ ");
}
fichesum = fichesum + fiches[x];
}
}
int main () {
//Introductie en vraag om namen
printf("==========================================================================================\n**Welkom bij Nim! Dit is een spel gemaakt door Michael Francis voor twee spelers!\t**\n==========================================================================================\n**Wat is de naam van speler 1?\t\t\t\t\t\t\t\t**\n");
scanf("%s", &speler1);
printf("**Wat is de naam van speler 2?\t\t\t\t\t\t\t\t**\n");
scanf("%s", &speler2);
printf("\n**Kies het aantal rijen waarmee u wilt spelen (tussen de 1 en 10):\t\t\t**\n==========================================================================================\n");
scanf("%d", &aantalrijen);
printf("==========================================================================================\n**Kies de variant die u wilt spelen:\t\t\t\t\t\t\t**\n\t1. Verliezer neemt laatste fiche\n\t2. Winnaar neemt laatste fiche\n==========================================================================================\n");
scanf("%d", &variant);
printf("==========================================================================================\n**Nieuw gegenereerd spel:\t\t\t\t\t\t\t\t**\n");
output();
printf("\n\n==========================================================================================\n");
fichesum = 100;
while (fichesum != 0) {
//For-loop om huidige fiches uit te printen
//for (int a; a < aantalrijen; a++) {
// printf("\n\tRij %d:\t", a+1);
// for (int b = 0; b < fiches[a]; b++) {
// printf(" @ ");
// }
//}
output();
fichesum = 0;
if (beurt == 0) {
printf("\n\n==========================================================================================\n%s is aan de beurt!", speler1);
beurt = 1;
} else {
printf("\n\n==========================================================================================\n%s is aan de beurt!", speler2);
beurt = 0;
}
printf("\nUit welk rij wilt u fiches nemen?\n");
scanf("%d", &rijnemen - 1);
printf("\nHoeveel fiches wilt u nemen?\n");
scanf("%d", &aantalnemen);
fiches[rijnemen] = fiches[rijnemen] - aantalnemen;
printf("%d", fiches[rijnemen]);
}
return 0;
}
答案 0 :(得分:0)
如果使用-Wall -O2
进行编译,则会在for
中的output
循环上收到警告:
dut.c: In function ‘output’:
dut.c:21:11: warning: ‘x’ may be used uninitialized in this function [-Wmaybe-uninitialized]
for (int x; x < aantalrijen; x++) {
^
更改:
for (int x; x < aantalrijen; x++) {
进入:
for (int x = 0; x < aantalrijen; x++) {
另一个要修复的警告
更改:
scanf("%s", &speler1);
scanf("%s", &speler2);
进入:
scanf("%s", speler1);
scanf("%s", speler2);