C数独解算器崩溃并返回进程-1073741819(0xC000005)
我目前正在做一个数独解算器,我主要完成了,但从标题中可以看出,它在一开始就崩溃了,给了我一个信息: 返回的进程-1073741819(0xC000005) 我在GNU编译器中使用代码块。我猜我在指针上做错了什么,我只是不知道我做错了什么(目前正在学习C)。 我真的希望你能帮我解决我的问题 我的代码:C数独解算器崩溃并返回进程-1073741819(0xC000005),c,pointers,crash,codeblocks,gnu,C,Pointers,Crash,Codeblocks,Gnu,我目前正在做一个数独解算器,我主要完成了,但从标题中可以看出,它在一开始就崩溃了,给了我一个信息: 返回的进程-1073741819(0xC000005) 我在GNU编译器中使用代码块。我猜我在指针上做错了什么,我只是不知道我做错了什么(目前正在学习C)。 我真的希望你能帮我解决我的问题 我的代码: #include <stdio.h> #include <stdlib.h> #include <stdbool.h> bool finde_leeres_fe
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
bool finde_leeres_feld(int feld [9][9], int *reihe, int *spalte);
bool ist_legal(int feld [9][9], int reihe, int spalte, int zahl);
bool loese(int feld[9] [9]) //steuert den ablauf der einzelnen funktionen um das sudoku zu lösen
{
int zahl, spalte, reihe;
int *pspalte, *preihe;
pspalte=&spalte;
preihe=&reihe;
if (!finde_leeres_feld(feld, preihe, pspalte)) // wenn wir kein leeres feld finden sind wir fertig
return true;
for (zahl = 1; zahl <= 9; zahl++)
{
if (!ist_legal(feld, reihe, spalte, zahl))
{
feld[reihe] [spalte] = zahl; // weist dem feld an der stelle reihe, spalte einen versuchwert zu
if(feld[reihe] [spalte])
return true;
feld[reihe] [spalte] = 0;
}
}
return false;
}
bool finde_leeres_feld(int feld [9] [9], int *reihe, int *spalte) //funktion sucht ein leeres feld und gibt den wert true zurück wenn es eines findet
{
for((*reihe) = 0; (*reihe) < 9; (*reihe++))
{
if(feld [(*reihe)] [(*spalte)] == 0)
return true;
return false;
}
}
bool in_reihe_vorhanden(int feld [9] [9] , int reihe, int zahl) //überprüft ob in der gegebenen reihe eine Ziffer bereits vorkommt, falls ja gibt sie den wert true
{
int spalte;
for (spalte = 0; spalte < 9; spalte++)
if (feld [reihe] [spalte] == zahl)
return true;
return false;
}
bool in_spalte_vorhanden(int feld [9] [9] , int spalte, int zahl) //überprüft ob in der gegebenen spalte eine Ziffer bereits vorkommt, falls ja gibt sie den wert true
{
int reihe;
for (reihe = 0; reihe < 9; reihe++)
if(feld[reihe] [spalte] == zahl)
return true;
return false;
}
bool im_gitter_vorhanden(int feld [9] [9] , int reihenanfang, int spaltenanfang, int zahl) //überprüft ob in dem gegebenen 3x3 gitter eine Ziffer bereits vorkommt, falls ja gibt sie den wert true
{
int spalte, reihe;
for (spalte=0; spalte < 3; spalte++)
for (reihe=0; reihe < 3; reihe ++)
if (feld [reihenanfang+reihe] [spaltenanfang+spalte] == zahl)
return true;
return false;
}
bool ist_legal(int feld [9] [9], int reihe, int spalte, int zahl ) //überprüft ob es legal wäre in ein bestimmtes feld, welches sich in einem bestimmten gitter befindet, eine zahl einzusetzen
{
return !in_reihe_vorhanden(feld, reihe, zahl) &&
!in_spalte_vorhanden(feld, spalte, zahl) &&
!im_gitter_vorhanden(feld, reihe-reihe%3, spalte-spalte%3, zahl);
}
void printFeld(int feld[9][9])
{
int spalte, reihe;
for ( reihe = 0; reihe < 9; reihe++)
{
for (spalte = 0; spalte < 9; spalte++)
printf("%2d", feld[reihe][spalte]);
printf("\n");
}
}
int main()
{
int feld[9][9] = {{3, 0, 6, 5, 0, 8, 4, 0, 0},
{5, 2, 0, 0, 0, 0, 0, 0, 0},
{0, 8, 7, 0, 0, 0, 0, 3, 1},
{0, 0, 3, 0, 1, 0, 0, 8, 0},
{9, 0, 0, 8, 6, 3, 0, 0, 5},
{0, 5, 0, 0, 9, 0, 6, 0, 0},
{1, 3, 0, 0, 0, 0, 2, 5, 0},
{0, 0, 0, 0, 0, 0, 0, 7, 4},
{0, 0, 5, 2, 0, 6, 3, 0, 0}};
if (loese(feld) == true)
printFeld(feld);
else
printf("Es gibt keine Lösung");
return 0;
}
#包括
#包括
#包括
布尔·芬德·里尔斯·费尔德(国际费尔德[9][9]、国际雷厄、国际斯帕尔特);
bool ist_legal(int feld[9][9]、int rehie、int spalte、int zahl);
bool loese(int feld[9][9])///steuert den ablauf der einzelnen funktionen um das sudoku zu lösen
{
内特扎尔、斯帕尔特、赖赫;
int*pspalte,*preihe;
psparte=&spalte;
preihe=&reihe;
如果(!finde_leeres_feld(feld,preihe,pspalte))//wenn wir kein leeres feld finden sind wir fertig
返回true;
对于(zahl=1;zahl
与使用&
操作符直接传递指向spalte
和reihe
的指针不同:
int zahl, spalte, reihe;
if (!finde_leeres_feld(feld, &reihe, &spalte))
使用调试器运行您的程序,调试器将告诉您程序在哪里崩溃。注意:正如您从löse
中看到的,在程序代码中使用英文名称通常是更好的方式。它还可以帮助stack overflow等国际问答网站上的用户更好地理解您的代码。最好是用英文编写所有代码,包括Commonts.@Michael Walz已经这样做了,它在finde_leeres_feld崩溃了(我猜是Hanks,我初始化了spalte,但它没有崩溃。调试器可能会告诉我这一点,但我以前从未与调试器一起工作过(从未学会如何)所以我真的不明白它说的是什么。@Proximus好吧,现在是学习的时候了。它没有那么复杂,而且节省了很多时间。我这样做是因为我不知道它是如何工作的,我想确保我做的有点正确
int zahl, spalte, reihe;
int *pspalte, *preihe;
pspalte=&spalte;
preihe=&reihe;
if (!finde_leeres_feld(feld, preihe, pspalte))
int zahl, spalte, reihe;
if (!finde_leeres_feld(feld, &reihe, &spalte))