Codice compilato correttamente, ma eseguibile non dà output

di il
9 risposte

Codice compilato correttamente, ma eseguibile non dà output

Salve a tutti, il seguente codice viene compilato senza errori sia su Windows che su Mac OS X, ma su Mac OS X non fornisce alcun output quando viene lanciato l'eseguibile. Il programma dovrebbe leggere il file miofile.txt che si trova nella directory di root, dunque stampare la lista dei nomi scritti nel file, cosa che però non si vede. Uso il solito GCC 4.2.1 come compilatore, su Mac OS X 10.6. Come mai questo strano comportamento?
#include <iostream>
#include <stdio.h>
using namespace std;

int main()

{
   FILE* p = fopen("/miofile.txt","w");

    //scrivi
    fputs ("id;nome;cognome\n",p);
    fputs ("1;mario;rossi\n",p);
    fputs ("2;luigi;verdi\n",p);
    fputs ("3;anna;valle\n",p);
    fputs ("4;maria;riso\n",p);
    fputs ("5;maria;epochè\n",p);
    fputs ("6;maria;d'angiò\n",p);


    fclose (p);


   //leggi
    FILE* p2 = fopen("/miofile.txt","r");
    char riga[14];
    char* res;

    while(res!=NULL)
    {
        res=fgets(riga,14,p2);
        cout<<riga;
    }

    fclose(p2);

}
Ho notato una cosa: aggiungendo alla fine del codice
delete p2;
di nuovo non si hanno errori di compilazione, ma quando si lancia l'eseguibile si ottiene il messaggio malloc: *** error for object 0x7fff70840f60: pointer being freed was not allocated *** set a breakpoint in malloc_error_break to debug. Abort trap. Anche in questo caso, su Windows non ci sono problemi.

Grazie mille a chi vorrà darmi delucidazioni.

9 Risposte

  • Re: Codice compilato correttamente, ma eseguibile non dà output

    Ma a che serve la delete se non hai mai allocato dinamicamente della memoria?

    E' giusto avere un errore. Non credo proprio che con Windows non ci siano errori ... anzi ...
  • Re: Codice compilato correttamente, ma eseguibile non dà output

    Dimenticate la delete, è solo una prova che ho fatto io. Rimane il fatto che su Windows tutto funziona come dovrebbe, mentre quando compilo e lancio su Mac OS X, la lettura di miofile.txt non avviene (la creazione e la scrittura invece sì).
  • Re: Codice compilato correttamente, ma eseguibile non dà output

    Il puntatore res che utilizzi subito nella while non è mai stato inizializzato.

    Questo potrebbe far comportare diversamente i due sistemi. Se il valore di res viene posto a NULL dal compilatore, non entrerà mai nella while e non vedrai nulla. In caso contrario il ciclo verrà eseguito.

    L'errore è fidarsi del valore di res in quanto il C non prevede un valore certo.

    Ti consiglio di modificare il ciclo while.
  • Re: Codice compilato correttamente, ma eseguibile non dà output

    Grazie, ho risolto il problema! Bastava in effetti dare
    char* res = new char;
  • Re: Codice compilato correttamente, ma eseguibile non dà output

    No ... è sbagliato quel tipo di approccio ...

    Il codice corretto è
    
        char riga[20];
    	
        while(fgets(riga,20,p2))
            cout<<riga;
    
    senza utilizzare alcun puntatore, allocazione o altro.
  • Re: Codice compilato correttamente, ma eseguibile non dà output

    Bene, ti ringrazio, sto ancora imparando!
  • Re: Codice compilato correttamente, ma eseguibile non dà output

    Potresti spiegarmi esattamente perché il tuo approccio è migliore? E cosa significa una istruzione dentro il while? Apparentemente non ho una condizione vera e propria (con ==, !=, &&, || e simili)...
  • Re: Codice compilato correttamente, ma eseguibile non dà output

    Tu esegui una allocazione di memoria che poi non viene liberata, perdendo fra l'altro, il valore del puntatore originale e creando così un "memory leak" (ovviamente concentrati sul principio non sull'entità del problema, ovvero il leak di un char).

    Anche se nella condizione del while non c'è un operatore di confronto, quello che conta è il risultato ottenuto. E nel caso che ti ho mostrato il risultato che viene valutato è il valore restituito dalla fscanf tenendo presente che se il risultato è diverso da zero, viene inteso come true, se è uguale a zero (nel caso del puntatore restituito, se questo è NULL) viene inteso come FALSE.
  • Re: Codice compilato correttamente, ma eseguibile non dà output

    Ok, grazie!
Devi accedere o registrarti per scrivere nel forum
9 risposte