Programowanie w języku Delphi » Artykuły

Zmienne wariantowe

  • 6 komentarzy
  • 835 odsłon
  • Oceń ten tekst jako pierwszy
Czy nie denerwowało cię, że pisząc program musiałeś pamiętać o deklaracji odpowiednich zmiennych? W Delphi jednak już od dawna istnieją zmienne zmieniające typ w zależności od potrzeb. Oto program poprawny pod każdym względem w Object Pascalu:

var
  V : Variant; //deklaracja zmiennej wariantowej
begin
  V := 'Delphi'; //teraz zawiera tekst
  V := 1; //teraz liczbę całkowitą
  V := 123.45; //teraz liczbę zmiennoprzecinkową
  V := TRUE; //a teraz wartość logiczną
end;


Ten kod jest poprawny w Delphi, da się go skompilować i będzie działał.
Zmienna tego typu zajmuje 16 bajtów pamięci. Nie można w niej reprezentować wskaźników i obiektów.

Zmienne wariantowe mogą być argumentami wyrażeń: +, -, =, *, /, div, mod, and, or, xor i inne. Jednak ich użycie może doprowadzić do zaskakujących rezultatów.

Jeżeli argumenty operacji różnią się, Delphi przeprowadza konwersję na wspólny tp, którym jest zawsze typ silniejszy (najpierw DOUBLE, potem INTEGER, i STRING).

var
  V1, V2, V3 : Variant;
begin
  V1 := '100'; //łańcuch
  V2 := '50'; //też łańcuch
  V3 := 200; //integer
  V1 := V1 + V2 + V3;
end;


Jaki wynik? nie 350, a 10250.0. Dlaczego: bo V1 + V2 da '10050', a + V3 da 10250.0 (typ double, nie integer!).

Proponuję więc uważne korzystanie z takich zmiennych!

Zmiennych tych nie stosuje się przy znajomości danych wejściowych - jedynie jeżeli nie znamy typów danych, jakie poda nam użytkownik.

6 komentarzy

prgtw 2005-06-02 00:16

Ja osobiście typu Variant używam od bardzo dawna i sprawdza się znakomicie. Proponuję też zajrzeć i przestudiować dodatkowy moduł VARIANTS.

Normalnie nie wszyscy się od razu domyślają bo typ Variant jest zdefiniowany w module SYSTEM, a tam predefiniowane typy zmiennech nie mają swoich odpowiedników, gdyż są wbudowane w kompilator.

omikron87 2005-01-20 22:59

Założę sie o każdą kwotę, że Variant nie jest po to, żeby nie trzeba było używać IntToStr! Chętnie dowiedziałbym się o zmiennych Variant jako argumentach funkcji, bo daje to do ręki programisty potężne narzędzie! Taka mała dygresja ;)

brick0 2004-12-16 16:52

Dobrze, że o tym napisałeś, bo ja na przykład nie wiedziałem o takim czymś, a męczyłem się z zamianą inttostr itd.

psychoszayber 2003-07-07 22:30

A dlaczego piszesz o tym artykuł przecież Variant to dla mnie podstawowa zmienna ... hm może jest ktoś kto o niej nie wie

roSzi 2003-03-16 11:22

Mogłeś trochę więcej napisać o f-cjach specyficznych dla tego typu zmiennych.

Numi 2002-12-08 01:10

Hmm.. w sumie fajnie, że ktoś o tym napisał :).
Warto jednak zaznaczyć, że zmiennych tych nie używa się, jeśli w programie jest np. tylko i:integer - bo są duuuże - i właśnie zwracają ciekawe wyniki - jak zreztą zostao napisane ;)