2011-10-29 5 views
1

Так вот мой код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 = %d\n", b); 
    } 
    printf("\n"); 
    } 
    return sum; 
} 

N = 4 и тока и цели заполняются числами от 0 до 15 включительно, появляются только один раз.

Он обрабатывает первые три итерации (до a = 3), но затем сохраняет вывод b = 0 навсегда.

Благодаря

+0

Что такое cp и gp? кажется, сумма никогда не рассчитывается –

ответ

1

Я не знаю, что вы хотите сделать, но я скажу вам кое-что: 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, см. Выше) ...

+0

А! Благодаря! Я забыл изменить это, когда тестировал – Kamran224

+1

Чтобы понять, почему это превратилось в бесконечный цикл, вполне вероятно, что либо 'cp [13]', либо 'gp [13]' фактически указывал на 'b' (потому что он оказался после этого массива в памяти), а 'current [3] [1]' или 'goal [3] [1]' был '0', поэтому он сохранял установку' b' '0 ' -образный путь. Определенно неопределенное поведение. –

2

Я думаю, что ваша петля перезаписывает память. если N = 4, вы выделяете cp [12] и gp [12]. Тем не менее, когда a = 3 cp [4 * a + b] и gp [4 * a + b] оба являются [12], которые находятся за концом массива

1

Одна из проблем заключается в том, что cp и gp слишком малы. Вы назначаете элементы с индексами до 4*(N-1)+(N-1), но массивы составляют только 3*N элементов.

Когда вы пишете прошлое конца массива, поведение вашей программы не определено.

0

Похоже, вы переполняете буферы cp и gp. Вы должны выделить для них пространство 4 * N, а не 3 * N. Можете ли вы попробовать изменить это? Я бы, но я далеко от компьютера.

Смежные вопросы