Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Strani comportamenti di wxDev-c++
Forum - C/C++ - Strani comportamenti di wxDev-c++

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Pikke (Normal User)
Newbie


Messaggi: 9
Iscritto: 25/11/2009

Segnala al moderatore
Postato alle 14:23
Mercoledì, 25/11/2009
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..

Codice sorgente - presumibilmente C++

  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<string.h>
  4.  
  5.  
  6. typedef struct prova{
  7.         char stringa[64];
  8.         }struttura;
  9.  
  10.  
  11. void scambia(struttura*,char*,int);
  12. void init(struttura *);
  13.  
  14. int main()
  15. {
  16.     char str[1000];
  17.     int l;
  18.    
  19.     struttura *info;
  20.  
  21.     gets(str);
  22.     l=strlen(str);
  23.    
  24.     init(info);
  25.    
  26.     scambia(info,str,l);
  27.    
  28.     printf("%s\n",info->stringa);
  29.    
  30.     fflush(stdin);
  31.     getchar();
  32.     return 0;
  33. }
  34.  
  35.  
  36. void scambia(struttura *a,char *stringa,int l)
  37. {
  38.     int i;
  39.     for(i=0;i<l;i++)
  40.     a->stringa[i] = stringa[i];
  41. }
  42.  
  43. void init(struttura *a)
  44. {
  45.     int i;
  46.    
  47.     for(i=0;i<64;i++)
  48.     a->stringa[i] = 0;
  49. }



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

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

Ultima modifica effettuata da HeDo il 25/11/2009 alle 20:02
PM Quote
Avatar
Matthew (Member)
Expert


Messaggi: 387
Iscritto: 29/01/2007

Segnala al moderatore
Postato alle 17:44
Mercoledì, 25/11/2009
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':
Codice sorgente - presumibilmente Plain Text

  1. a->stringa = 0;


Devi scrivere:
Codice sorgente - presumibilmente Plain Text

  1. a->stringa[i] = 0;


[EDIT] Anche la funzione scambia ha lo stesso problema.

Ultima modifica effettuata da Matthew il 25/11/2009 alle 17:46
PM Quote
Avatar
Pikke (Normal User)
Newbie


Messaggi: 9
Iscritto: 25/11/2009

Segnala al moderatore
Postato alle 18:05
Mercoledì, 25/11/2009
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 il 25/11/2009 alle 18:09
PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 19:03
Mercoledì, 25/11/2009
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)

PM Quote
Avatar
Pikke (Normal User)
Newbie


Messaggi: 9
Iscritto: 25/11/2009

Segnala al moderatore
Postato alle 20:03
Mercoledì, 25/11/2009
Ti ringrazio per la precisazione, purtroppo il segmentation fault aleggia ancora su di me... :_doubt:

Ultima modifica effettuata da Pikke il 25/11/2009 alle 20:04
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 20:04
Mercoledì, 25/11/2009

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 è:

Codice sorgente - presumibilmente Plain Text

  1. struttura info;
  2.  
  3. ...
  4.  
  5. init(&info);
  6.  
  7. ...


PM Quote
Avatar
Pikke (Normal User)
Newbie


Messaggi: 9
Iscritto: 25/11/2009

Segnala al moderatore
Postato alle 20:50
Mercoledì, 25/11/2009
Ciao, credo di aver capito cosa intendi, tecnicamente aggiungendo una cosa del genere:

Codice sorgente - presumibilmente Plain Text

  1. struttura *info;
  2. struttura pt;
  3.  
  4. 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.

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 21:06
Mercoledì, 25/11/2009
Testo quotato

Postato originariamente da Pikke:

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

Codice sorgente - presumibilmente Plain Text

  1. struttura *info;
  2. struttura pt;
  3.  
  4. 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!

PM Quote
Avatar
Pikke (Normal User)
Newbie


Messaggi: 9
Iscritto: 25/11/2009

Segnala al moderatore
Postato alle 21:23
Mercoledì, 25/11/2009
hahahahaa ti ringrazio :love:

Ultima modifica effettuata da Pikke il 25/11/2009 alle 21:33
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo