Newsgroup: it.comp.lang.c
Titolo: questo mi lascia parecchio perplesso....guardate!

....
int main(int argc, char *argv[])
{       
        char *source_path, *patch_path, *sample_path;
....
for( i = 1; i < argc ; i++)     /*Setting paths */
{
        if(strcmp( argv[i] , "--source" ) == 0 || strcmp( argv[i] , "-s")==0)
        {
                if( argc < i +2)
                {
                        missing_argument();
                        return(1);
                }
                i++;
                strcpy(source_path, argv[i]);
        }       
        else if(strcmp( argv[i] , "--patch" ) == 0 || strcmp( argv[i] , "-p")==0)
        {
                if( argc < i +2)
                {
                        missing_argument();
                        return(1);
                }
                i++;
                strcpy(patch_path, argv[i]);
        }
        else if(strcmp( argv[i] , "--sample" ) == 0 || strcmp( argv[i] , "-S")==0)
        {
                if( argc < i +2)
                {
                        missing_argument();
                        return(1);
                }
                i++;
                strcpy(sample_path, argv[i]);
        }
        else
        {
                printf("\n");
                printf("scrtopcs: bad arguments\n");
                printf("Try `srctopcs --help' for more inforation\n");
                printf("\n");
                return(1);
        }
}
.....
Ok... tutto funziona, ma se proovo a lanciare il programma con -p o --patch 
piu l' argomento mi va in crash! Mentre con --sample o --source non fa 
nulla del genere!
E le tre descrizioni sono perfettamente identiche ! 
es: ./a.out --source blabla --sample blaublau ==> funzia
es: ./a.out --patch orpo ==> crasha!! 
AIUTOOOOOO!
Stefano Pelux

         char *source_path, *patch_path, *sample_path;
Update:
Cambiando l' ordine delle definizioni cambia anche la parte che fa crashare 
il programma, ovvero la seconda: cioè, se uso:
 char *source_path, *sample_path, *patch_path;
 ora sarà l' uso della parte sample a fare crashare il programma...
Non so proprio cosa fare.... non intravedo nessuna logica in tutto questo...
bho
Pelux

 
Ciao,
Forse il problema a prima vista sembra dipendere dalla "strcpy",ovvero 
dal primo argomento passato alla funzione che potrebbe non essere stato 
allocato in precedenza.Se fosse cosi'allora il prog. potrebbe andare in 
segmentation fault!!
Cioe' per essere chiaro
strcpy(patch_path, argv[i]); ?patch_path e' stato allocato dinamicamente???
es.patch_path=malloc((strlen(argv[i])+1)*sizeof(char));
    strcpy(patch_path,argv[i]);
Bye Bye
Luciano

 Luciano
No, non è stato allocato dinamicamente...
Ho fatto come dici tu e ora funziona.....mi da solo questo Warning... 
srctopcs.c:135: warning: assignment makes pointer from integer without a 
cast
che vuol dire? io lo alloco proprio prima dell' utilizzo, cioè:
else if( strcmp( argv[i] , "--sample" ) == 0 || strcmp( argv[i] , "-S" )==0)
{
        if( argc < i +2)
        {
                missing_argument();
                return(1);
        }
        i++;
        sample_path=malloc((strlen(argv[i])+1)*sizeof(char));
        strcpy(sample_path, argv[i]);
}
oppure dovrei allocarlo nella main subito dopo la definizione?
Ma in generale bisogna sempre allocare tutto? Che cosa in particolare? Nel 
libro che sto leggendo (linguaggio C seconda edizione) non c' è tutta 
questa enfasi sull' alocazione di memoria, almeno stando agli esempi. Come 
posso approfondire l' argomento? 
Grazie di tutto!!!
Stefano

 
Beh non tutto dipende dall'uso che ne fai dei puntatori comunque un buon 
libro (ma un po' difficile per chi inizia) e'
"The C Programing Language"
Kernighan e Ritchie (Creatori del C)
1988 Prentice-Hall

 1988 Prentice-Hall
E il libro che sto leggendo! :D
Solo che non č che ci fosse un capitolo dove spiegava come e quando usare 
malloc e quando invece no.
Grazie di tutto
Stefano Pelux

non dovrebbero sorgere warning!!!
Scusa, ma e' una cavolata ed e' anche nelle FAQ :)
Il void * viene castato implicitamente a qualsiasi tipo (purche' sia
un puntatore).
Se a te da quell'errore non e' perche' non fai il cast ma perche' non
hai incluso l'header che contiene il prototipo della malloc
(stdlib.h).
Non vedendo il prototipo lui pensa che ritorni int (comportamento di
default per il C89) e vede che assegni un int a un puntatore (cosa
ammissibile peraltro).
Il cast sul valore di ritorno della malloc va evitato, perche' uccide
quei pochi controlli sul tipo che fa' la malloc.
Il K&R in proposito non e' aggiornato perche' e' uscito prima che il
C89 fosse approvato nella sua accezione "attuale" (tra virgolette
perche' lo standard attuale saarebbe il C99).
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

 
Grazie della dritta!
Pelux

scaricato un tutorial in C ... o magari mi confondo con 
programmazione.it
.
Allora, le FAQ di cui parlo non sono quelle di it.comp.lang.c (che
sono attualmente conservate in versione html su 
programmazione.it
), ma
quelle ufficiali di comp.lanc.c*.
La parte che ti interessa e' (in parte):
<DOC source="FAQ">
7.6:	Why am I getting "warning: assignment of pointer from integer
	lacks a cast" for calls to malloc()?
A:	Have you #included <stdlib.h>, or otherwise arranged for
	malloc() to be declared properly?  See also question 1.25.
	References: H&S Sec. 4.7 p. 101.
</DOC>
Queste FAQ le trovi a questo indirizzo:
http://www.eskimo.com/~scs/C-faq/top.html
 (HTML)
http://www.eskimo.com/~scs/C-faq/versions.html
 (altri formati)
Vengono comunque postate periodicamente su comp.lang.c* e comp.answer.
Personalmente trovo molto piu' comoda la versione testuale.
Le FAQ di it.comp.lang.c invece le trovi su 
programmazione.it
 a questo
indirizzo:
http://www.programmazione.it/index.php?entity=earticle&idArticle=189&idArea=4
