getc() segmentation fault
Moderatore: Staff
Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
- targzeta
- Iper Master

- Messaggi: 6643
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: getc() segmentation fault
Non ho capito se ti riferisci a me e se l'elemento in più è nel vettore v. Comunque, se è così, l'elemento che dici apparentemente inutile e in più, in realtà è utile e non è in più.
Se dichiari un array lungo v[MAX] allora l'array contiene MAX celle da v[0] a v[MAX-1]. Se dichiari un array lungo v[MAX-1], come hai fatto tu, allora hai MAX-1 celle da v[0] a v[MAX-2].
Generalmente si usa la prima forma e quindi ho modificato quanto fatto da te senza badare se lo usavi bene o male. Diciamo che l'istinto mi suggeriva che l'errore era nella gestione dell'array v.
Per quanto riguarda la funzione getc, se gestisci male i puntatori allora l'errore può avvenire ovunque nel codice. Ad esempio potresti aver sovrascitto la struttura f che puntava al file aperto, e quindi di conseguenza alla funzione getc non passavi più ciò che pensavi di passare. E' solo un ipotesi, ma è la ragione per cui mi sono concentrato sui puntatori.
Spina
Se dichiari un array lungo v[MAX] allora l'array contiene MAX celle da v[0] a v[MAX-1]. Se dichiari un array lungo v[MAX-1], come hai fatto tu, allora hai MAX-1 celle da v[0] a v[MAX-2].
Generalmente si usa la prima forma e quindi ho modificato quanto fatto da te senza badare se lo usavi bene o male. Diciamo che l'istinto mi suggeriva che l'errore era nella gestione dell'array v.
Per quanto riguarda la funzione getc, se gestisci male i puntatori allora l'errore può avvenire ovunque nel codice. Ad esempio potresti aver sovrascitto la struttura f che puntava al file aperto, e quindi di conseguenza alla funzione getc non passavi più ciò che pensavi di passare. E' solo un ipotesi, ma è la ragione per cui mi sono concentrato sui puntatori.
Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
- anycolouryoulike
- Packager

- Messaggi: 1158
- Iscritto il: ven 10 ago 2007, 0:00
- Slackware: 12.2
- Kernel: 2.6.34.8
- Desktop: KDE 3.5.10
Re: getc() segmentation fault
Pensa che ero convinto che v[MAX] significasse un vettore di MAX + 1 elementi!spina ha scritto:Non ho capito se ti riferisci a me e se l'elemento in più è nel vettore v. Comunque, se è così, l'elemento che dici apparentemente inutile e in più, in realtà è utile e non è in più.
Se dichiari un array lungo v[MAX] allora l'array contiene MAX celle da v[0] a v[MAX-1]. Se dichiari un array lungo v[MAX-1], come hai fatto tu, allora hai MAX-1 celle da v[0] a v[MAX-2].
Generalmente si usa la prima forma e quindi ho modificato quanto fatto da te senza badare se lo usavi bene o male. Diciamo che l'istinto mi suggeriva che l'errore era nella gestione dell'array v.
Per quanto riguarda la funzione getc, se gestisci male i puntatori allora l'errore può avvenire ovunque nel codice. Ad esempio potresti aver sovrascitto la struttura f che puntava al file aperto, e quindi di conseguenza alla funzione getc non passavi più ciò che pensavi di passare. E' solo un ipotesi, ma è la ragione per cui mi sono concentrato sui puntatori.
Spina
Grazie ora è tutto chiaro.
Grazie, era proprio questo l'errore!robbybby ha scritto:Codice: Seleziona tutto
char *v[MAX]
Non ci avevo neanche fatto caso...
Grazie a tutti!
- robbybby
- Linux 4.x

- Messaggi: 1223
- Iscritto il: sab 16 dic 2006, 10:48
- Slackware: 13.1 / 64 bit
- Kernel: 3.3.x
- Desktop: KDE 4.4.5
- Località: Fra Trantor e Terminus
Re: getc() segmentation fault
Mario, v e' usato come un array di stringhe, non come una stringa in se' (o puntatore a caratteri che dir si voglia).Mario Vanoni ha scritto: v[MAX]
ma dove posizioni lo \0 finale?
v[MAX + 1];
v e' un puntatore a puntatori a caratteri (char **) e non un puntatore a caratteri (char*). Infatti e' dichiarato come
Codice: Seleziona tutto
char *v[MAX]Codice: Seleziona tutto
char v[MAX+1]Lui, dentro ogni elemento, ci mette una stringa intera, con gia' il suo NULL terminator, quindi l'ultimo elemento non lo usa proprio.
E' parso strano anche a me, appeno ho letto il codice, ma lo ha fatto cosi'.
-
Mario Vanoni
- Iper Master

- Messaggi: 3174
- Iscritto il: lun 3 set 2007, 21:20
- Nome Cognome: Mario Vanoni
- Slackware: 12.2
- Kernel: 3.0.4 statico
- Desktop: fluxbox/seamonkey
- Località: Cuasso al Monte (VA)
Re: getc() segmentation fault
Scusa Roberto, deformazione mentale di vecchia data.robbybby ha scritto:Mario, v e' usato come un array di stringhe, non come una stringa in se' (o puntatore a caratteri che dir si voglia).Mario Vanoni ha scritto: v[MAX]
ma dove posizioni lo \0 finale?
v[MAX + 1];
v e' un puntatore a puntatori a caratteri (char **) e non un puntatore a caratteri (char*). Infatti e' dichiarato come, e non comeCodice: Seleziona tutto
char *v[MAX].Codice: Seleziona tutto
char v[MAX+1]
Lui, dentro ogni elemento, ci mette una stringa intera, con gia' il suo NULL terminator, quindi l'ultimo elemento non lo usa proprio.
E' parso strano anche a me, appeno ho letto il codice, ma lo ha fatto cosi'.
Come detto in un post precedente,
metto sempre una sentinella,
non si sa mai ...
- robbybby
- Linux 4.x

- Messaggi: 1223
- Iscritto il: sab 16 dic 2006, 10:48
- Slackware: 13.1 / 64 bit
- Kernel: 3.3.x
- Desktop: KDE 4.4.5
- Località: Fra Trantor e Terminus
Re: getc() segmentation fault
@Mario: la sentinella la metto sempre anch'io, e inizializzo sempre tutto. E spargo il codice di assert(): mi hanno salvato un sacco di volte.
- anycolouryoulike
- Packager

- Messaggi: 1158
- Iscritto il: ven 10 ago 2007, 0:00
- Slackware: 12.2
- Kernel: 2.6.34.8
- Desktop: KDE 3.5.10
Re: getc() segmentation fault
Se c'è un metodo migliore son ben lieto di conoscerlo!robbybby ha scritto:Lui, dentro ogni elemento, ci mette una stringa intera, con gia' il suo NULL terminator, quindi l'ultimo elemento non lo usa proprio.
E' parso strano anche a me, appeno ho letto il codice, ma lo ha fatto cosi'.
Come ho già detto, non sono per niente esperto di C, e per me ogni consiglio è prezioso.
- robbybby
- Linux 4.x

- Messaggi: 1223
- Iscritto il: sab 16 dic 2006, 10:48
- Slackware: 13.1 / 64 bit
- Kernel: 3.3.x
- Desktop: KDE 4.4.5
- Località: Fra Trantor e Terminus
Re: getc() segmentation fault
Ho riletto meglio il tuo codice.
La scelta di utilizzare un array di puntatori a stringhe e' piu' che lecita.
E' il resto della struttura del programma che, non va.
Prima di tutto evita tutti quei break e continue. Rendono il programma difficilmente leggibile, oltre che a terzi, anche a te, se lo riprendi in mano fra qualche mese. Inoltre lo rendono anche difficilemte manutenibile. Tieni presente che, nel mondo reale, un programma e' soggetto a continue modifiche, per variazioni di specifichem o ampliamenti. Se ti abitui subito a scrivere programma facilemente manutenibili, ne hai solo guadagno. Inoltre devono essere leggibili anche da altri, perche' a un certo programma ci si lavora in piu' persone.
Riorganizza il programma senza continue e break, e che la programmazione strutturata sia con te.
Ah, devi anche mettere un controllo sulla quantita' di caratteri letti, altrimenti s puo' andare in overflow, con risultati imprevedibili (o, meglio, facilmente prevedibili).
La scelta di utilizzare un array di puntatori a stringhe e' piu' che lecita.
E' il resto della struttura del programma che, non va.
Prima di tutto evita tutti quei break e continue. Rendono il programma difficilmente leggibile, oltre che a terzi, anche a te, se lo riprendi in mano fra qualche mese. Inoltre lo rendono anche difficilemte manutenibile. Tieni presente che, nel mondo reale, un programma e' soggetto a continue modifiche, per variazioni di specifichem o ampliamenti. Se ti abitui subito a scrivere programma facilemente manutenibili, ne hai solo guadagno. Inoltre devono essere leggibili anche da altri, perche' a un certo programma ci si lavora in piu' persone.
Riorganizza il programma senza continue e break, e che la programmazione strutturata sia con te.
Ah, devi anche mettere un controllo sulla quantita' di caratteri letti, altrimenti s puo' andare in overflow, con risultati imprevedibili (o, meglio, facilmente prevedibili).