Comportamento ambiguo

di il
11 risposte

Comportamento ambiguo

Ciao a tutti, vi espongo un problema abbastanza strano. Ho scritto un programma in C che fa un po' di cose e poi stampa una classifica (ordine decrescente del punteggio). La stampa viene fatta sia su console che su un file chiamato classifica.txt.
Su un PC con windows XP tutto funziona perfettamente.
Su un portatile con Ubuntu 11.10 la stampa della classifica è giusta a console e rovesciata su file.
Cambia qualcosa da win a linux nella gestione file?
Comunque posto il codice della stampa. Non credo sia l'approccio ottimale...ma funziona! O almeno dovrebbe...
void ordinata(clas head) {
     FILE* fp;
     fp=fopen("classifica.txt", "a");
     if(head==NULL) return;
     clas t=head;
     clas max=t;
     t=t->next;
     if(t==NULL) {
                 fprintf(fp, "%s %s   %d\n", max->nome, max->cognome, max->netto);
                 printf("%s %s   %d\n", max->nome, max->cognome, max->netto);
                 return;
                 }
     while(t!=NULL) {
        if(t->netto > max->netto) max=t;
        t=t->next;
     }
     fprintf(fp, "%s %s   %d\n", max->nome, max->cognome, max->netto);
     printf("%s %s   %d\n", max->nome, max->cognome, max->netto);
     if(head==max) {
                head=head->next;
                ordinata(head);
                return;
                }
     clas k=head;
     while(k->next!=max) k=k->next;
     k->next=max->next;
     free (max);
     t=head;
     max=head;
     if(head!=NULL) ordinata(head);
     else return;
     }
preciso che clas è un puntatore ad un elemento di tipo struct classifica.
Aspetto informazioni!

11 Risposte

  • Re: Comportamento ambiguo

    Cambia qualcosa da win a linux nella gestione file?
    L'unica cosa che cambia è il terminatore di linea. In linux hai solo LF (0x0a) mentre in windows hai CR + LF (0x0d+0x0a). Nel tuo caso è ininfluente
  • Re: Comportamento ambiguo

    Ho capito, quindi il problema resta...
  • Re: Comportamento ambiguo

    La funzione 'ordinata' viene chiamata in modo ricorsivo, apre il file 'fp' ma non lo chiude, questo causa sicuramente qualche problema.

    P.S. La cosa sarebbe balzata subito all' occhio se il codice fosse scritto in maniera più ordinata (gli spazi e gli a capo non costano niente).
  • Re: Comportamento ambiguo

    Ok, provo a inserire i vari fclose e vi so dire se ho risolto.
    Comunque non è strano che su linux ci sia il problema e su win no?
  • Re: Comportamento ambiguo

    Ok, volevo dirvi che ho risolto. Il problema era che ad ogni chiamata ricorsiva della funzione veniva dichiarato un nuovo
    FILE* fp
    e il file veniva riaperto senza mai essere chiuso.
    Soluzione:
    ho dichiarato globalmente
    FILE* fp
    l'ho aperto ancora prima di chiamare la funzione e l'ho chiuso dopo l'ultima chiamata. In questo modo non ci sono più problemi.
    Evidentemente win è un po' più "tollerante" su queste cose perchè non dava alcun problema, ma sicuramente così è più corretto.
    Grazie ancora a tutti. CIao ciao.
  • Re: Comportamento ambiguo

    I buffer dei file sono gestiti dal sistema operativo... ma a prescindere da questo, preferivi una situazione più tollerante ma errata nel concettualmente? Come dire non libero la memoria perché alla chiusura del programma viene automaticamente libera... bha
  • Re: Comportamento ambiguo

    No no infatti preferisco sempre la soluzione concettualmente più corretta!!
    volevo solo capire come mai c'era una differenza di comportamento così grandi tra i due sistemi operativi e adesso l'ho capito.
  • Re: Comportamento ambiguo

    Non credo si possa parlare di sistema tollerante o meno, in questi casi (gravi errori del programma, puntatori fuori range ecc.) i comportamenti sono per lo più imprevedibili e variabili. Quindi non aspettarti sempre lo stesso comportamento ne sotto Windows ne sotto Linux.
  • Re: Comportamento ambiguo

    Credo di essermi espresso male. Il riferimento era alla 'situazione', se vogliamo fortuita, che ha portato all'evidenza del problema. Aggiungo che oltre al debugging bisognerebbe fare un profiling. E quando lavoriamo sul serio: experimental, testing, unstable, stable e oldstable. Io ne so qualcosa in merito...

    That's all folks

    PS. Chi mi spia con Windows?
  • Re: Comportamento ambiguo

    ixamit ha scritto:


    Credo di essermi espresso male. Il riferimento era alla 'situazione', se vogliamo fortuita, che ha portato all'evidenza del problema. Aggiungo che oltre al debugging bisognerebbe fare un profiling. E quando lavoriamo sul serio: experimental, testing, unstable, stable e oldstable. Io ne so qualcosa in merito...

    That's all folks

    PS. Chi mi spia con Windows?
    Concordo. E poi hai usato il termine giusto 'fortuita', il problema è stato rilevato per puro caso, chissà quanti software girano con dentro errori simili. A onore di minomic va riconosciuro lo scrupolo di aver provato il programma in ambienti diversi.

    Per curiosità, cosa vuol dire che qualcuno ti spia con Windows?
  • Re: Comportamento ambiguo

    Per curiosità, cosa vuol dire che qualcuno ti spia con Windows?
    nessun problema, solo qualcuno curioso presente in questo thread che ha buttato un'occhio.
Devi accedere o registrarti per scrivere nel forum
11 risposte