Я пытаюсь реализовать алгоритм для угадывания секретов на 5 предположениях в Mastermind. Это присвоение класса, и я, в общем, несколько новичок в программировании (преуменьшение), поэтому, пожалуйста, проявляйте терпение с любыми очевидными вещами, которые я, возможно, пропустил. ПРИМЕЧАНИЕ. Единственной библиотекой, которую мне разрешено использовать, является <stdio.h>
.Нарушение прав доступа при доступе к массивам в функциях (внутри функции)
Для начала код:
#include <stdio.h>
#define feeddef() \
feed[0] = '0'; \
feed[1] = ' '; \
feed[2] = 'B'; \
feed[3] = ' '; \
feed[4] = '0'; \
feed[5] = ' '; \
feed[6] = 'C';
int secret[4];
void initSet(int (*gs)[4],int *gsGd,int *guess);
void goodGuess(int (*gs)[4],int *gsGd,char fb[20],int *guess);
void feedback(int *gues,char feed[20]);
void feedback(int *gues,char feed[20])
{
int i,j,temp[4], temp2[4];
feeddef();
for(i=0;i<4;i++)
{
temp[i] = gues[i];
temp2[i] = secret[i];
}
for(i = 0;i<4;i++)
if(temp[i] == temp2[i])
{
feed[0]++;
temp[i] = 7;
temp2[i] = 8;
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(temp[i] == temp2[j])
{
feed[4]++;
temp[i] = 9;
temp2[j] = 10;
}
}
void initSet(int (*gs)[4],int *gsGd,int *guess)
{
int i;
for(i=0;i<1296;i++)
{
gs[i][3] = i%6;
gs[i][2] = (i/6)%6;
gs[i][1] = ((i/6)/6)%6;
gs[i][0] = (((i/6)/6)/6)%6;
}
for(i=0;i<4;i++)
guess[i] = (i+2)/2;
}
void goodGuess(int (*gs)[4],int *gsGd,char fb[20],int *guess)
{
int i,j,count[1296],max_count = 0,max_index;
char fbck[1296][2];
char feed[20];
for(i=0;i<1296;i++)
{
printf("Guess #%d in set: ",i);
feedback(gs[i],feed);
if(feed[0] != fb[0] || feed[4] != fb[4])
{
printf("Not matching\n");
gsGd[i] = 0;
}
fbck[i][0] = feed[0];
fbck[i][1] = feed[4];
}
printf("minimax start---\n");
for(i=0;i<1296;i++)
{
count[i] = 0;
for(j=0;j<1296;j++)
{
if(gsGd[j] == 0)
continue;
else
{
if(fbck[i][0] != fbck[j][0] || fbck[i][1] != fbck[j][1])
count[i]++;
}
}
}
printf("---minimax end\n");
for(i=0;i<1296;i++)
printf("Index at %d cancels out %d indices.\n",i,count[i]);
for(i=0;i<1296;i++)
{
if(max_count < count[i])
{
printf("New max at index: %d\n",i);
max_count = count[i];
max_index = i;
}
}
printf("New guess is: ");
for(i=0;i<1296;i++)
{
if(fbck[i][0] != fbck[max_index][0] || fbck[i][1] != fbck[max_index][1])
gsGd[i] = 0;
}
for(i=0;i<4;i++)
{
guess[i] = gs[max_index][i];
printf("%d",guess[i]);
}
printf("\n");
}
int main()
{
int gs[1296][4],gsGd[1296],guess[4],i,count = 0;
char fback[20];
while(1)
{
for(i=0;i<4;i++)
scanf("%d",&secret[i]);
initSet(gs,gsGd,guess);
do
{
count++;
printf("Goodguess %d",count);
feedback(guess,fback);
goodGuess(gs,gsGd,fback,guess);
}while(fback[0] != '4');
printf("Solved in %d guesses\n",count);
}
return 0;
}
По какой-то причине на второй итерации функции goodGuess
я получаю сообщение об ошибке нарушения прав доступа на этой линии:
if(fbck[i][0] != fbck[max_index][0] || fbck[i][1] != fbck[max_index][1])
Ошибка:
First-chance exception at 0x012643a6 in Mastermind.exe: 0xC0000005: Access violation reading location 0x99b00cc0.
Unhandled exception at 0x012643a6 in Mastermind.exe: 0xC0000005: Access violation reading location 0x99b00cc0.
Как я понимаю, 0xC0000005 близок к нулю означает, что он, вероятно, пытается access null, но я понятия не имею, что вызывает его. Он работает отлично в первый раз.
У меня такое чувство, что я пропустил что-то жизненно важное, но я буду проклят, если узнаю, что это.
Ваш код не гарантирует инициализацию 'max_index'. Попробуйте установить его на 0 при его объявлении. – simonc
'0xC0000005' - это код Windows для исключения нарушения доступа (' STATUS_ACCESS_VIOLATION'), то есть вы получаете доступ к недопустимой ячейке памяти. И он не близок к нулю, это фактически 3221225477 в десятичной форме (обратите внимание на '0xC ...'). Фактическое недопустимое расположение памяти - '0x99b00cc0' – rodrigo