Newsgroup: it.comp.lang.c
Titolo: Mi servono help per gli argomenti di riga di comando

salve a tutti..nn è molto che programma e ho incontrato un po di
problemi con gli argomenti da riga di comando...non concettualmente ma a
livello di sintassi...Sostanzialmente io voglio poter prende una frase
che scrivo e copiarla in una stringa gia pronta..so che il secondo
argomento è arvg[1] ma continua a darmi segmentation fault...Se qualcuno
è cosi gentile di darmi un aiuto puo rispondere..Sotto atta pure i
programma in questione che contiene pure una cosa un po strana(diciamo)
dovrebbe fare tra le tatnte funzioni ricorsive anche una che implica due
ricorsioni una legata all'altra..be cmq per ora aiutatemi sulla riga di
comando..TNX
#include <stdio.h>
long FATT(long );
long FIBO(long );
long FUNZ42(long );
long FUNZm(long );
long x = 0;
int code;
char str[] = "\nLorenzo\nLivi\n19\n12\n1981\
nstro...@audiopro.it
\n";
char *str2;
/*Dichiarazioni funzioni fottute*/
/*funzione fattoriali*/
long FATT(long x)
{
    if(0 == x)
    return 1;
    else
    return x * FATT(x - 1);
    }
    /*funzione fibonacci*/
long FIBO(long x)
{
    if(x == 0 || x == 1)
    return x;
    else 
    return FIBO(x - 1) + FIBO(x - 2);
    }
    /*funzione 42*/
long FUNZ42(long x)
{
    if( 0 == x)
    return 42;
    else
    return FUNZ42(x - 1) + 2 * x;
    }
    /*funzione mista m g*/
long FUNZm(long x)
{
    if(0 == x)
    return 0;               /*Cercare un modo per collwegare le due
funzioni g e m in maniera ricorsiva*/
    else
    return FUNZm(x - 1) + 2 * FUNZm(x);
  }  
 
    /*MAIN*/
int main()
{
 
 
   while( ( code = getchar() ) ) != '\n')
 
     {    
 
         switch(code)
        {
                case 'v':   
                printf("%s", str);
                break;
 
                case 'f':  
                scanf("%d",&x);
                FATT(x);
                printf("%d! = \n%ld",x,FATT(x));
                return 0;
                break;
 
                case 'F': 
                scanf("%d",&x);
                FIBO(x);
                printf("Fibonacci %d = \n%ld",x,FIBO(x));
                return 0;
                break;
 
                case 'h': 
                scanf("%d",&x);
                FUNZ42(x);
                printf("%d = \n%ld",x,FUNZ42(x));
                return 0;
                break;
 
                case 'm':
                scanf("%d",&x);
                FUNZm(x);
                printf("%d = \n%ld",x,FUNZm(x));
                return 0;
                break;
 
 
              }                      
 
 
      }   
}        
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

aggiungi dei commenti al codice. e' piu' facile seguire un algoritmo se si
sa cosa dovrebbe fare
per esempio non mi dispiacerebbe sapere perche' al getchar devo mettere una
delle lettere controllate nel case: nessun utente puo' sapere cosa
scrivere!
inoltre non compila neanche. bisogna togliere una parentesi nel while in
main()
ehm, e se vogliamo argv non lo usi neanche, come puo' darti problemi di
seg fault? (-> ma che te ne fai di "char *str2" ?)
attento: x e' una long, ma tu decidi di assegnargli un int
--   case 'f':
--         scanf("%d",&x);
--> lo fai quasi sempre nei vari case
a me da' segmentation fault solo nel case 'm'
se provi ad aggiungere una printf che controlli il valore della variabile
x in FUNZm ti rendi conto che la funzione "impazzisce"
tu infatti la costringi ad un ciclo infinito,tranne che nel caso in cui x
valga 0 
long FUNZm(long x)
{
    if(0 == x)
    return 0;               /*Cercare un modo per collegare le due funzioni g e$
    else
    {printf("%ld\t",x);
    return FUNZm(x - 1) + 2 * FUNZm(x);   }
  }
se x=1
tu cerchi di ritornare 
FUNZm(1-1)+2*FUNZm(1)
ovvero
0+2*FUNZm(1)
e non uscira' mai
riguardo ad argv, devi intestare il main cosi'
int main (int argc, char *argv[])
argc ti dice quanti parametri sono stati passati da riga di comando, e
ogni argv[i] contiene un stringa con il parametro
uff
sonno
ciao,
Riccardo

Ciao grazie di aver risposto... il problema infatti è che io ho scritto
il prog in modo da nn usare
argv perchè nn sono capace...:)) Senno nn chiedevo info..l'unico modo
che conosco per inserire caratteri è quello che vedi...cioè con
getchar()
scusa ma sono al 1 anno di prog.non sono un expert :)..
Poi allora per la funzione m..dimenticala..la questione è
complicatissima
.almeno per me...in pratica quella funzione è incompleta come l'ho
scritta io..quello devo considerare 2 funzioni ricorsive collegate tra
loro..cioè ognuna ha bisogno del risultato dell'altra per essere
elaborata..e la cosa bella è che queste 2 funz verranno chiamate solo da
un caso..cioè il caso m...
allora..se sei cosi gentile da darmi una mano ti dico precisamente i
problemi che ho:
1- come sostituire le varie parti relative al getchar con i comandi da
riga di comando ( Argv..)
2- come faccio a implementare questa funzione? la attacco qua sotto vedi
tu se capisci..
 
funzione m (opzione -m) 
	definita per x>=0 
	m(0) = 0 
	m(x) = m(x-1) + 2*g(x) 
	g(0) = 1 
	g(x) = g(x-1) - 2*m(x-1) 
 naturalmente verram chiamata digitando m..e accanto un valore numerico(
possibilmente anche qui immesso da riga di comando)
3- se hai qualche e book figo sull aprogrammazione in C me lo
passeresti..Posso scambiare molta roba interessante..
poi ti ringrazio molto per avermi risposto ci sentiamo presto baci e
abbacchi....
aaa scusa
nn ho voglia di commentarlo ma il succo è che al variare di cio che
digiti da tast lui fa una certa funz ricorsiva..
BYE


 argomento è arvg[1] ma continua a darmi segmentation fault...Se qualcuno
Posta il codice che con l'uso di argv[1] va in segmentation fault.
-- 
Remove _NOTRASH to answer me!

 passeresti..
 
guarda, io ho studiato molto su
tricky c, scaricabile online,
http://ada2.unipv.it/biblio/trickyc/trkcfrm.htm
e sul Kernigan & Ritchie -> cartaceo
piu' ovviamente newsgroup e vari esempi trovati in rete
Ciao,
riccardo

comando..TNX
Compila questo programmino per capire come il sistema passa le info
sulla riga di comando ai due parametri:
#include <stdio.h>
int main (int argc, char *argv[])
{
int z;
for(z=0;z<argc;z++)
	printf("Argomento n.%d: %s\n",z,argv[z]);
printf("Argc:%d\n",argc);
return(0);
}
Dell'altra cosa non so dirti....
P.S. L'hai fatto l'esercizio 4?

aaaaaa anvedi Angelo...si l'ho quasi finito l'esercizio 4.. mi manca
solo
quella sega dell'opzione con l'asterico in mezzo a una parola...è un po
difficile..
Bhe io ora vado a mangiare.. ciao!!


Ciao Riccardo..ho provato a fare come dici te...nn mi da errori di
sintassi però
appena avvio il programma mi esce subito senza poter immettere niente da
tastiera.
 ti attacco cio che ho scritto..
int main(int argc, char *argv[])
{
 
 
   if(argc < 2)
     exit(0);
 
 
 
 
         switch(argv[1][0])
        {
                case 'v':   
                printf("%s", str);
                break;
 
                case 'f':  
                x = atol(argv[2]);
                FATT(x);
                printf("%d! = \n%ld",x,FATT(x));
                return 0;
                break;
 
                case 'F': 
                x = atol(argv[2]);
                FIBO(x);
                printf("Fibonacci %d = \n%ld",x,FIBO(x));
                return 0;
                break;
 
                case 'h': 
                x = atol(argv[2]);
                FUNZ42(x);
                printf("%d = \n%ld",x,FUNZ42(x));
                return 0;
                break;
 
                case 'm':
                scanf("%ld",&x);
                FUNZm(x);
                printf("%d = \n%ld",x,FUNZm(x));
                return 0;
                break;
 
 
              }                      
 
 
 
            }        
Logicamente prima cui stanno le dichiarazioni delle funzioni..
nn mi da errori di sintasssi ma esce subito come devo modificarlo??


Per quanto riguarda la funzione con opzione "m"..sinceramente nn l'ho
capito bene
il funzionamento quindi molto chiaro nelle spiegazioni nn posso essere..
l'unica cosa certa è che sono 2 funz ricorsive che hanno bisogno l'una
del risultato dell'altra per essere determinate
poi purtroppo nn so di piu.. fuckin' shit homeworz..:)


    
Io avevo scritto nel mio esempio
 if (argc <2) {printf("Devi aggiungere dei parametri\n"); exit(0);}
e' importante aggiungere controlli dell'errore.
cose' almento non ti dovrei chiedere
"hai aggiunto l'opzione dopo il nome del programma?"
esempio di lancio del programma
nomeprogramma m 12
inoltre devi lanciare il programma da consolle, o verra' eseguito talmente
velocemente che non vedrai mai dell'output
Riccardo


Approfitto del post per fare una domanda visto che ho riconosciuto il
programma (HomeWork 5 ;)
Nel momento in cui acquisisco input da riga di comando,  visto che
posso aver la possibilità di un numero diversi di argomenti, come li
gestisco?
Nel prog delle ricorsioni c'è l'opzione
case 'v':   che ha un parametro. (due se consideriamo il nome del file
eseguibuile)
case 'f':  che due parametri. (+1)
e consideriamo di avere un altro caso (nel compito c'era) un cui dati
due numeri dobbiamo trovare il Massimo Comune Divisore per un totale
di tre parametri (+1)
Quando compilavo ed inserivo gli argomenti per il case 'v' mi dava
Segmentation Fault. Se però passavo dei valori aggiuntivi inutili
nella riga di comando arrivando al massimo degli argomenti diversi
contemplati nel prog. andava tutto ok.
Mi spiegate come evitare questo problema?
Grazie!
-- 
X leggere le news con Outlook, senza ricevere msg che ti chiedono
di non spezzare i thread, Scarica la patch per OE5 da
http://www.vene.ws/mail/patch.asp
 (Grazie a chi l'ha creata)