Newsgroup: it.comp.os.linux.development
Titolo: Usare o no lo stderr?

Usando la  funzione strdup() con questo codice:
 
----------------------------------------
// char *strdup(char *vettore_origine)  -- Fuori standard ANSI
#include <stdio.h>
#include <string.h>
 
int main(int argc, char **argv)
{
char *dest;
..............
 
A questo punto, per evitare un'immissione che provocherebbe
un sigfault, ho trovato due modi, potreste dirmi qual e' il
migliore? (funzionano entrambi benissimo)
 
--------------- PRIMO MODO -----------------
if (argc == 1)      // Se argv[1]=0 va in sigfault
{
printf("Usage: Duplica il vettore-stringa $1 in stdout \n");
}
 
else
{
dest = strdup(argv[1]);
printf("%s\n", dest);
}
return 0;
}
-----------
 
================ SECONDO MODO ================
#include <stdlib.h>
 
if (argc == 1)           // carica l'errore in stderror?
{
fprintf(stderr, "Usage: Duplica il vettore-stringa $1 in stdout \n");
exit(1);                 // evita il sigfault?
}
 
dest = strdup(argv[1]);
printf("%s\n", dest);
return 0;
}
==========
 
-- 
Saluti,
Guido
 


In genere 'stderr' si usa per i messaggi di errore per evitare che 
vengano mescolati all'output del programma.
 
Molto spesso l'output di un programma è usato come input ad un altro ed 
i messaggi di errore non sarebbero visibili o produrrebbero causare 
errori anche nel programma che analizza l'output del primo.
 
 
PS:  Mi spieghi che significa "$1" nella stringa che *dovrebbe* spiegare 
l'uso del programma>
 
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   < 
http://giovanni.homelinux.net/
 >

l'uso del programma>
 
E' il $1 della bash, l'alternativa e' argv[1], mi sembrava piu'
chiaro e veloce con $1, con argv[1] si puo' far casino rileggendo
dopo un po' e ricordando male con la storia che comincia da 0.
 
-- 
Saluti,
Guido
 

 un sigfault, ho trovato due modi, potreste dirmi qual e' il
]zac[
 
Questi problemi li hanno avuti tutti quelli che hanno cominciato a 
programmare in C .
 
Dovresti leggerti qualche documentazione/libro magari per principianti.
 
 
Come spunto, ' strncpy ' e ' snprintf '.
 
Presta attenzione, che come molte cose nel C, sono funzioni poco amichevoli 
e introducono un effetto collaterale, che puo' trasformare un scrittura 
fuori dalla memoria (probabile) a una lettura fuori dalla memoria (piu' 
probabile).
 
Come spunto, attenzione al ' \0 ' terminatore della stringa che potrebbe 
essere omesso.
 
 
Senza offesa, ribadisco che affrontare il C a tentativi e senza documentarsi 
prima e' poco sensato.

prima e' poco sensato.
 
Ma no grazie ma figurati se non mi documentero' fino anche all'
eccessiva pignoleria. Solo che, senza vedere il codice fatto e
compilato da me, non mi riesce di seguire nessun manuale.
 
-- 
Saluti,
Guido
 

 dopo un po' e ricordando male con la storia che comincia da 0.
 
Rischi di creare ancora piu` confusione nell'utente, che vedendo $1
magari si aspetta uno script di shell con un bug che gli mostra il nome
della variabile invece del contenuto.
 
Bye.
 
 

 compilato da me, non mi riesce di seguire nessun manuale.
 
Premetto che non e` per dirti di smettere di postare le tue domande (che
sono interessanti anche per altri), ma l'impressione che ho io e` che
forse dovresti cambiare manuale, visto che stai usando questo nuowgroup
come un gruppo di professori che ti spieghino le cose che non capisci e
che, a quanto pare, il manuale non spiega.
 
Poi sarei curioso di capire perche` stai studiando proprio il C.
 
Se stai iniziando a programmare e vuoi rimanere a bassissimo livello
(nel senso di "vicino all'hardware come il C") io ti consiglierei Rust.
 
Se vuoi un livello leggermente piu` alto direi Go.
 
Se non hai mai programmato prima io partirei da Python (per CLI e GUI) o
PHP (per web), che sono di livello piu` alto e piu` semplici da capire.
 
Bye.

della variabile invece del contenuto.
 
Vabbe' anche Giuseppe D.B. m'ha detto di non prendere cattive
abitudini all'inizio, usero' argv[1]. Ciao e grazie!
 
-- 
Saluti,
Guido
 

PHP (per web), che sono di livello piu` alto e piu` semplici da capire.
 



ma l'argomento era su stderr o sulla if ?
Ti rispondo a tutti e due
stderr si usa per i messaggi di errore quindi la prima printf la 
metterei come fprintf(stderr,...)
La seconda e' corretta in quando non e' un messaggio di errore.
Per la if visto che il programma e' piccolo in questo caso usare l'uno o 
l'altro comporta poco
Per routine piu complesse preferisco di molto il secondo modo,lo ritengo 
piu leggibile.
Ho visto troppe if/else, e pure  annidate, in codice scritto da altri 
per preferire il secondo metodo che poi e' quello che uso.
Questo alla faccia dei detrattori (non me ne vogliano,sono gusti) che 
affermano che una routine dovrebbe avere una sola uscita.
 
 

affermano che una routine dovrebbe avere una sola uscita.
 
Ho capito, insomma e' semplicissimo, e' come con la bash fare:
-----------------------
if [ -z "$1" ]; then
echo "Usage: ..."
exit 0
fi
.....
--------------
 
Invece di:
-----------------------
if [ -z "$1" ]; then
echo "Usage: ..."
else
.....
fi
--------------
 
OK, usero' il primo senza else, cosi' non c'e' neanche il
pericolo di dimenticare il fi (cioe' la graffa chiusa).
 
Grazie e ciao!
 
P.S. Scusa ma sui detrattori che dici, la routine ha ugualmente
sempre una sola uscita in entrambi i casi: o esce l'Usage o
escono i risultati. Forse vogliono dire una sola riga d'uscita
dallo scritto del sorgente?
Cioe' se ci metti l'else o se ci metti l'exit il programma con
argv[1] vuoto esce sempre li', mica con l'else va avanti.
 
-- 
Saluti,
Guido
 

 
 
 
Io accennavo a dei dettami di programmazione che dicono di usare una 
sola uscita da una routine
Non in questo caso specifico.
 
 

 Il terminatore \0 assicurano che strncpy lo mette lei /sempre/,
]zac[
 
http://digilander.libero.it/uzappi/C/librerie/funzioni/strcpy.html
 
 
 

Non in questo caso specifico.
 
Ah be' non e' alla mia portata e non lo sara' per molto.
 
Questo C e' uno spasso! prende anche tutte le sequenze escape per
l'outup a colori scritti nel sorgente con gli ottali: "\033[33m"
eccetera e anche il "\" per andare a capo, tutto come la bash!
Li ho messi senza neanche cercare nel libro e li ha accettati.
 
-- 
Saluti,
Guido
 

 l'outup a colori scritti nel sorgente con gli ottali: "\033[33m"
 
Questo non e` C che lo fa, ma la bash stessa. Quello che C fa e` mandare
i codici alla shell, che poi li gestisce a modo suo.
 
L'unica similitudine e` il \033 che non e` altro che il modo per
rappresentare il codice ASCII del tasto Escape in ottale, ma presumo che
sia la shell che l'ha copiato dal C, piu` che il contrario.
 
Bye.