Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Mi è difficile individuare un errore
Forum - C/C++ - Mi è difficile individuare un errore

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Manu89 (Normal User)
Newbie


Messaggi: 12
Iscritto: 07/09/2009

Segnala al moderatore
Postato alle 23:44
Lunedì, 07/09/2009
Ciao! Non ho visto una sezione per presentarmi, però vabbè, sono nuovo comunque!
Sono un niubbo della programmazione e quindi ho trovato questo sito per caso perchè volevo saperne di più... Vedo gente più giovane di me, qui, che fa delle cose devastanti ^^ e io rimango spiazzato. Vabbè.
Comunque, volevo chiedere un aiuto per un programma che ho scritto che realizza una versione virtuale del gioco di forza4. Il programma funziona perfettamente tranne che per una sola cosa: si presenta il problema del segmentation fault quando si verifica la vittoria per diagonali di un tipo. Per favore, aiutatemi! Vi posto il codice:
(ho messo in grassetto la parte critica, non c'è bisogno di leggersi tutto il codice, l'ho fatto solo per completezza)


Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #define R 6
  3. #define C 7
  4. #define P1 '£'
  5. #define P2 'O'
  6. #define E ' '
  7.  
  8. char** generaTab(){
  9.         char **casella=(char**)malloc(sizeof(char*)*C);
  10.         int i,j;
  11.         for(i=0;i<C;i++){
  12.                 casella[i]=(char*)malloc(sizeof(char)*R);
  13.                 for(j=0;j<C;j++)
  14.                         casella[i][j]=E;
  15.         }
  16.         return casella;
  17. }
  18.  
  19. drawTab(char **casella){
  20.         int i,j;
  21.         printf("\t\t");
  22.         for(i=0;i<=C*4;i++)
  23.                 printf("-");
  24.         printf("\n");
  25.         for(i=0;i<R;i++){
  26.                 printf("\t\t");
  27.                 for(j=0;j<C;j++)
  28.                         printf("| %c ",casella[i][j]);
  29.                 i!=R-1?printf("|\n\n"):printf("|\n");
  30.         }
  31.         printf("\t\t");
  32.         for(i=0;i<=C*4;i++)
  33.                 printf("-");
  34.         printf("\n ");
  35.         printf("\t\t ");
  36.         for(j=1;j<=C;j++)
  37.                 printf(" %d  ",j);
  38.         printf("\n\n");
  39. }
  40.  
  41. int play(char** casella, char p){
  42.         int n;
  43.         int i;
  44.         char res='e';
  45.         do {
  46.                 do {
  47.                         scanf("%d",&n);
  48.                         if(n<1||n>C)
  49.                                 printf("Metti un numero adeguato\n");
  50.                 } while(n<1||n>C);
  51.                         for(i=R-1;i>=0;i--){
  52.                         if(casella[i][n-1]==E){
  53.                                 casella[i][n-1]=p;
  54.                                 res='o';
  55.                                 break;
  56.                         }
  57.                 }
  58.                 if(res=='e')
  59.                         printf("Colonna piena!\n");
  60.         } while(res=='e');
  61.         if(p==P1)
  62.                 i=2;
  63.         if(p==P2)
  64.                 i=1;
  65.         return i;
  66. }
  67.  
  68. char check(char** casella){
  69.         int i;
  70.         int j;
  71.         int w;
  72.         int k;
  73.         for(i=R-1;i>=0;i--){
  74.                 for(j=0;j<C-4;j++){
  75.                         if(casella[i][j]!=E && casella[i][j]==casella[i][j+1] && casella[i][j+1]==casella[i][j+2] && casella[i][j+2]==casella[i][j+3]){
  76.                                 for(w=j;w<j+4;w++)
  77.                                         casella[i][w]='W';
  78.                                 return casella[i][j];
  79.                         }
  80.                 }
  81.         }
  82.  
  83.         for(j=0;j<C;j++){
  84.                 for(i=R-1;i>2;i--){
  85.                         if(casella[i][j]!=E && casella[i][j]==casella[i-1][j] && casella[i-1][j]==casella[i-2][j] && casella[i-2][j]==casella[i-3][j]){
  86.                                 for(k=i;k>i-4;k--)
  87.                                         casella[k][j]='W';
  88.                                 return casella[i][j];
  89.                         }
  90.                 }
  91.         }
  92.  
  93.         for(i=0;i<3;i++){
  94.                 for(j=0;j<4;j++){
  95.                         if(casella[i][j]!=E && casella[i][j]==casella[i+1][j+1] && casella[i+1][j+1]==casella[i+2][j+2] && casella[i+2][j+2]==casella[i+3][j+3]){
  96.                                 for(k=i,w=j;k<i+4,w<j+4;k++,w++)
  97.                                         casella[k][w]='W';
  98.                                 return casella[i][j];
  99.                         }
  100.                 }
  101.         }
  102. [b]//qui si presenta l'errore
  103.         for(j=0;j<4;j++){
  104.                 for(i=R-1;i>2;i--){
  105.                         if(casella[i][j]!=E && casella[i][j]==casella[i-1][j+1] && casella[i-1][j+1]==casella[i-2][j+2] && casella[i-2][j+2]==casella[i-3][j+3]){
  106. //sembra che il problema sia qui, però non so dove
  107.                                 for(k=i,w=j;k>i-4,w<j+4;k--,j++)
  108.                                         casella[k][w]='W';
  109.                                 return casella[i][j];
  110.                         }
  111.                 }
  112.         }[/b]
  113.         return 'o';
  114. }
  115.  
  116. int main(){
  117.         char **casella=generaTab();
  118.         drawTab(casella);
  119.         int i=1;
  120.         char res;
  121.         while(i){
  122.                 if(i==1){
  123.                         printf("Turno Giocatore 1 (scegliere numero colonna): %c :",P1);
  124.                         i=play(casella,P1);
  125.                 } else if (i==2){
  126.                         printf("Turno Giocatore 2 (scegliere numero colonna): %c :",P2);
  127.                         i=play(casella,P2);
  128.                 }
  129.                 res=check(casella);
  130.                 printf("\n");
  131.                 drawTab(casella);
  132.                 if(res=='W' && i==2){
  133.                         printf("Vince il giocatore 1!\n");
  134.                         i=0;
  135.                 }
  136.                 if(res=='W' && i==1){
  137.                         printf("Vince il giocatore 2!\n");
  138.                         i=0;
  139.                 }
  140.         }
  141.         printf("\n\tGioco finito\n");
  142.         return 0;
  143. }


Ultima modifica effettuata da Manu89 il 08/09/2009 alle 15:41
PM Quote
Avatar
manvb.net (Member)
Guru


Messaggi: 663
Iscritto: 28/01/2008

Segnala al moderatore
Postato alle 13:39
Martedì, 08/09/2009
Ciao, benvenuto! Per postare del codice usa i teg code e poi quando devi scrivere casella[i ][j], metti uno spazio tra i e ] alrimenti [i ] non viene scritta e io non posso provare il codice.

PM Quote
Avatar
Manu89 (Normal User)
Newbie


Messaggi: 12
Iscritto: 07/09/2009

Segnala al moderatore
Postato alle 15:44
Martedì, 08/09/2009
ok, ho messo la tag code, ora non c'è più il grassetto, ma c'è l'unico commento del codice che aiuta ad individuare l'errore.8-)

PM Quote
Avatar
manvb.net (Member)
Guru


Messaggi: 663
Iscritto: 28/01/2008

Segnala al moderatore
Postato alle 16:14
Martedì, 08/09/2009
Ecco qua, scovato e corretto:

Codice sorgente - presumibilmente C/C++

  1. if(casella[i][j]!=E && casella[i][j]==casella[i-1][j+1] && casella[i-1][j+1]==casella[i-2][j+2] && casella[i-2][j+2]==casella[i-3][j+3]){
  2. //sembra che il problema sia qui, però non so dove
  3.                     //for(k=i,w=j;k>i-4,w<j+4;k--,j++)
  4.                     //il problema è nel for che termina sono quando le condizioni sono entrambe valide(E qui non lo vengono ad essere)
  5.                                     //perchè complicarsi la vita con for doppi
  6.                                     //se si può fare semplicemente così:
  7.                                     for(k=0;k<4;k++)
  8.                                                 casella[i-k][j+k]='W';
  9.                 return casella[i][j];
  10.             }



Leggi i commenti nel codice.

Ultima modifica effettuata da manvb.net il 08/09/2009 alle 16:15
PM Quote
Avatar
Manu89 (Normal User)
Newbie


Messaggi: 12
Iscritto: 07/09/2009

Segnala al moderatore
Postato alle 22:40
Martedì, 08/09/2009
Bene, ti ringrazio molto per la disponibilità :k:

PM Quote
Avatar
manvb.net (Member)
Guru


Messaggi: 663
Iscritto: 28/01/2008

Segnala al moderatore
Postato alle 1:58
Mercoledì, 09/09/2009
Di niente!:k: In una community open source, ci si aiuta sempre!

Ultima modifica effettuata da manvb.net il 09/09/2009 alle 2:00
PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 21:33
Giovedì, 10/09/2009
Testo quotato

Postato originariamente da manvb.net:

Di niente!:k: In una community open source, ci si aiuta sempre!



Concordo sul fatto che le community servono per aiutarsi, ma mi sfugge il concetto di "community open source" ...

PM Quote
Avatar
manvb.net (Member)
Guru


Messaggi: 663
Iscritto: 28/01/2008

Segnala al moderatore
Postato alle 1:52
Venerdì, 11/09/2009
Intendo una community che abbraccia la filosofia open source!

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 10:15
Venerdì, 11/09/2009
Testo quotato

Postato originariamente da manvb.net:

Intendo una community che abbraccia la filosofia open source!



Sì, ma ci si aiuta sempre in "qualsiasi" community ...

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo