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

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
terenz84
Prode Principiante
Messaggi: 80
Iscrizione: mercoledì 30 novembre 2005, 18:19

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

Messaggio 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
                   
Ultima modifica di Anonymous il mercoledì 13 giugno 2007, 21:45, modificato 1 volta in totale.
Avatar utente
nuu
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 394
Iscrizione: mercoledì 30 maggio 2007, 2:07

Re: programma c: funzione con numero di parametri variabile

Messaggio 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
Ultima modifica di nuu il mercoledì 13 giugno 2007, 11:27, modificato 1 volta in totale.
Learn to pause -- or nothing worthwhile can catch up to you.
Avatar utente
menelicte
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 596
Iscrizione: lunedì 4 giugno 2007, 0:04

Re: programma c: funzione con numero di parametri variabile

Messaggio 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
"Tentare è il primo passo verso il fallimento" Homer J.
terenz84
Prode Principiante
Messaggi: 80
Iscrizione: mercoledì 30 novembre 2005, 18:19

Re: programma c: funzione con numero di parametri variabile

Messaggio da terenz84 »

grazie mi siete stati molto d'aiuto ho risolto il problema
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti