Hmm, dziwne - testuję poniższy kod pod Lazarusem w trybach OBJFPC
i DELPHI
i wszystko gra:
var
arrValue: array [0 .. 8] of AnsiChar;
strValue: AnsiString;
begin
strValue := 'foo';
arrValue := strValue;
Write('Value: "', arrValue, '"');
end.
Żadnych błędów ani wyjątków - program kompiluje się i działa bezbłędnie; Widocznie Delphi zupełnie inaczej traktuje ciągi i tablice znaków, dlatego takie rzeczy wychodzą;
Jak indeksuje od 0.. przy ansichar wszystko działa z tym że wartości musze pisać na szytwno nie moge przekazać zmienną.
Tzn. możesz, wszystko możesz, ale nie za pomocą standardowego przypisania; Jeśli pola struktury koniecznie musza być macierzami znaków indeksowanymi od 0
i kompletnie nie masz pojęcia jak przepisać łańcuch ze zmiennej do takiej tablicy to pozostaje użycie FillChar w celu wyzerowania macierzy oraz Move, która skopiuje blok pamięci:
FillChar(arrValue[0], Length(arrValue), 0);
Move(strValue[1], arrValue[0], Length(strValue));
Zarówno łańcuchy znaków jak i macierze w pamięci zajmują ciągłe bloki, więc ich kopiowanie na pewno nie będzie sprawiać żadnych problemów;
PS: Nie używaj typów znakowych i łańcuchowych byle jak, bo one wszystkie nie oznaczają tego samego; Pomiędzy typami Char
, AnsiChar
i WideChar
jest spora różnica, więc należy wybrać jeden typ dla znaków i łańcuchów i stosować je wszędzie; Jednak aby wybrać odpowiedni typ danych, należy zapoznać się z API i jego dokumentacją.