Zmiana typu zmiennej bez zmiany jej zawartości

0

Czy w Delphi jest możliwa zmiana typu zmiennej np z Integer na String bez zmiany jej zawartości. Nie chodzi mi o funkcje StrToInt czy IntToStr, bo te zmieniają typ danych modyfikując ich zawartość np cyfrę 0 (Integer ) zamieniają na 48 (String). 48 to odpowiednik cyfry 0 w ASC2.

Ja mam w zmiennej typu string np znak ":" co odpowiada znakowi ASC2 o numerze 58. Chciałbym zmienić typ tej zmiennej na Integer tak aby te 58 zostało bez zmian.

2
zew10 napisał(a):

Czy w Delphi jest możliwa zmiana typu zmiennej np z Integer na String bez zmiany jej zawartości.

Pewnie że da się – trzeba przekopiować pamięć:

var
  Num: UInt32 = $44434241;
  Str: String;
begin
  SetLength(Str, SizeOf(Num));
  Move(Num, Str[1], SizeOf(Num));

Jeśli teraz wyświetlimy zawartość Str:

WriteLn('Result: ', Str);

na wyjściu otrzymamy:

Result: ABCD

Procedura Move kopiuje cztery bajty (bo tyle zajmuje typ UInt32) ze zmiennej Num w miejsce pierwszego znaku łańcucha Str. Aby móc poprawnie przekopiować dane, najpierw musi zostać określona długość łańcucha (co wiąże się z alokacją pamięci).

Czyli najpierw przygotowyjemy docelowy obszar pamięci, a następnie kopiujemy dane.

Ja mam w zmiennej typu string np znak ":" co odpowiada znakowi ASC2 o numerze 58.

Nie ASC2, a ASCII – to nie jest rzymska dwójka, a dwie liery I od słów Information Interchange.

Chciałbym zmienić typ tej zmiennej na Integer tak aby te 58 zostało bez zmian.

Nie można zmienić typu zmiennej. Co najwyżej można jedną zmienną traktować na różne sposoby (za pomocą kilku różnie typowanych wskaźników lub przez rzutowanie) lub skopiować surową pamięć, bez konwersji danych.

Można mieć jedną zmienną do przechowywania danych różnego typu (sprawdź typ Variant), jednak to zupełnie inna para kaloszy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1