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++ - Aiuto per un
Forum - C/C++ - Aiuto per un "errore di segmentazione".....

Avatar
luke1992 (Normal User)
Newbie


Messaggi: 4
Iscritto: 02/12/2008

Segnala al moderatore
Postato alle 19:59
Martedì, 02/12/2008
Allora, sto facendo gli allenamenti per le selezioni delle olimpiadi di informatica del 2009....P

Prima di tutto ecco il link del testo del problema:

http://81.208.32.83:8080/ioi-site/pn/html/modules.php?op=m ...

E poi ecco il codice che ho scritto per risolverlo:

Codice sorgente - presumibilmente C++

  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <fstream>
  4.  
  5. using namespace std;
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9.     char move[10^5];
  10.     ifstream in ("input.txt");
  11.     ofstream out ("output.txt");
  12.     for (long int i=0;move[i-1] != '*';i++) in >> move [i];
  13.     long int x=0,y=0;
  14.        for (long int k=0;move [k-1] != '*';k++){
  15.            if ( move [k] == 'N' ) y = y + 1;
  16.            if ( move [k] == 'S' ) y = y - 1;
  17.            if ( move [k] == 'E' ) x = x + 1;
  18.            if ( move [k] == 'O' ) x = x - 1;
  19.            }
  20.     out << (x*x) + (y*y);
  21.     out.close();
  22.     in.close();
  23.     return 0;
  24. }



Il problema è che finchè l'input è relativamente corto (15/20 caratteri) il programma viene eseguito ed è tutto a posto...

Se inserisco un input un po più lungo (per esempio 50 caratteri) il programma crasha.

Ho provato a fare un debug e compare una finestra di dialogo con scritto che il programma ha commesso un errore di segmentazione....


Mi aiutate per favore????? 8-|8-|8-|8-|8-|

PM Quote
Avatar
gioser (Normal User)
Pro


Messaggi: 111
Iscritto: 03/10/2008

Segnala al moderatore
Postato alle 9:32
Mercoledì, 03/12/2008
Testo quotato

Postato originariamente da luke1992:

Codice sorgente - presumibilmente C++

  1. for (long int i=0;move[i-1] != '*';i++)
  2.     for (long int k=0;move [k-1] != '*';k++)
  3. }





Quando l'indice è 0 cerchi di leggere move[-1], che è evidentemente sbagliato.

Ciao :)

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 15:47
Venerdì, 12/12/2008
forse superi la capacità massima di move...
infatti l'errore di segmentazione (segmentation fault) indica che hai invaso un'area di memoria non in uso da programma...
forse facendo 10^5 volevi creare una stringa di 10 alla 5 di lunghezza, ma ^ è un operatore binario XD
Poi non credo che sia possibile istanziare variabili di una simile lunghezza :rotfl:
usa i metodi seekg e tellg per creare una stringa delle stesse dimensioni del file:
Codice sorgente - presumibilmente C/C++

  1. ...
  2. char *move;
  3. ifstream in("input.txt");
  4. f.seekg(0,ios::end);
  5. int len=f.teelg();
  6. f.seekg(0,ios::beg);
  7. move=new char[len];
  8. /*
  9.  char move[len];
  10. */
  11. ...codice...
  12. delete [] move;


Ultima modifica effettuata da il 12/12/2008 alle 15:48
PM Quote