Oppure

Loading
02/12/08 18:59
luke1992
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:

81.208.32.83/ioi-site/pn/html/…

E poi ecco il codice che ho scritto per risolverlo:

#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char *argv[])
{
    char move[10^5];
    ifstream in ("input.txt");
    ofstream out ("output.txt");
    for (long int i=0;move[i-1] != '*';i++) in >> move [i];
    long int x=0,y=0;
       for (long int k=0;move [k-1] != '*';k++){
           if ( move [k] == 'N' ) y = y + 1;
           if ( move [k] == 'S' ) y = y - 1;
           if ( move [k] == 'E' ) x = x + 1;
           if ( move [k] == 'O' ) x = x - 1;
           }
    out << (x*x) + (y*y);
    out.close();
    in.close();
    return 0;
}


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-|
aaa
03/12/08 8:32
gioser
Postato originariamente da luke1992:

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



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

Ciao :)
aaa
12/12/08 14:47
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:
...
char *move;
ifstream in("input.txt");
f.seekg(0,ios::end);
int len=f.teelg();
f.seekg(0,ios::beg);
move=new char[len];
/*
 char move[len];
*/
...codice...
delete [] move;
Ultima modifica effettuata da 12/12/08 14:48