[D2k5] Prosty rekord i komplikator ;)

0

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.

0
zefir_psv napisał(a)
p^.sProfileFile := "inny_string";  <-- tu jest błąd

To nie jest C++ albo podobny do niego język :D
zamień " na ' i powinno działać ;)
czyli to powinno wyglądać:

p^.sProfileFile := 'inny_string';
0

Mój błąd - nie wiedziałem jak się wyrazić. Pisząc "inny_string" miałem na myśli:

var tmp: string;
begin
  ...
  tmp := 'cokolwiek';  // ;)
  ...
  p^.sProfileName := tmp;
  ...
end;

Sorry za nieścisłość. BTW: Delphi by tego "" nie przełknął, a w poście wspominałem o wielokrotnym kompilowaniu zakończonym (rzekomo) sukcesem ;P

0

Nie wiem jak delphi 2005 ma to rozwiązane, ale uważaj z używanie typu STRING. Wiec, że odpowiednikiem Pascalowego typu string jest w delphi ShortString. Jest to klasyczny 255 znakowy typ. Normalnie w delphi string = AnsiString = 2^31 znaków. Jeżeli używasz typu string to ustal mu długość np. string[40] lub używaj typu ShortString lub ustaw dyrektywe kompilatora {$H+}.

0

Mam tego świadomość, więc na przykład nie będę tego rekordu wpisywał bezpośrednio do pliku, ale używam go do trzymania danych w pamięci. Zmienna typu PProfile jest wskaźnikiem i jest w liście typu TList (a raczej tworzę zmienną i ustawiam jej wartości przed wykonaniem

  TList(Lista).Add(p);

gdzie p: PProfile; z przydzieloną pamięcią jak w pierwszym poście.
)

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