Autore Topic: Passaggio di un numero arbitrario di parametri  (Letto 5385 volte)

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Passaggio di un numero arbitrario di parametri
« il: 13 Gennaio 2012, 09:41:46 »
Cosa  pensate del sistema TagList che usa Amiga (liste di strutture tag/valore) per passare un numero arbitrario di parametri ad una funzione?
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: Passaggio di un numero arbitrario di parametri
« Risposta #1 il: 13 Gennaio 2012, 10:04:15 »
Mi sembra un metodo utile, in mancanza di strumenti più adeguati lato linguaggio.
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: Passaggio di un numero arbitrario di parametri
« Risposta #2 il: 13 Gennaio 2012, 11:47:53 »
Citazione da: "TheKaneB"
Mi sembra un metodo utile, in mancanza di strumenti più adeguati lato linguaggio.
Ok, c'è però una cosa che mi lascia qlk dubbio:nel caso in cui il secondo membro del tag (il valore) indichi un indirizzo.
Nella struttura di commodore è di tipo ULONG (32 bit (??) senza segno)
Esiste un modo per indicare il tipo un generico indirizzo che si "adatti" all'architettura della macchina/compilatore (32 o 64 bit?)
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: Passaggio di un numero arbitrario di parametri
« Risposta #3 il: 13 Gennaio 2012, 12:02:08 »
chiaro che sia a 32bit, infatti gli indirizzi virtuali del 68000 sono proprio a 32bit (anche se alcuni modelli di CPU avevano meno linee fisiche, ma i registri avevano quella ampiezza).

Il tipo generico che si adatta da solo è size_t, che è un typedef definito come un tipo intero di lunghezza adeguata a contenere la differenza di due puntatori.

void * (oppure char * per compilatori molto vecchi) è esattamente della stessa dimensione, ma ha il significato proprio di puntatore.

Quindi per parametri generici è meglio usare void *, mentre per numeri interi di lunghezza pari a quella di un indirizzo della macchina, meglio usare size_t. In base ai vari #define, infatti, size_t potrebbe essere un unsigned long, unsigned int, unsigned long long, ecc... (dipende da OS e compilatore).
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline rebraist

  • Nerd
  • *****
  • Post: 946
  • Karma: +13/-1
    • Mostra profilo
Re: Passaggio di un numero arbitrario di parametri
« Risposta #4 il: 13 Gennaio 2012, 12:04:12 »
Dopo la spiegazione di shinkuro che mi ha aperto il cielo in merito a set e get, proprio in questi giorni sto buttando giù delle cosette nelle quali necessito delle taglist.
Se sono un meccanismo che per alcuni versi facilitano la scrittura di funzioni con numero variabile di argomenti dall'altro hanno, derivata dalla stessa intrinseca implementazione di boopsi, una serie di "peculiarità" che a mio avviso sono strane. Non limitanti, ma strane.
La guida di morphos a riguardo porta tutta una serie di operazioni fattibili con le taglist e alcune sono esoteriche a dir poco. Ma se tali operazioni sono possibili significa che qualcuno ne ha sentito la necessità.
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Amigaos spacca.
Aros rulla.
Morphos corre di brutto.
Sinceramente, non vorrei che mio figlio facesse amicizia con uno di questi tre tipacci.
Dottore:lei é uno di quelli che si potrebbero definire nerd...
Io: dottò, lo so di mio. Sono pure iscritto a 'n'forum...
Dottore: su internet?
Io: no a rete 4

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: Passaggio di un numero arbitrario di parametri
« Risposta #5 il: 13 Gennaio 2012, 12:20:50 »
Il problema non è tanto della libreria, che è discreta. Il problema è del C che ti costringe a fare i salti mortali se vuoi implementare qualcosa che sia Object Oriented, inventandosi design pattern eccessivamente convoluti che tentano di modificare il linguaggio stesso tramite uso massiccio di #define che non fanno altro che offuscare ancora di più il reale codice nascosto dietro certe strutture.
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: Passaggio di un numero arbitrario di parametri
« Risposta #6 il: 13 Gennaio 2012, 12:26:07 »
Citazione da: "rebraist"
Se sono un meccanismo che per alcuni versi facilitano la scrittura di funzioni con numero variabile di argomenti dall'altro hanno, derivata dalla stessa intrinseca implementazione di boopsi, una serie di "peculiarità" che a mio avviso sono strane. Non limitanti, ma strane.
Per esempio?
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: Passaggio di un numero arbitrario di parametri
« Risposta #7 il: 13 Gennaio 2012, 13:54:20 »
Citazione da: "dsar"
Evitate l'uso dei variadic parameter, sono unsafe e non ottimizzabili. Ci sono alternative decisamente migliori

in questo caso specifico mi pare che non si parla di ellipsis e vararg, ma si parla di normali array di struct, costruiti usando delle macro per semplificarne la costruzione e lettura. Il problema di questo approccio è che l'insieme di macro crea una sorta di linguaggio dentro il linguaggio, una feature del C che odio sinceramente "cu tuttu u sintimentu" (con tutto il cuore).
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: Passaggio di un numero arbitrario di parametri
« Risposta #8 il: 13 Gennaio 2012, 13:59:33 »
Mi correggo, effettivamente questi taglist vengono creati usando delle funzioni helper che contengono ellipsis/vararg  :twisted:

cfr: http://code.google.com/p/guidetoamigaco ... /CAP_4.txt
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: Passaggio di un numero arbitrario di parametri
« Risposta #9 il: 13 Gennaio 2012, 14:21:39 »
Citazione da: "dsar"
Evitate l'uso dei variadic parameter, sono unsafe e non ottimizzabili. Ci sono alternative decisamente migliori
Quali?
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: Passaggio di un numero arbitrario di parametri
« Risposta #10 il: 14 Gennaio 2012, 17:42:47 »
@TheKaneB:
Sai di cosa mi sono accorto? Che se metto il campo della struttura TagItem a void *, non posso passare costanti (almeno, non credo si possa risalire all'indirizzo di una costante e, se anche fosse, questo non sarebbe più valido all'uscita dello scope). Ecco perchè nella struttura TagItem di Commodore il campo ti_Data è un ULONG. Questo consente di fare cose del tipo:

MYTAG_NameTag,true,
MYTAG_NameTag2,5,

cosa che non poso fare usando come tipo void *.

Stavo pensando ad una soluzione alternativa...
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: Passaggio di un numero arbitrario di parametri
« Risposta #11 il: 14 Gennaio 2012, 17:42:47 »
@TheKaneB:
Sai di cosa mi sono accorto? Che se metto il campo della struttura TagItem a void *, non posso passare costanti (almeno, non credo si possa risalire all'indirizzo di una costante e, se anche fosse, questo non sarebbe più valido all'uscita dello scope). Ecco perchè nella struttura TagItem di Commodore il campo ti_Data è un ULONG. Questo consente di fare cose del tipo:

MYTAG_NameTag,true,
MYTAG_NameTag2,5,

cosa che non poso fare usando come tipo void *.

Stavo pensando ad una soluzione alternativa...
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5292
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: Passaggio di un numero arbitrario di parametri
« Risposta #12 il: 14 Gennaio 2012, 21:52:44 »
certo che puoi passare costanti, basta fare il casting (void *)5. Ma void * è utile SOLO per passare indirizzi, per parametri interi che siano lunghi quanto un indirizzo, usa size_t.
Quasi sempre size_t è un typedef che rimanda a unsigned long.
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: Passaggio di un numero arbitrario di parametri
« Risposta #13 il: 14 Gennaio 2012, 22:30:32 »
Citazione da: "TheKaneB"
certo che puoi passare costanti, basta fare il casting (void *)5. Ma void * è utile SOLO per passare indirizzi, per parametri interi che siano lunghi quanto un indirizzo, usa size_t.
Quasi sempre size_t è un typedef che rimanda a unsigned long.
Hai ragione, ho provato ora  fare il casting e funziona! Perchè mi faccio sempre queste seg*e mentali??  :lol:
 Però...void * a questo punto è "universale" (posso usarlo per indirizzi e costanti), size_t posso usarlo con la stessa disinvoltura anche per memorizzare indirizzi che siano dipendenti dalla piattaforma in uso (32/64 bit)?
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Offline clros

  • ASM Lover
  • *****
  • Post: 457
  • Karma: +3/-1
    • Mostra profilo
Re: Passaggio di un numero arbitrario di parametri
« Risposta #14 il: 14 Gennaio 2012, 23:47:13 »
insomma..esiste un tipo in cui poter memorizzare "tutto" in C?
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »
Claudio CP La Rosa

Tags: