Pagina 1 di 1

[RISOLTO]programma c: funzione con numero di parametri variabile

Inviato: mercoledì 13 giugno 2007, 9:17
da terenz84
salve a tutti,

devo fare il seguente programma c:

Scrivere una funzione a numero variabile di parametri (v. man stdarg). Tutti i parametri passati sono di tipo char*, un elemento di valore       
(char*)0 indica la fine della lista. Ogni parametro identifica un eseguibile privo di parametri da lanciare (con fork e execlp).  ad esempio: runall("ls","date","uname",(char*)0); 

al momento sto cercando ancora di passare parametri variabili alla funzione e stamparli

Codice: Seleziona tutto

#include <stdarg.h>
#include <stdio.h>


void funzione(char *fmt,...);
main (){

        funzione("sdc" , "stringa", "ciao");
        funzione("s" , "stringa2");
}

void funzione(char *fmt, ...)
{
        va_list ap;
        char c, *s;
        va_start(ap, fmt);
        while (*fmt){
                switch(*fmt++)
                case 's': // string 
                        s = va_arg(ap, char *);
                        printf("string %s\n", s);
                        break;
                }
                va_end(ap);
}
in questo modo funziona parzialmente ne senso che ottengo questo Output:

Codice: Seleziona tutto

string stringa
string stringa2
                   

Re: programma c: funzione con numero di parametri variabile

Inviato: mercoledì 13 giugno 2007, 11:09
da nuu
fmt e' un array di formati che passi alla funzione, e sui quali il tuo codice itera, controllando il tipo di parametri passati. Nel tuo caso tu controlli se fmt e' "s", che corrisponde secondo il tuo check a "stringa" (la tua printf stampa la stringa con il modifier %s). Ma poi quando chiami la funzione (nel primo caso), non passi "s" come primo parametro (che serve a dire al tuo check che i parametri seguenti sono stringhe). A mio parere Il tuo check e' inutile per quello che vuoi fare (tu vuoi sempre passare dei comandi di tipo stringa, quindi che senso ha controllare il formato ?).

Il secondo problema è che non effettui un ciclo di iterazione sui parametri effettivamente passati: il risultato è che viene stampato solo il primo parametro (o meglio il secondo, visto che il primo è il formato fmt).

Il terzo problema è che non costruisci la tua lista parametri in modo tale da far capire al tuo codice quando i parametri sono effettivamente finiti: se il numero è variabile, il tuo codice non può inventarsi il numero!

Puoi semplificare e ottimizzare il codice così:

Codice: Seleziona tutto

#include <stdarg.h>
#include <stdio.h>


void funzione(char *fmt,...);
main (){

        funzione("sdc" , "stringa", "ciao", 0);
        funzione("s", "stringa2", 0);
}

void funzione(char *first, ...)
{
        va_list ap;
        char *s = first;
        va_start(ap, first);

	do{
        	printf("string %s\n", s);
	} while( s = va_arg(ap, char *) );

        va_end(ap);
}
Ovvero:
1) eliminiamo completamente il parametro inutile fmt (il formato sarà sempre e solo "stringa"), ed l'altrettanto inutile variabile char c, e sfruttiamo in maniera produttiva il primo parametro, che diventa il primo argomento della lista passata (qui, se hai necessità di ottimizzare (anche se di poco) ulteriormente il tutto, potresti passare come primo parametro un intero indicante il numero di elementi nella lista che segue, e quindi iterare con un for-next su quello invece di fare un accesso alla memoria ad ogni iterazione del do-while per verificare di aver raggiunto la fine)
2) ottimizziamo il codice facendo si che il primo parametro sia già un elemento della lista (first), e quindi iteriamo sulla lista dei parametri finché non incontriamo lo 0-byte finale che indica che i parametri sono finiti (in quel momento il check che fa ciclare il do-while fallisce e si esce dal loop)
3) naturalmente, tale 0 byte deve essere incluso in ogni lista di argomenti (nota il modo in cui ho invocato funzione).

Spero di essere stato abbastanza chiaro.

Ciao,
nuu

Re: programma c: funzione con numero di parametri variabile

Inviato: mercoledì 13 giugno 2007, 11:26
da menelicte
nuu mi ha anticipato  :D

comunque considera che nel tuo codice:
appena entri nel while, fmt indirizza il primo carattere e poi fai lo switch su di esso.
così appena legge una 's', stampa l'argomento successivo ("string").
il while si ferma appena tmp punta '\0', che ti ritrovi già alla fine del primo argomento ('s', 'd', 'c', '/0')

ciao

Re: programma c: funzione con numero di parametri variabile

Inviato: mercoledì 13 giugno 2007, 21:44
da terenz84
grazie mi siete stati molto d'aiuto ho risolto il problema