Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    18

    [ANSI C] - cosa sbaglio?

    ciao a tutti,
    ho scritto questo semplice codice C, funziona tutto, ho messo anche le linee di printf per fare un po di debug ma nella linea indicata dalla freccia il programmino va in core.
    La funzione messaggio è una sciocchezza, alloca semplicemente l'array di una dimensioni pari a 100 con malloc, stampo a video i valori ed è tutto ok.

    Cosa può essere.

    Vi ringrazio in anticipo.

    /* ---------------------------------------------------------- */

    int main(int argc, char *argv[])
    {

    char *msg;
    int iRet;

    iRet = messaggio( &msg );

    if ( iRet == 0 )
    {
    printf( "allocazione da funzione ok!\n" );
    if ( msg )
    printf( "VALORE : [%s]\n", msg ); /* <--- */
    else
    printf( "qlc non va!" );

    }
    else
    printf( "allocazione non riuscita!..." );

    free( msg );

    return 0;

    }

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Originariamente inviato da gokuddf
    ciao a tutti,
    ho scritto questo semplice codice C, funziona tutto, ho messo anche le linee di printf per fare un po di debug ma nella linea indicata dalla freccia il programmino va in core.
    Che significa "va in core"? :master:

    Usa titoli più significativi per le tue discussioni.
    Questo lo correggo io...

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    sicuro di aver allocato bene il vettore di caratteri nella funzione?
    il problema potrebbe essere li...di solito il programma crasha sulla printf quando il puntatore nn punta a una locazione valida. Probabilmente la funzione non ha allocato la memoria, e tu non gli hai assegnato NULL, per cui punta a una locazione indefinita, creando quello che dovrebbe essere il segmentation fault.

    Sarebbe utile per capire, se postassi anche il codice della funzione...

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    18
    > Che significa "va in core"?

    Su sistemi di tipo UNIX quando si sviluppa in ANSI C ( o altro... C++ ad esempio ) e un eseguibile contiene un errore tipo il mio che tenta di accedere ad una locazione di memoria inesistente ( a quanto pare ) il sistema genera un file chiamato proprio "core" che contiene in formato esadecimale l'ultimo blocco eseguito dal processo interessato permettendoti di scovare la riga dell'errore.
    Per analizzare tutto ciò nel file core si usa una utility chiamata GDB ( che non è una utility di Firebird ).


    > Usa titoli più significativi per le tue discussioni.
    > Questo lo correggo io...

    thanks!

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    18
    > sicuro di aver allocato bene il vettore di caratteri nella funzione?
    > il problema potrebbe essere li...di solito il programma crasha
    > sulla printf quando il puntatore nn punta a una locazione valida.
    > Probabilmente la funzione non ha allocato la memoria, e tu non gli > hai assegnato NULL, per cui punta a una locazione indefinita,
    > creando quello che dovrebbe essere il segmentation fault.

    eppure avevo fatto il debug e a video veniva stampato tutto bene!

    > Sarebbe utile per capire, se postassi anche il codice della
    > funzione...

    ecco qua:

    int messaggio( char *testo )
    {

    int iRet = 0;
    const char mess[] = "questo e' il messaggio dalla funzione.";


    /*
    ** viene allocato lo spazio per
    ** scrive il messaggio.
    */

    testo = (char*)malloc( 100 * sizeof( char ) );
    memset( testo, '\0', 100 );

    /*
    ** controllo se l'allocazione della
    ** memoria ha avuto successo.
    */

    if ( testo )
    {
    printf( "stringa allocata : [%s]\n", testo );
    printf( "da copiare : [%s]\n", mess );
    memcpy( testo, mess, strlen( mess ) );
    printf( "copiato : [%s]\n", testo );
    iRet = 0;
    }
    else
    {
    testo = NULL;
    iRet = 1;
    }

    printf( "valore di ritorno : [%d]\n", iRet );

    return iRet;

    }

    grazie.

  6. #6
    Avevi commesso un errore nel passaggio del parametro alla funzione messaggio()
    Prova così : (io l'ho compilato il winxp sia con mingw che con bcc32)
    codice:
    #include <iostream.h>
    
    bool messaggio( char *&testo ) 
    { 
    	const char mess[] = "Questo e' il messaggio dalla funzione."; 
    	/* 
    	** viene allocato lo spazio per 
    	** scrive il messaggio. 
    	*/ 
    
    	testo = (char*)malloc( 100 * sizeof( char ) ); 
    	memset( testo, '\0', 100 ); // Questa è praticamente inutile
    
    	/* 
    	** controllo se l'allocazione della 
    	** memoria ha avuto successo. 
    	*/ 
    	
    	if( testo ) 
    	{ 
    		printf("stringa allocata : [%s]\n", testo ); 
    		printf("da copiare : [%s]\n", mess ); 
    		memcpy( testo, mess, strlen( mess )+1 ); // Copia nel buffer anche il terminatore '\0'
    		printf("copiato : [%s]\n", testo ); 
    		return false; 
    	} 
    	return true; 
    } 
    
    int main() 
    { 
    	char *msg; 
    	if( ! messaggio( msg ) ) 
    	{ 
    		printf("Allocazione da funzione ok!\n"); 
    		if( msg ) 
    			printf("VALORE : [%s]\n", msg); /* <--- */ 
    		else 
    			printf("qlc non va!"); 
    	} 
    	else 
    		printf("allocazione non riuscita!..."); 
    	
    	free( msg ); 
    	return 0; 
    }
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    18
    Ciao Samuele_70,


    > bool messaggio( char *&testo )

    1. bool? Non esiste il tipo boolean in C, a meno che non venga
    definito un header con :

    typedef
    int bool;

    #define true 1
    #define false 0

    2. che significa ( char *&testo )?


    > memset( testo, '\0', 100 ); // Questa è praticamente inutile
    3. la memset io la uso sempre per pulire la memoria che viene
    allocata.

    4. passando alla funzione il puntatore come :

    messaggio( msg )

    comunque non stampa nulla.
    Ho riparato il crash dichiarando msg così:
    char *msg = NULL;

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    18
    Ho risolto dicharando "char *msg = NULL" come variabile esterna al main, e poi dicharare "extern char *msg" nella funzione messaggio.

    grazie comunque.

  9. #9
    Originariamente inviato da gokuddf
    Ciao Samuele_70,


    > bool messaggio( char *&testo )

    1. bool? Non esiste il tipo boolean in C, a meno che non venga
    definito un header con :

    typedef
    int bool;

    #define true 1
    #define false 0
    Hai ragione, sono solito ad una programmazione c/c++.
    2. che significa ( char *&testo )?
    Serve a passare il puntatore come riferimento.
    > memset( testo, '\0', 100 ); // Questa è praticamente inutile
    3. la memset io la uso sempre per pulire la memoria che viene
    allocata.
    D'accordo ma se utilizzi lo spazio allocato per copiarci una
    stringa (compreso il suo terminatore) è inutile scriverci due volte.
    4. passando alla funzione il puntatore come :

    messaggio( msg )

    comunque non stampa nulla.
    Non so, a me funziona benissimo (in ambiente windows)
    Ho riparato il crash dichiarando msg così:
    char *msg = NULL;
    Ho risolto dicharando "char *msg = NULL" come variabile esterna al main, e poi dicharare "extern char *msg" nella funzione messaggio.

    grazie comunque.
    Sarebbe interessante sapere come, mostra la tua soluzione
    01010011 01100001 01101101 01110101 01100101 01101100 01100101 01011111 00110111 00110000
    All errors are undocumented features waiting to be discovered.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2006
    Messaggi
    18
    > Sarebbe interessante sapere come, mostra la tua soluzione

    char *msg;

    int main(int argc, char *argv[])
    {

    if ( ! messaggio( msg ) )
    {
    printf( "messaggio ha ritornato un valore...\n" );

    if ( msg )
    printf( "VALORE : [%s]\n", msg );
    else
    printf( "[MAIN] - qlc non va!\n" );

    }
    else
    printf( "allocazione non riuscita!..." );

    free( msg );

    return 0;

    }


    la funzione messaggio risiede in un altro file.

    int messaggio( char *testo )
    {

    int iRet = 0;
    const char mess[] = "stringa assegnata dalla funzione.";
    extern char *msg;

    /*
    ** viene allocato lo spazio per
    ** scrive il messaggio.
    */

    msg = (char*)malloc( 100 * sizeof( char ) );
    memset( msg, '\0', 100 );

    /*
    ** controllo se l'allocazione della
    ** memoria ha avuto successo.
    */

    if ( msg != NULL )
    {
    printf( "stringa allocata : [%s]\n", msg );
    printf( "da copiare : [%s]\n", mess );
    memcpy( msg, mess, strlen( mess ) + 1 );
    printf( "copiato : [%s]\n", testo );
    return 0;
    }
    else
    return 1;

    }

    ecco qua!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.