Oppure

Loading
25/11/09 13:23
Pikke
Salve a tutti, sono nuovo del forum e vorrei condividere con voi il mio problema:
il programma che posto qui sotto è molto semplice, serve a modificare un campo di una struct attraverso due funzioni. Il programma produce un errore che ho individuato essere nella funzione init(), sembra infatti che si verifichi una segmentation fault quando il programma cerca di accedere a a->stringa... ponendo la porzione di codice di init direttamente nel main il problema sembra sparire. Qualcosa non va con il modo in cui tento di accedere ai campi della struct ma solo della funzione init, in quanto scambia non sembra avere lo stesso problema nonostante il metodo di accesso sia identico..

#include<stdlib.h>
#include<stdio.h>
#include<string.h>


typedef struct prova{
        char stringa[64];
        }struttura;


void scambia(struttura*,char*,int);
void init(struttura *);

int main()
{
    char str[1000];
    int l;
    
    struttura *info;

    gets(str);
    l=strlen(str);
    
    init(info);
    
    scambia(info,str,l);
    
    printf("%s\n",info->stringa);
    
    fflush(stdin);
    getchar();
    return 0;
}


void scambia(struttura *a,char *stringa,int l)
{
    int i;
    for(i=0;i<l;i++)
    a->stringa[i] = stringa[i];
}

void init(struttura *a)
{
    int i;
    
    for(i=0;i<64;i++)
    a->stringa[i] = 0;
}



aggiungo per completezza che lavoro su windows 7 con l'ultima release di wxDev-c++.

[i]EDIT by HeDo: Il codice va racchiuso tra i tag code, più attenzione la prossima volta.

Ultima modifica effettuata da HeDo 25/11/09 19:02
aaa
25/11/09 16:44
Matthew
La variabile stringa e' un array, giusto? La funzione init() dovrebbe inizializzare i suoi valori. Hai scritto un ciclo che viene iterato 64 volte perche' l'array in questione contiene 64 elementi.
Quello che hai scritto nel ciclo e':
 a->stringa = 0; 

Devi scrivere:
 a->stringa[i] = 0; 

[EDIT] Anche la funzione scambia ha lo stesso problema.
Ultima modifica effettuata da Matthew 25/11/09 16:46
aaa
25/11/09 17:05
Pikke
Ti ringrazio per la risposta, ma non penso sia questo il problema, tecnicamente all'interno del mio post la scrittura è già corretta, infatti se faccio edit sul post mi mostra nel codice le parentesi quadre con i come contatore di posizione, poi quando faccio salva le omette 8-| (sono consapevole dell'utilizzo degli array ;))

Tralaltro cosa interessante, oggi ho disinstallato la versione wxDevc++ e compilando il codice con il vecchio Devc++ l'applicazione sembra funzionare.. la cosa realmente bizzarra che mi capitava con wxDevc++ è che non mi permetteva di utilizzare normalmente le struct dandomi fastidiosi problemi di segmentation fault quando tentavo di accedere ai campi.. oggi provando a ricompilare differenti progetti che avevo già realizzato in passato e che non andavano con wxDevc++, e conteneti struct, ricompilati con devc++ sono andati alla perfezione.. comincio a pensare ad un bug, per quanto possa sembrare strano..
Ultima modifica effettuata da Pikke 25/11/09 17:09
aaa
25/11/09 18:03
lorenzo
devi usare il tag code per visualizzare correttamente il codice(parentesi quadre con scritto all'iterno code per aprire il tag e idem con /code per chiuderlo)
aaa
25/11/09 19:03
Pikke
Ti ringrazio per la precisazione, purtroppo il segmentation fault aleggia ancora su di me... :_doubt:
Ultima modifica effettuata da Pikke 25/11/09 19:04
aaa
25/11/09 19:04
HeDo

l'errore è palese. Stai usando un puntatore a struttura che non punta da nessuna parte.

Non basta dichiarare un puntatore ad un tipo per avere una variabile di quel tipo.

Il codice corretto è:


struttura info;

...

init(&info);

...

aaa
25/11/09 19:50
Pikke
Ciao, credo di aver capito cosa intendi, tecnicamente aggiungendo una cosa del genere:

struttura *info;
struttura pt;

info = &pt;



potrei mantenere il resto del codice così com'è.. Allocherei la struttura come pt e poi passerei il suo indirizzo ad info, mantenedo il resto del codice inalterato ed usando info come ho sempre fatto..
con questo metodo il comilatore nn da problemi e il programma funziona.
aaa
25/11/09 20:06
HeDo
Postato originariamente da Pikke:

Ciao, credo di aver capito cosa intendi, tecnicamente aggiungendo una cosa del genere:

struttura *info;
struttura pt;

info = &pt;



potrei mantenere il resto del codice così com'è.. Allocherei la struttura come pt e poi passerei il suo indirizzo ad info, mantenedo il resto del codice inalterato ed usando info come ho sempre fatto..
con questo metodo il comilatore nn da problemi e il programma funziona.


magia!
aaa