C+linux
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.
- 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: C+linux
In quel pezzo di codice non serve assolutamente a nulla, hai ragione, anche perche' piu' sopra viene gia' testato il valore di fp, e la funzione esce se e' NULL.
La sua utilita' e' in programmi piu' complessi, dove si affettuano varie modifiche, da parte di piu' persone.
Pensa a una situazione del genere:
Hai la funzione in questione.
Si fa una modifica, per cui il flusso diventa un po' piu' contorto.
Il test su fp, magari a causa di un if, viene saltato.
Quindi il programma crasha.
Ti assicuro che e' una situazione che, nella pratica professionale, capita piu' spesso di quando non si creda.
In questo modo hai anche il vantaggio di documentare che fp DEVE eseere diverso da NULL, perche' piu' sotto non vengono fatti controlli.
Spero di essere stato sufficientemente chiaro. Se hai altre domande, chiedi pure.
La sua utilita' e' in programmi piu' complessi, dove si affettuano varie modifiche, da parte di piu' persone.
Pensa a una situazione del genere:
Hai la funzione in questione.
Si fa una modifica, per cui il flusso diventa un po' piu' contorto.
Il test su fp, magari a causa di un if, viene saltato.
Quindi il programma crasha.
Ti assicuro che e' una situazione che, nella pratica professionale, capita piu' spesso di quando non si creda.
In questo modo hai anche il vantaggio di documentare che fp DEVE eseere diverso da NULL, perche' piu' sotto non vengono fatti controlli.
Spero di essere stato sufficientemente chiaro. Se hai altre domande, chiedi pure.
-
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: C+linux
Scusa, non mi convinci sull'utilita` di assert(3),robbybby ha scritto:In quel pezzo di codice non serve assolutamente a nulla, hai ragione, anche perche' piu' sopra viene gia' testato il valore di fp, e la funzione esce se e' NULL.
La sua utilita' e' in programmi piu' complessi, dove si affettuano varie modifiche, da parte di piu' persone.
Pensa a una situazione del genere:
Hai la funzione in questione.
Si fa una modifica, per cui il flusso diventa un po' piu' contorto.
Il test su fp, magari a causa di un if, viene saltato.
Quindi il programma crasha.
Ti assicuro che e' una situazione che, nella pratica professionale, capita piu' spesso di quando non si creda.
In questo modo hai anche il vantaggio di documentare che fp DEVE eseere diverso da NULL, perche' piu' sotto non vengono fatti controlli.
Spero di essere stato sufficientemente chiaro. Se hai altre domande, chiedi pure.
perche' non coinvolge fclose(3) che segue.
Poi anche in un codice che cresce, invece di
if(fp == NULL) //file aperto correttamente?
return 1; //no, esci con codice di errore
metti
if (! fp)
exit(fprintf(stderr, "%s: can't open to read %s.\n", progname, filename)):
ed e` ovvio ad ognuno che qualcosa e` andata male, e pure dove!
PS Se uno maschera "if (! fp)" con un altro "if" sopra ... ... ...
- 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: C+linux
Il check del NULL l'ho gia' messo in cima. Sotto sarebbe una ripetizione inutile e ridondante, che "urta il mio senso estetico". Poi, a volte hai bisogno di sfuttare fino all'ultimo microsecondo.
E' sicuramente valida anche la tua soluzione.
Io ci metto l'assert() per assicurarmi di non chiudere un file non aperto, e, cosi' facendo, non appesantisco il programma normale, ma solo quello di debug (cioe' dove NDEBUG non e' definito).
E' sicuramente valida anche la tua soluzione.
Io ci metto l'assert() per assicurarmi di non chiudere un file non aperto, e, cosi' facendo, non appesantisco il programma normale, ma solo quello di debug (cioe' dove NDEBUG non e' definito).
-
Crow
- Linux 2.x

- Messaggi: 271
- Iscritto il: ven 17 ago 2007, 15:37
- Slackware: 14.0
- Kernel: 3.2.29
- Desktop: KDE
- Distribuzione: BackTrack
Re: C+linux
io pultroppo sono costretto a utilizzare le funzioni che mi vengono spiegate all'università questo è il motivo per cui uso open e non fopen.
per favore se ci sta qualcosa che non va in questo piccolo codice vi chiedo la cortesia di commentare e spiegarmi gli errori, grazie mille siete sempre gentilissimi.

questo è quello che ho fattoveramente hai passato l'indirizzo dell'array ovvero hai fatto ciò che ti ha detto spina. se crei un array e poi lo passi ad una funzione stai usando il puntatore al primo elemento allocato di tale array.
Codice: Seleziona tutto
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#define M 30
int main(void)
{
int fdin, fdin2, i, fdin3;
char buf[M+1];
fdin=open("FILE3", O_RDONLY); //apre FILE1
fdin3=open("FILE4", O_RDONLY);
fdin2=dup2(fdin,8);
printf("i file descriptor assegnati tramite dup a file3 sono: %d e %d e %d\n ",
fdin, fdin2, fdin3);
read(fdin,buf,15); //legge da FILE3
write(1,buf,15); //scrive su standard output(schermo)
sleep(1);
exit(0);
}
-
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: C+linux
Domanda:robbybby ha scritto:Il check del NULL l'ho gia' messo in cima. Sotto sarebbe una ripetizione inutile e ridondante, che "urta il mio senso estetico". Poi, a volte hai bisogno di sfuttare fino all'ultimo microsecondo.
E' sicuramente valida anche la tua soluzione.
Io ci metto l'assert() per assicurarmi di non chiudere un file non aperto, e, cosi' facendo, non appesantisco il programma normale, ma solo quello di debug (cioe' dove NDEBUG non e' definito).
quanto appesantisce un
if (fclose(fp))
exit(fprintf(stderr, "%s: couldn't close %s.\n", progname, filename)):
di piu` di un assert(3)?
In generis controllo _ogni_ RETURN VALUE,
programmazione difensiva ad oltranza, paranoica se vuoi,
ai tempi AT&T mettendo un (void) davanti quando era proprio inutile,
per zittire il vecchio lint(1), che non era poi cosi` male.
Usanza andata persa con GNU gcc.
-
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: C+linux
COSTRETTO ???Crow ha scritto:io pultroppo sono costretto a utilizzare le funzioni che mi vengono spiegate all'università questo è il motivo per cui uso open e non fopen.
per favore se ci sta qualcosa che non va in questo piccolo codice vi chiedo la cortesia di commentare e spiegarmi gli errori, grazie mille siete sempre gentilissimi.
Errore:
apri con open(2)
ma non chiudi con close(2)