#c
#c
Вопрос:
Итак, вот мой код
int find_h(int i, int j, int current[N 1][N], int goal[N 1][N])
{
int sum=0;
int a, b;
int cp[N*3], gp[N*3];
for(a=0;a<N;a )
{
for(b=0;b<N;b )
{
cp[4*a b]=current[a][b];
gp[4*a b]=goal[a][b];
printf("b = %dn", b);
}
printf("n");
}
return sum;
}
N = 4, а current и goal заполняются числами от 0 до 15 включительно, появляясь только один раз каждое.
Он отлично выполняет первые 3 итерации (до a = 3), но затем продолжает выводить b = 0 навсегда.
Спасибо
Комментарии:
1. для чего используются cp и gp? кажется, сумма никогда не вычисляется
Ответ №1:
Я думаю, что ваш цикл перезаписывает память. если N = 4, то вы выделяете cp [12] и gp [12]. Тем не менее, когда a = 3 cp[4 * a b] и gp [4 * a b] оба являются [12], что превышает конец массива
Ответ №2:
Я не знаю, что вы хотите сделать, но я вам кое-что скажу: cp
и gp
слишком малы. Как написано, они должны быть большими N * N
вместо N * 3
(== 12).
Теперь, здесь cp[4*a b]
вы должны были написать N*a b
. Если N == 4
тогда это то же самое. В противном случае…
И это не ясно: int current[N 1][N]
это будет (с N == 4
) элементом массива 20. Затем вы копируете линеаризованный массив N * N
элементов (или, возможно N * 3
, см. Выше)…
Комментарии:
1. Ах! Спасибо! Я забыл изменить это, когда тестировал
2. Чтобы было ясно, почему это превратилось в бесконечный цикл, вполне вероятно, что либо
cp[13]
илиgp[13]
на самом деле указывало наb
(потому что это произошло сразу после этого массива в памяти), иcurrent[3][1]
илиgoal[3][1]
было0
, поэтому он продолжал устанавливатьb
значение0
неочевидным образом. Определенно неопределенное поведение.
Ответ №3:
Одна из проблем заключается в том, что cp
и gp
слишком малы. Вы присваиваете элементам с индексами до 4*(N-1) (N-1)
, но массивы имеют 3*N
длину только элементов.
Когда вы записываете дальше конца массива, поведение вашей программы не определено.
Ответ №4:
Похоже, вы переполняете буферы cp и gp. Вы должны выделять для них 4 * N места, а не 3 * N. Можете ли вы попробовать это изменить? Я бы так и сделал, но я далеко от своего компьютера.