Precedente :: Successivo |
Autore |
Messaggio |
saetta Eroe in grazia degli dei

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 25 Gen 2010 13:02 Oggetto: [C] stdarg |
|
|
Salve, qualcuno sa di preciso cosa significa se in una firma di funzione a N° di parametri variabile, l'ulitmo è un NULL?
Mi son trovata davanti a questa firma
Codice: | Tipo_Ptr_a_Struct createStruct(char *c1, ..., cn, NULL) |
che, a sentire dalla specifica dovrebbe creare una nuova struct con campi le stringhe passategli, e ritornare un ptr ad essa.
Illuminatemi oh Dei dell'Olimpo!!! 8) |
|
Top |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 25 Gen 2010 23:36 Oggetto: |
|
|
Uhm... strano!
Sinceramente mi è nuova questa cosa.
Non hai modo di linkarci la guida?
Non mi sembra di ricordare che nella dichiarazione di una firma si possa esplicitare un valore (tranne nel caso dei parametri di default che però l'ansi c non prevede ma comunque non sarebbe questo il caso).
Per scrupolo ho aperto uno dei sacri testi, "Linguaggio C" di Kernighan & Ritchie, "O supremi grazie per il vostro contributo all'informatica" ma pure lì non ne ho trovato traccia!
L'uso normale delle funzioni a parametri variabili è:
Codice: |
#include <stdarg.h>
void fun(int fisso1,int fisso2, float fisso3,...)
{
va_list p; // puntatore agli argomenti anonimi
va_start(p,fisso3); // si deve inizializzare il puntatore p all'ultimo parametro fisso
// supponendo che in fisso1 ci sia il numero esatto di parametri anonimi
for (int i=1;i<=fisso1;++i)
{
printf("%d\n",va_arg(p,int));
}
va_end(ap); // pulisce ap (da chiamare sempre alla fine!)
}
|
Il precedente esempio fa schifo però è giusto per capirci.
Il top sarebbe usare dei puntatori a carattere e poi fare il cast e magari fermarsi quando un paramtro è NULL in modo da non essere dipendenti dal numero.
Sinceramente la scrittura che tu proponi mi è ignota!
Forse ho incasinato un po' le cose... |
|
Top |
|
 |
saetta Eroe in grazia degli dei

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 28 Gen 2010 10:03 Oggetto: |
|
|
Grazie della risposta.
Credo comunque che la firma sia stata scritta male ovvero sia stata mischiata la firma vera e propria della f.ne con la sua chiamata, dove un (char *)NULL come ultimo parametro permetterebbe di capire che siamo alla fine dei parametri variabili. Piuttosto inutile, direi.
Pur io mi son rifatta alle "sacre scritture" compreso "C: didattica e programmazione" e "tricky C"... ma niente da fare, l'unca cosa che ho trovato in rete sono delle slides dove indica 2 modi per indicare alla funzione quanti sono i parametri:
1) passare il valore come argomento fisso
2) usare un valore sentinella:
-----chiamata (su tutte le stringhe): fun(s0, s1, s2, s3, (char *)NULL);
-----Nella funzione si ha: ...while((p=va_arg(ap,char *)) != NULL){...}
Se scopro qualcosa vi notifico...! |
|
Top |
|
 |
saetta Eroe in grazia degli dei

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 11 Feb 2010 17:05 Oggetto: |
|
|
Era proprio così... la specifica sopracitata stava a significare che nella CHIAMATA alla funzione variadic l'ultimo argomento deve essere null.
Quindi nell'implementazione della suddetta funzione bisognava prevedere la lettura dell'ultimo argomento NULL.
Grazie ragazzi. |
|
Top |
|
 |
freemind Supervisor sezione Programmazione


Registrato: 04/04/07 21:28 Messaggi: 4643 Residenza: Internet
|
Inviato: 13 Feb 2010 19:39 Oggetto: |
|
|
Grazie a te saetta! |
|
Top |
|
 |
|