2013-12-11 163 views
0

我想实现的算法在策划最多5个猜测猜测的秘密。这是一个班级任务,一般来说,我对编程有点新颖(轻描淡写),所以请耐心等待我可能错过的任何明显的事情。注意:我允许使用的唯一的库是<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接近于null意味着它可能试图访问null,但我不知道是什么原因导致它。它在第一次结束时工作得很好。

我有我错过了什么重要的感觉,但如果我知道它是什么,我会被定罪。

+0

您的代码不保证初始化'max_index'。尝试在声明时将其设置为0。 – simonc

+0

'0xC0000005'是访问冲突异常('STATUS_ACCESS_VIOLATION')的Windows代码,即您正在访问无效的内存位置。它不是接近于null,它实际上是十进制的3221225477(注意'0xC ...')。实际无效的内存位置是“0x99b00cc0” – rodrigo

回答

1

我的猜测是,max_index未初始化。

当你创建MAX_INDEX的代码不分配一个值。你只在if语句中分配一个值。所以在第一次迭代时,if语句找到了真,并且你得到了一个max_index的值。在第二次迭代中,它没有找到真实的,并且max_index是非理性的。

有一件事我会在这样的情况下建议 - 你有一个相当复杂的语句。所以很高兴看到四个中的哪一个失败。因此,只需创建四个小任务语句 - 例如(fbck [i] [0] == 1)printf(“hi”)。

这可以让你缩小到该声明的一部分出现故障。它还有助于在运行中打印每个变量的值 - 然后您可以运行代码,查看打印的最后一行,并且您将能够看到我和max_index是什么,这应该是一个巨大的线索关于发生了什么事。

而当你了解更多的调试和条件断点,你会发现比打印变量更好的办法!

0
if(fbck[i][0] != fbck[max_index][0] || fbck[i][1] != fbck[max_index][1]) 

max_index可以在上述表达式中使用未初始化。