Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [Delphi] Parametri Open Array Type-Variant

    Salve a tutti!
    Nella guida di Maroc Cantù si parlava di procedure e funzioni, trattando quelle con Parametri Open Array Type-Variant, con come esempio la funzione Format().

    Se n'è mostrata l'implementazione e fin qui tutto ok, cioè: ho capito cosa fa e come si chiama la suddetta funzione (se nn mi sbaglio, è come il printf del C). Poi però nn ho capito la spiegazione seguente, con tanto di codice:


    Il record TVarRec ha la seguente struttura:

    codice:
    type
      TVarRec = record
        case Byte of
          vtInteger:    (VInteger: Integer; VType: Byte);
          vtBoolean:    (VBoolean: Boolean);
          vtChar:       (VChar: Char);
          vtExtended:   (VExtended: PExtended);
          vtString:     (VString: PShortString);
          vtPointer:    (VPointer: Pointer);
          vtPChar:      (VPChar: PChar);
          vtObject:     (VObject: TObject);
          vtClass:      (VClass: TClass);
          vtWideChar:   (VWideChar: WideChar);
          vtPWideChar:  (VPWideChar: PWideChar);
          vtAnsiString: (VAnsiString: Pointer);
          vtCurrency:   (VCurrency: PCurrency);
          vtVariant:    (VVariant: PVariant);
          vtInterface:  (VInterface: Pointer);
      end;
    Ogni possibile record ha il campo VType, anche se non e' facile vederlo al primo momento visto che e' dichiarato solo una volta, piu' il dato effettivo di dimensione integer (generalmente un riferimento o un puntatore).


    Mi potete spiegare come funziona il record TVarRec?
    thx
    Pknews
    Open Source & open views

    In Iraq stanno scrivendo la Costituzione. Diamogli la nostra. A noi non serve più. (Daniele Luttazzi)

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Il record TVarRec è un record molto particolare che viene utilizzato da Delphi per mantenere i dati relativi ad una variabile Variant in memoria.

    Il tipo Variant è un tipo di dato particolare: può tramutarsi in tipi di dati diversi a seconda del valore che viene assegnato alla variabile.

    Per consentire questo, Delphi utilizza internamente il record che hai citato e che viene utilizzato dalle funzioni di gestione dei Variant per elaborarne il contenuto.

    Sinceramente, ti consiglio di cercare sempre una buona alternativa ai Variant poichè, data la loro complessa struttura, sono più "ingombranti" e lenti rispetto ad altre strutture dato più specifiche.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Affermo quanto detto da alka, anche se delphi è un buon ottimizzatore e i pc attuali non hanno problemi di memoria è bene ricordare che i variant vengono rappresentati su una dword (double word, 64bit) per evitare perdita di precisione se usiamo floating point molto piccoli.
    In questo caso delphi no può ottimizzare niente e quindi è consigliabile non abbusarne.

    Ciao

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466

    Variant...

    A dir la verità, i Variant occupano esattamente 16 bytes di memoria, quindi la bellezza di 128 bit.

    Nel mio discorso, non volevo comunque far ricadere sul problema "occupazione memoria", che in ogni caso non sarebbe da trascurare, ma bensì sul problema "performance generali del programma".

    Se non c'è un effettiva necessità di utilizzare dei Variant, meglio utilizzare variabili di tipo specifico (Integer, Double, ecc.) in modo da risparmiare al codice tutti quei controlli ed elaborazioni aggiuntive che devono essere effettuate per i Variant.
    La loro bella funzionalità si paga.......

    Riguardo all'ottimizzazione del compilatore Delphi, solitamente ci si riferisce all'uso (quando possibile) dei tipi interi poichè sono più facilmente (e velocemente) gestibili dal processore.
    Pertanto, se non esplicitato dal programmatore, anche le variabili di tipo Byte, Word, SmallInt, ShortInt...si trasformano sotto sotto in Integer a 32 bit! Provare per credere...

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Grazie mille!
    Ciò che mi avete detto, l'avevo intuito...
    ho ancora due dubbi:
    1- Nel codice che ho proposto nn dovrebbero esserci due end?
    2- Nn capisco che cosa faccia materialmente il costrutto case

    Thx a lot!
    Pknews
    Open Source & open views

    In Iraq stanno scrivendo la Costituzione. Diamogli la nostra. A noi non serve più. (Daniele Luttazzi)

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Non si tratta del classico case che siamo abituati a vedere quando si tratta di eseguire diversi blocchi di codice a seconda del valore assunto da una variabile...

    In questa dichiarazione, il case sta ad indicare che tutti i campi riportati occupano la stessa area di memoria.
    Si tratta di particolari tipi di record in cui tutti i campi convididono la stessa area di memoria, misurata in base alla dimensione del tipo di dato più grande da memorizzare.

    Il funzionamento di questi record è del tutto simile alla UNION che si usa nel C.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.