Discussione:
Dubbio ordine esecuzioni istruzioni
(troppo vecchio per rispondere)
manalog
2017-04-25 17:36:29 UTC
Permalink
Ciao a tutti,
non so se vi ricordate di me, avevo scritto qualche tempo fa chiedendo
consigli su un libro per iniziare a programmare in C.
Ho letto il primo capitolo del K&R ed eseguito quasi tutti gli esercizi.
Causa impegni ho sospeso per quasi un mese e ho già dimenticato diverse
cose; prima di proseguire volevo riprendere l'allenamento scrivendo dei
programmini semplici ma mi sono subito arenato con un problema
sicuramente idiota.

Voglio mandare il testo riga per riga ad una funzione mediante l'array
riga[] tuttavia per non avere array enormi e inutili "contatori" ho
pensato di cancellare lo stesso array ogni volta e riscriverci la riga
partendo dall'inizio.
Il codice è questo:

"
while ((c = getchar()) != EOF) {
if (c != '\n') {
riga[n] = c;
n++;
}
else
elabora(riga, n, elaborato);
for (i = 0; i <= n; i++)
riga[i] = ' ';
}
"
La mia idea sarebbe che, in caso di c == '\n', venga PRIMA eseguita la
funzione elabora e POI azzerato l'array. Succede invece il contrario:
prima mi si azzera l'array e poi quello viene elaborato.
Cosa sbaglio?

Scusate il livello basico basico della domanda :D

Matteo.
manalog
2017-04-25 17:39:17 UTC
Permalink
Post by manalog
Ciao a tutti,
non so se vi ricordate di me, avevo scritto qualche tempo fa chiedendo
consigli su un libro per iniziare a programmare in C.
Ho letto il primo capitolo del K&R ed eseguito quasi tutti gli esercizi.
Causa impegni ho sospeso per quasi un mese e ho già dimenticato diverse
cose; prima di proseguire volevo riprendere l'allenamento scrivendo dei
programmini semplici ma mi sono subito arenato con un problema
sicuramente idiota.
Voglio mandare il testo riga per riga ad una funzione mediante l'array
riga[] tuttavia per non avere array enormi e inutili "contatori" ho
pensato di cancellare lo stesso array ogni volta e riscriverci la riga
partendo dall'inizio.
"
while ((c = getchar()) != EOF) {
if (c != '\n') {
riga[n] = c;
n++;
}
else
elabora(riga, n, elaborato);
for (i = 0; i <= n; i++)
riga[i] = ' ';
}
"
La mia idea sarebbe che, in caso di c == '\n', venga PRIMA eseguita la
prima mi si azzera l'array e poi quello viene elaborato.
Cosa sbaglio?
Scusate il livello basico basico della domanda :D
Matteo.
Ho scordato l'n=0, ho fatto parecchi test e nell'ultimo non l'ho
rimesso, ma tanto il succo non cambia, prima vengono eseguite le cose
dopo e alla fine la funzione elabora, nonostante sia chiamata prima
acc
2017-04-25 17:57:48 UTC
Permalink
Post by manalog
Scusate il livello basico basico della domanda :D
Le graffe..tte! :-)

} else {
elabora(riga, n, elaborato);
for (i = 0; i <= n; i++)
riga[i] = ' ';
}
}
acc
2017-04-25 18:00:31 UTC
Permalink
Post by acc
Post by manalog
Scusate il livello basico basico della domanda :D
Le graffe..tte! :-)
} else {
elabora(riga, n, elaborato);
for (i = 0; i <= n; i++)
riga[i] = ' ';
}
}
Ho scritto male, te lo riscrivo meglio tutto:

while ((c = getchar()) != EOF) {
if (c != '\n') {
riga[n] = c;
n++;
} else {
elabora(riga, n, elaborato);
for (i = 0; i <= n; i++)
riga[i] = ' ';
}
}
Jack
2017-04-26 06:44:08 UTC
Permalink
Post by manalog
Post by acc
Post by manalog
Scusate il livello basico basico della domanda :D
Le graffe..tte! :-)
} else {
elabora(riga, n, elaborato);
for (i = 0; i <= n; i++)
riga[i] = ' ';
}
}
while ((c = getchar()) != EOF) {
if (c != '\n') {
riga[n] = c;
n++;
} else {
elabora(riga, n, elaborato);
for (i = 0; i <= n; i++)
riga[i] = ' ';
}
}
mancano anche nel for() finale.
Non sono obbigatorie, se nel for c'e' solo un istruzione, ma rischi di avere problemi dopo (aggiungi un'istruzione nel for e dimentichi di aggiungere le graffe).
Visto che stai imparando il consiglio e' di mettere SEMPRE le graffe, anche se all'interno c'e' solo un instruzione.

Ciao Jack
manalog
2017-04-26 13:12:23 UTC
Permalink
Post by Jack
Post by manalog
Post by acc
Post by manalog
Scusate il livello basico basico della domanda :D
Le graffe..tte! :-)
} else {
elabora(riga, n, elaborato);
for (i = 0; i <= n; i++)
riga[i] = ' ';
}
}
while ((c = getchar()) != EOF) {
if (c != '\n') {
riga[n] = c;
n++;
} else {
elabora(riga, n, elaborato);
for (i = 0; i <= n; i++)
riga[i] = ' ';
}
}
mancano anche nel for() finale.
Non sono obbigatorie, se nel for c'e' solo un istruzione, ma rischi di avere problemi dopo (aggiungi un'istruzione nel for e dimentichi di aggiungere le graffe).
Visto che stai imparando il consiglio e' di mettere SEMPRE le graffe, anche se all'interno c'e' solo un instruzione.
Ciao Jack
Che scemo che sono!!! Mi stavo scervellando per un'idiozia, mi dispiace
di avervi scomodato per così poco...
Seguirò il consiglio di Jack, mi sembrava così elegante non mettere le
graffe per un'istruzione sola che alla fine mi ero scordato di averne
aggiunte altre due.

Comunque già che ci siamo, io ho finito il Capitolo 1, e K&R propongono
di fermarsi un po' scrivendo dei programmini prima di passare ai
successivi. Al momento vorrei fare cose semplici riguardanti analisi dei
testi, cosa avete da consigliarmi che si possa fare con quelle semplici
nozioni?

Ovviamente molte cose non posso ancora farle, ad esempio sono sicuro ci
sia un modo per creare dinamicamente nuovi array (tipo riga1 ... riga n)
ma ancora non mi è capitato nel libro.

Grazie :)
Jack
2017-04-26 13:54:26 UTC
Permalink
Post by manalog
Che scemo che sono!!! Mi stavo scervellando per un'idiozia, mi dispiace
di avervi scomodato per così poco...
Seguirò il consiglio di Jack, mi sembrava così elegante non mettere le
graffe per un'istruzione sola che alla fine mi ero scordato di averne
aggiunte altre due.
eh capita.
la prossima volta posta un programma minimo completo (cioe' il codice piu' corto possibile che genera il bug), cosi se l'errore non e' palese possiamo compilarlo e provare.

Cmq appena ti senti bene con la sintassi ti consiglio di dare un'occhiata alle linee guida della MISRA (https://it.wikipedia.org/wiki/MISRA_C), ti possono dare delle idee su come scrivere il codice per evitare errori (e ti spiegano perche' e' bene fare o non fare qualcosa).
Post by manalog
Comunque già che ci siamo, io ho finito il Capitolo 1, e K&R propongono
di fermarsi un po' scrivendo dei programmini prima di passare ai
successivi. Al momento vorrei fare cose semplici riguardanti analisi dei
testi, cosa avete da consigliarmi che si possa fare con quelle semplici
nozioni?
cosa intendi con "analisi testi"?
C'e' tutta una serie di funzioni che ti permettono di gestire le stringhe, non so se sono descritte nel K&R, ma le trovi in "string.h"
Post by manalog
Ovviamente molte cose non posso ancora farle, ad esempio sono sicuro ci
sia un modo per creare dinamicamente nuovi array (tipo riga1 ... riga n)
ma ancora non mi è capitato nel libro.
Si, ma prima devi imparare i puntatori :)
Post by manalog
Grazie :)
Ciao Jack
Dr.UgoGagliardelli
2017-04-26 14:20:59 UTC
Permalink
Il 26.04.2017 15.12, manalog ha scritto:
[...]
...mi sembrava così elegante non mettere le graffe per un'istruzione sola
[...]
lo e', ma un bambino elegante e' pur sempre un bambino!
:-)

---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
mmm
2017-04-26 14:54:26 UTC
Permalink
<snip>
Post by manalog
Che scemo che sono!!! Mi stavo scervellando per un'idiozia, mi dispiace
di avervi scomodato per così poco...
Seguirò il consiglio di Jack, mi sembrava così elegante non mettere le
graffe per un'istruzione sola che alla fine mi ero scordato di averne
aggiunte altre due.
un consiglio :
impara ad usare un debugger ed usalo in maniera estensiva, certi errori
( che capitano in continuazione ) salteranno subito all'occhio
Post by manalog
Comunque già che ci siamo, io ho finito il Capitolo 1, e K&R propongono
di fermarsi un po' scrivendo dei programmini prima di passare ai
successivi. Al momento vorrei fare cose semplici riguardanti analisi dei
testi, cosa avete da consigliarmi che si possa fare con quelle semplici
nozioni?
Ovviamente molte cose non posso ancora farle, ad esempio sono sicuro ci
sia un modo per creare dinamicamente nuovi array (tipo riga1 ... riga n)
ma ancora non mi è capitato nel libro.
vai avanti col libro ;-)
Post by manalog
Grazie :)
acc
2017-04-26 14:08:48 UTC
Permalink
Post by manalog
while ((c = getchar()) != EOF) {
if (c != '\n') {
riga[n] = c;
n++;
} else {
elabora(riga, n, elaborato);
for (i = 0; i <= n; i++)
riga[i] = ' ';
n = 0; /* ehm... */
Post by manalog
}
}
Loading...