Witam.
Na wstępie chciałem zaznaczyć, że korzystam z komplikatora dołączonego do środowiska D2005 (Object Pascal v17) - może ktoś ma podobne doświadczenia? Otóż przedstawię problem fragmentami kodu:
Jest typ danych (przestrzeń nazw: main):
PProfile = ^TProfile;
TProfile = record
bValid: boolean;
sProfileName: string;
sProfileFile: string;
iIcon: byte;
bChangeName: boolean;
end;
następnie w funkcji:
var p: PProfile; s: integer;
begin ...
s := sizeof(main.TProfile) lub s := sizeof(TProfile) <-- nie mogę się domyśleć dlaczego jest 16
chociaż s := 2*sizeof(string) + 2*sizeof(boolean) + sizeof(byte) <-- daje prawidłowe 11
(string jako wskaznik -> 4, bajt i bool po 1b)
nastepnie gdy juz ustali sobie sizeof() jedzie tak:
p^.bValid := True; // ok!
p^.bChangeName := False; // ok!
p^.sProfileName := dbFile; <-- dbFile jest stringiem // ok!
p^.sProfileFile := "inny_string"; <-- tu jest błąd
Watches pokazuje wszystko prawidłowo z wyjątkiem wartości sProfileFile (jest Variable is inaccessible). To samo z Inspectorem - wszystko jest prawidłowo z wyjątkiem tej wartości. Przejrzałem pamięć pod CPU Window - w miejscu gdzie powinien być wskaźnik do łańcucha są śmieci, natomiast przed i dalej jest ok. Nie pomogło powywalanie plików tymczasowych i .dcu. Nie pomogły zmiany nazw zmiennych, restart całego BDS i systemu, zmiana kolejności pól rekordu, zmiana kolejności instrukcji przypisujących w funkcji, wymuszenie przestrzeni nazw (main.TProfile zamiast TProfile w unit main;), nie ma znaczenia czy jest sizeof(TProfile) czy po prostu wpisuję 2*sizeof(string)... .
Ostatnią czynnością jaką zrobiłem była zamiana z sProfileFile: string; na sProfileFile: string[255];. Przekompilowałem program i o dziwo uruchomił się bez żadnego błędu. Wróciłem do edycji kodu, skompilowałem ponownie i program przestał działać, a problem występuje w drugiej zmiennej sProfileName: string;.
Pierwszy raz się spotykam z takim zachowaniem ze strony kompilatora (ew. błąd w Memory Manager'ze??). Google milczą. Może ktoś z Was?
Z góry dzięki za pomoc/poradę/podpowiedź.
Zefir.