Я пытаюсь написать простой алгоритм C++ для решения судоку. Я пытаюсь передать значения адреса между различными функциями, но во время выполнения получаю ошибку сегментации. (Излишне говорить, что я не совсем опытен :))
Коду удается передать адрес a[0] в основную функцию, и я могу читать значения, используя указатели внутри main. Когда я пытаюсь передать адрес для решения функции, это дает ошибку сегментации.
(Также в качестве второстепенного вопроса я могу правильно читать значения в main, правильно используя cout ‹‹ *(a+5) и т. д. (закомментировано в main), но когда я пытаюсь напечатать все 81 значение, сохраненное с помощью цикла for, он выдает бессмысленные значения (опять же, закомментированные в коде).Код работает с литералами, такими как *(a+3) или a[3], но не работает, когда int используется для (int i, что угодно) cout ‹‹ *(а+я);)
#include <iostream>
using namespace std;
int * get_input();
void solve(int *);
int main()
{
int * a;
a = get_input();
//cout << *a << " " << *(a+1) << " " << *(a+2) << " " << *(a+3) << " " << *(a+4);
//for (int i = 0 ; i < 81 ; i++) {if (i%9 == 0) cout << "\n"; cout << a[i] << " ";}
solve(a);
return(0);
}
int * get_input ()
{
int a[81];
getinput:
for (int i = 0 ; i < 81 ; i++) {a[i] = 0;}
for (int i = 0 ; i < 81 ; i++) {cin >> a[i];}
print:
for (int i = 0 ; i < 81 ; i++)
{
if (i%27 == 0){cout << "\n";}
if (i%9 == 0) {cout << "\n";}
if (i%3 == 0) {cout << " " << a[i];}
if (i%3 != 0) {cout << a[i];}
}
cout << "\n\nCheck:\n1- Fix\n2- Reset\n3- Confirm\n\n";
int check = 0;
cin >> check;
if (check == 1)
{
int input[3] = {-1, -1, -1};
while (true)
{
cin >> input[0] >> input[1] >> input [2];
if (input[1] == 0) goto print;
a[(input[2]-1)+((input[1]-1)*9)] = input[0];
}
}
if (check == 2) goto getinput;
if (check == 3) return a;
}
void solve(int * a)
{
bool matrix[9][9][9];
for (int i = 0 ; i < 81 ; i++) {for (int j = 0 ; j < 9 ; j++) {matrix[(i-i%9)/9][i%9][j] = true;}}
for (int i = 0 ; i < 81 ; i++)
{
if (a[i] == 0) continue;
else
{
for (int j = 0 ; j < 9 ; i++)
{
matrix[(i-i%9)/9][j][a[i]] = false;
matrix[j][i%9][a[i]] = false;
matrix[((i-i%9)/9)-((i-i%9)/9)%3+j%3][i%9-(i%9)%3+(j-j%3)/3][a[i]] = false;
}
}
}
for (int i = 0 ; i < 9 ; i++)
{
for (int j = 0 ; j < 9 ; j++)
{
cout << matrix[i][j][1] << " ";
}
cout << "\n";
}
}
return a
вget_input
. Вы не можете вернуть указатель на переменную стека, вместо этого выделите его с помощьюmalloc
/new
и верните его. - person slugonamission   schedule 18.02.2013goto
, ... вы уверены, что имели в виду C++? - person Angew is no longer proud of SO   schedule 18.02.2013