Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
[C] stdarg
Nuovo argomento   Rispondi    Indice del forum -> Programmazione
Precedente :: Successivo  
Autore Messaggio
saetta
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 25/02/08 11:52
Messaggi: 129

MessaggioInviato: 25 Gen 2010 13:02    Oggetto: [C] stdarg Rispondi citando

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
Profilo Invia messaggio privato
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 25 Gen 2010 23:36    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
saetta
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 25/02/08 11:52
Messaggi: 129

MessaggioInviato: 28 Gen 2010 10:03    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
saetta
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 25/02/08 11:52
Messaggi: 129

MessaggioInviato: 11 Feb 2010 17:05    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
freemind
Supervisor sezione Programmazione
Supervisor sezione Programmazione


Registrato: 04/04/07 21:28
Messaggi: 4643
Residenza: Internet

MessaggioInviato: 13 Feb 2010 19:39    Oggetto: Rispondi

Grazie a te saetta!
Top
Profilo Invia messaggio privato
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Programmazione Tutti i fusi orari sono GMT + 2 ore
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi