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++ - Dov'è l'errore?
Forum - C/C++ - Dov'è l'errore?

Avatar
XBarboX (Member)
Guru


Messaggi: 945
Iscritto: 31/12/2008

Segnala al moderatore
Postato alle 12:30
Sabato, 30/10/2010
Ciao,
sto facendo un semplice programma: muovere un "#" dentro alla console.

Ecco il sorgente:
Codice sorgente - presumibilmente C++

  1. #include<iostream>
  2. #include<fstream>
  3. using namespace std;
  4.  
  5. const int width=50;
  6. const int height=15;
  7.  
  8. bool mappa[height][width];
  9. int x;
  10. int y;
  11.  
  12. void Azzera(){
  13.      for(int i=1; i<=height; i++){
  14.              for(int j=1; j<=width; j++){
  15.                      mappa[i][j]=false;
  16.                      }
  17.              }
  18.      }
  19.      
  20. void Stampa(){
  21.      for(int i=1; i<=height; i++){
  22.              for(int j=1; j<=width; j++){
  23.                      if(mappa[i][j])cout<<"#";
  24.                      else cout<<"-";
  25.                      }
  26.              cout<<endl;
  27.              }    
  28.      }
  29.  
  30. int main(){
  31.     Azzera();
  32.     x=25;
  33.     y=8;
  34.     mappa[y][x]=true;
  35.     Stampa();  
  36.     system("pause");
  37.     return 0;
  38.     }



Praticamente è ancora una bozza mancano le funzioni per gestire lo spostamento del "#". Comunque capita un errore "strano" (magari è solo distrazione ma non capisco dov'è l'errore)
Dovrebbe stampare alla coordinate x=25 e y=8 il carattere "#" e per tutto il resto della mappa il carattere "-". Eppure a me l'output esce così:
http://img530.imageshack.us/img530/2231/immagine123.png
Non capisco come mai vengano stampati due "#" senza motivo.

p.s. Se stampo subito dopo la funziona Azzera() tutta la mappa è piena di "-", quindi non è un errore delle funzioni Azzera o Stampa

PM
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Up
1
Down
V
Segnala al moderatore
Postato alle 14:43
Sabato, 30/10/2010
non ho guardato bene il motivo dell'errore, ma posso dirti che non puoi loopare su un array in quel modo
se hai un array di 20 elementi ad esempio, il primo elemento ha indice 0 mentre l'ultimo 19, tu invece vai da 1 a 20
Ti ho riscritto il codice, IMO adesso è più comprensibile( anche se si potrebbe migliorare ancora )
Codice sorgente - presumibilmente C++

  1. #include<iostream>
  2. #include<fstream>
  3. using namespace std;
  4.  
  5. const int width=50;
  6. const int height=15;
  7.  
  8. void Azzera( bool mappa[height][width] )
  9. {
  10.    for(int i=0; i<height; i++)
  11.    {
  12.       for(int j=0; j<width; j++)
  13.       {
  14.          mappa[i][j]=false;
  15.       }
  16.    }
  17. }
  18.      
  19. void Stampa( bool mappa[height][width] )
  20. {
  21.    for(int i=0; i<height; i++)
  22.    {
  23.       for(int j=0; j<width; j++)
  24.       {
  25.          if(mappa[i][j]==true)
  26.             cout<<"#";
  27.          else
  28.             cout<<"-";
  29.        }
  30.        cout<<endl;
  31.    }    
  32. }
  33.  
  34. int main()
  35. {
  36.     bool mappa[height][width];
  37.    
  38.     Azzera( mappa );
  39.     mappa[8][25]=true;
  40.     Stampa( mappa );  
  41.    
  42.     cin.get();
  43.     return 0;
  44. }


PM
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 14:04
Sabato, 30/10/2010
Codice sorgente - presumibilmente C++

  1. #include<iostream>
  2. #include<fstream>
  3. using namespace std;
  4.  
  5. const int width=50;
  6. const int height=15;
  7.  
  8. bool mappa[height][width];
  9. int x;
  10. int y;
  11.  
  12. void Azzera(){
  13.      for(int i=1; i<=height; i++){
  14.              for(int j=1; j<=width; j++){
  15.                      mappa[i][j]=false;
  16.                      }
  17.              }
  18.      }
  19.      
  20. void Stampa(){
  21.      for(int i=1; i<=height; i++){
  22.              for(int j=1; j<=width; j++){
  23.                      if(mappa[i][j] == false) {
  24.                                                  cout<<"-";
  25.                                                  } else {
  26.                                                   cout<<"#";
  27.                                           }
  28.                                   }
  29.              cout<<endl;
  30.              }    
  31.      }
  32.  
  33. int main(){
  34.     Azzera();
  35.     x=25;
  36.     y=8;
  37.     mappa[y][x]=true;
  38.     Stampa();  
  39.     getchar();
  40.     return 0;
  41.     }


:k: modificando in questo modo il codice funziona non so perchè prima non funzionava. Suggerimenti?

Ultima modifica effettuata da Pitagora il 30/10/2010 alle 14:48
PM
Avatar
carmine (Member)
Pro


Messaggi: 168
Iscritto: 20/04/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 11:13
Domenica, 31/10/2010
per far muovere un carattere sullo schermo puoi usare la gotoxy(int x,int y)
mettendo in un ciclo la coordinata che cresce con un rallentamento e il gioco è fatto! se vuoi saperne di più ti posto la procedura! ciao!!!

PM
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 14:10
Domenica, 31/10/2010
Testo quotato

Postato originariamente da carmine:

per far muovere un carattere sullo schermo puoi usare la gotoxy(int x,int y)
mettendo in un ciclo la coordinata che cresce con un rallentamento e il gioco è fatto! se vuoi saperne di più ti posto la procedura! ciao!!!

Posta, interessa anche a me! Ma la funzione gotoxy è solo del C++?

PM
Avatar
carmine (Member)
Pro


Messaggi: 168
Iscritto: 20/04/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 14:48
Domenica, 31/10/2010
Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include <windows.h>
  3. #include <conio.h>
  4. using namespace std;
  5.  
  6. void gotoxy(int x,int y);  //gotoxy  strutturata gotoxy(colonna,riga)
  7.  
  8. int main()
  9. {
  10.      int col=20, rig=2,tasto=0;  
  11.     //per farlo muovere fai cosi
  12.    
  13.     do
  14.     {
  15.         if(kbhit()) tasto=getch();   //leggo il tasto per uscire con ESC
  16.         gotoxy(col,rig); putch('#');  //cancello
  17.         _sleep(30);     //ritardo la scrittura per effetto camminamento
  18.         gotoxy(col,rig); putch(' ');  //scrivo
  19.        
  20.         col++;  //incremento la riga
  21.         if(col == 75) { col =1; }
  22.  
  23. }while(tasto!=27);    //27 è ESC
  24. getch();
  25. return 0;
  26. }
  27.  
  28. void gotoxy(int x,int y)
  29. {
  30.     COORD coor;
  31.     HANDLE hOutput;
  32.     hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
  33.     coor.X = x;
  34.     coor.Y = y;
  35.     SetConsoleCursorPosition(hOutput,coor);
  36. }



anche in c funziona solo che il ritardo è delay(millisecondi) inclusa nella libreria dos.h, inoltre il c dovrebbe avere nella conio.h gia inclusa la gotoxy in caso contrario aggiungi la libreria windows.h e la procedura ke ti ho scritto spero di averti aiutato ciaoo

Ultima modifica effettuata da carmine il 31/10/2010 alle 14:51
PM