[risolto][C] strtok + buffer = errore di segmentazione

di il
17 risposte

[risolto][C] strtok + buffer = errore di segmentazione

Purtroppo non risco a capire l' "errore di segmentazione (core dump creato)" che ricevo:

Questo codice che tiporto qui sotto funziona benone:

void *delcacchi(void)
}
FILE *fp;
char readbuf[80];
......................

fp = fopen(FIFO_FILE, "r"); // now open the fifo file
}

printf("Receiving...\n");

// while we can read (up to 9) chars from the fifo...
// Note: readbuf[] will be nul-terminated and will
// include any newlines read from the pipe. since
// we are reading so few bytes at once (9) it will
// take several iterations of the 'while loop' to read
// any long lines written to the pipe by clients.
while(NULL != fgets(readbuf, 10, fp))
{
// print the string just read to my stdout
printf("%s", readbuf);
fflush(stdout);
}

fclose(fp); // close the fifo file

remove(FIFO_FILE); // delete the fifo file

fprintf(stderr, "Pipe server terminating.\n");

return(0);
}

mentre questo che dovrebbe essere suo gemello .... con l'aggiunta delle funzioni strtok ... mi blocca il pgr e mi genera "OOOOrrore di segmentazione (core dump creato) " :


void *delcacchi(void)
}
FILE *fp;
char readbuf[80];
char *rf1, *rf2;

...........
fp = fopen(FIFO_FILE, "r"); // now open the fifo file
}

printf("Receiving...\n");

// while we can read (up to 9) chars from the fifo...
// Note: readbuf[] will be nul-terminated and will
// include any newlines read from the pipe. since
// we are reading so few bytes at once (9) it will
// take several iterations of the 'while loop' to read
// any long lines written to the pipe by clients.
while(NULL != fgets(readbuf, 10, fp))
{
// print the string just read to my stdout
printf("%s", readbuf);

rf1 = strtok(readbuf, " ");
rf2 = strtok(0, " ");

py1 = atof ( rf1);
pz1 = atof ( rf2);
//printf("%f\n", py1);
//printf("%f\n", pz1);

//goto ridipingi;
fflush(stdout);

}

fclose(fp); // close the fifo file

remove(FIFO_FILE); // delete the fifo file

fprintf(stderr, "Pipe server terminating.\n");
return (0);

}

Qualche buon'anima riuscirebbe a illuminarmi??

17 Risposte

  • Re: [risolto][C] strtok + buffer = errore di segmentazione

    Controlla se, quando fai le atof, uno dei due puntatori (rf1 o rf2) non sia NULL.
  • Re: [risolto][C] strtok + buffer = errore di segmentazione

    int main(void)
    {
    char *s = "stringa"; /* s è un puntatore ad una stringa posizionata nel segmento di
    sola lettura dell'eseguibile.
    Quando il programma viene caricato, questo segmento è
    generalmente mappato dal sistema operativo in una zona
    della memoria di sola lettura */

    *s = 'a'; /* questo tenta di scrivere nella memoria di sola lettura,
    causando l'errore di segmentazione */
    return 0;
    }
    questa cosa scritta nel wiki dici che non centra nulla?
  • Re: [risolto][C] strtok + buffer = errore di segmentazione

    Dipende da come hai dichiarato readbuf ...
  • Re: [risolto][C] strtok + buffer = errore di segmentazione

    Quello che vedo è che al primo giro di while ottengo i risultati sperati (rf1 e rf2 passano il valore a pz1 e py1) al secondo ottengo "errore di segmentazione" .... in che modo i puntatori *rf1 e *rf2 potrebbero essere NULL?? io non li cancello


    ABBIMO POSTTO QUAI IN CONTEMPORANEA .... ti rispondo
    char readbuf[80];
  • Re: [risolto][C] strtok + buffer = errore di segmentazione

    Potrebbero essere nulli perché tu presumi che ci siano due valori separati ma non ci sono.

    Inserisci delle if così
    
    if(rf1) py1 = atof ( rf1) else py1 = 0;
    if(rf2) pz1 = atof ( rf2) else pz1 = 0;
    
    Se l'errore non si verifica allora vuol dire che ci sono casi in cui uno dei due puntatori (o tutti e due) sono NULL. Magari quando leggi una linea vuota dal file.
  • Re: [risolto][C] strtok + buffer = errore di segmentazione

    In effetti ..... ora il problema non c'è più. Però questo problema non dovrebbe mica esserci!

    buffer contiene una stringa che cambia continuamente in real-time ..... la stringa è composta da float1" "float2 .... che poi scompongo di nuovo in py1 e pz1 che sono dei float. In questo modo pensavo di risolvere il problema del sincronismo delle terne di coordinate (float1 e 2 sono coppie di coordinate rilevate con un programma in C++ in real time), ma se a volte una delle due coppie contiene un valore NULL .... mi sono fregato.

    Come posso capire se il problema viene da "buffer" o dal programma che mi spedisce la stringa nella fifo?
  • Re: [risolto][C] strtok + buffer = errore di segmentazione

    Quando scrivi

    // print the string just read to my stdout
    printf("%s", readbuf);

    vuol dire che dovresti vedere tutte le stringhe ricevute. Noti qualche stringa che non sia nel formato che dovrebbe avere ?
  • Re: [risolto][C] strtok + buffer = errore di segmentazione

    Mi rispondo da solo .... usando printf sul pgr in C e su quello in C++.... ho visto che è il programma in C quello che ha "readbuf" da scomporre in py1 e pz1 che ha problemi e che è sempre sempre py1 a ritornare una volta sì e una no il valore 0.0 ..... proprio ad intervalli regolari ... valore-0.0-valore-0.0-valore .... e così via .... per comodità riporto lo spezzone:
        void *delcacchi(void)
        }
        FILE *fp;
        char readbuf[80];
        char *rf1, *rf2;
    
        ...........
        fp = fopen(FIFO_FILE, "r"); // now open the fifo file
        }
    
        printf("Receiving...\n");
    
        // while we can read (up to 9) chars from the fifo...
        // Note: readbuf[] will be nul-terminated and will
        // include any newlines read from the pipe. since
        // we are reading so few bytes at once (9) it will
        // take several iterations of the 'while loop' to read
        // any long lines written to the pipe by clients.
        while(NULL != fgets(readbuf, 10, fp))
        {
        // print the string just read to my stdout
        //printf("%s", readbuf);
    
        rf1 = strtok(readbuf, " ");
        rf2 = strtok(0, " ");
    
        if (rf1) {py1 = atof ( rf1);} else {py1 = py1;}
        if (rf2) {pz1 = atof ( rf2);} else {pz1 = pz1;}
    
        printf("%f ", py1);
        printf("%f\n", pz1);
    
        //goto ridipingi;
        fflush(stdout);
    
        }
    
        fclose(fp); // close the fifo file
    
        remove(FIFO_FILE); // delete the fifo file
    
        fprintf(stderr, "Pipe server terminating.\n");
        return (0);
    
        }
    
    
    da cosa può derivare l'inghippo? .... tenendo presente l'output (che metto come esempio di fantasia)
    
    0.00 2.10
    1.30 2.11
    0.00 2.12
    1.35 2.15
    0.00 2.15
    1.45 2.15
    0.00 2.25
    1.50 2.25
    questo è quello che vedo (tenendo conto della mole di dati che arrivano .... vedere è una cattiva approssimazione ... diciamo che mi sembra ci sia questa tendenza e di sicuro py1 un giro è a 0 e uno no)......qualche idea? credo di avere toppato sul readbuff ma non vedo come.
  • Re: [risolto][C] strtok + buffer = errore di segmentazione

    Di nuovo risposte in contemporanea...... grazie AVANZI UNA MEGABIRRA ....

    allora ora il print sul buffer l'ho tolto .... ma quando c'era vedevo tutto ok .... ora però in seguito a quello che ho visto l'ho rimesso e mi sono accorto per esempio che l'ultima stringa, invece di essere "2.09 2.xx" era "2.09 2" ... come interpreta atof questa situazione?
  • Re: [risolto][C] strtok + buffer = errore di segmentazione

    giorgiofoga ha scritto:


    Di nuovo risposte in contemporanea...... grazie AVANZI UNA MEGABIRRA ....
    Beh, io la bevo veramente la megabirra ...
    era "2.09 2" ... come interpreta atof questa situazione?
    Va bene ... il problema è se manca uno dei due numeri o se non c'è lo spazio.

    Prova a scrivere, al posto della printf
    
    if(!rf1 || !rf2) printf("ERRORE: %s\n", readbuf);
    
  • Re: [risolto][C] strtok + buffer = errore di segmentazione

    Mi stampa errore: e il readbuf corretto ... se metto solo !rf1 ... non stampa nulla ... se metto solo !rf2 stampa errore: e il readbuf corretto .... non ci capisco
  • Re: [risolto][C] strtok + buffer = errore di segmentazione

    Scusami ... devi porre quella linea *dopo* le strtok.
  • Re: [risolto][C] strtok + buffer = errore di segmentazione

    Avevo già provato:

    mi stampa errore senza nessun valore di readbuf .... sembra che readbuf sia vuoto ma dovrebbe essere così, in quel punto, da quel che ho capito dopo ogni strtok il readbuf viene "epurato" di un pezzo di stringa, l'ultima epurazione dovrebbe metterlo a vuoto ..... giusto?
    Appena la pipe ci riscrive dentro ... riparte il ciclo while .... le strtok .... e il resto

    è anche vero .... che se segna errore ha visto una !rf1 oppure una !rf2 quindi ..... nel readbuf o ci sono troppi " " o troppo pochi oppure dei valori tipo \0 (fine stringa) male interpretati .....
  • Re: [risolto][C] strtok + buffer = errore di segmentazione

    Se fai altri controlli con printf diverse vedrai che qualche volta c'è solo il primo valore e non il secondo e a volte neanche il primo. Il perché non lo so, ma la causa del problema è questa.

    Ad esempio, dopo le strtok scrivi
    
    if(!rf1) printf("MANCA IL PRIMO VALORE\n");
    if(!rf2) printf("MANCA IL SECONDO VALORE\n\n");
    
Devi accedere o registrarti per scrivere nel forum
17 risposte