2013-12-11 208 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可以在上述表達式中使用未初始化。