Dostajesz błąd, albowiem język nie pozwala na przypisywanie łańcuchów znaków do macierzy znaków - nie ma zdefiniowanego zachowania operatora przypisania w takim przypadku;
Przekopiować zawartość łańcucha do tablicy możesz za pomocą uniwersalnej procedury Move - ona pozwala na kopiowanie dowolnego bloku pamięci; Poniżej przykład kopiowania pamięci pomiędzy łańcuchem a macierzą:
var
arrChars: array [0 .. 1023] of AnsiChar;
strLine: AnsiString;
intLen: UInt8;
begin
strLine := 'copying memory test';
intLen := Length(strLine);
WriteLn('Line: "', strLine, '"');
Move(strLine[1], arrChars[0], intLen);
strLine := '';
WriteLn('Line: "', strLine, '"');
SetLength(strLine, intLen);
Move(arrChars[0], strLine[1], intLen);
WriteLn('Line: "', strLine, '"');
ReadLn();
end.
Na wyjściu otrzymamy poniższą treść:
Line: "copying memory test"
Line: ""
Line: "copying memory test"
I tak ma wyjście wyglądać;
Co prawda użyłem dodatkowej zmiennej intLen
, ale gdzieś trzeba zapamiętać długość łańcucha przed jego wyczyszczeniem, żeby później wiedzieć ile znaków z powrotem skopiować z macierzy arrChars
do łańcucha strLine
; Jest to naturalne, bez kombinacji;
Jeśli ktoś lubi kombinować, to nie musi używać dodatkowej zmiennej do przechowania długości łańcucha, a wzamian skorzystać z pewnego prawa; Najpierw za pomocą procedury FillChar wypełnić zerami (znakami null
) całą tablicę arrChars
, następnie (tak jak powyżej) skopiować łańcuch i wyczyścić go; Teraz nie mamy długości łańcucha nigdzie zapisanej, więc nie wiemy jaką długość ustalić łańcuchowi strLine
; Nie wiemy, ale możemy sie dowiedzieć;
Zmienne typu PChar są wskaźnikami na znaki lub na ciągi znaków, zakończone znakiem null
; Do pobrania długości łańcucha siedzącego pod wskaźnikiem służy funkcja StrLen; Całość wyglądać będzie tak:
var
arrChars: array [0 .. 1023] of AnsiChar;
strLine: AnsiString;
begin
FillChar(arrChars[0], Length(arrChars), #0);
strLine := 'copying memory test';
WriteLn('Line: "', strLine, '"');
Move(strLine[1], arrChars[0], Length(strLine));
strLine := '';
WriteLn('Line: "', strLine, '"');
SetLength(strLine, StrLen(@arrChars[0]));
Move(arrChars[0], strLine[1], Length(strLine));
WriteLn('Line: "', strLine, '"');
ReadLn();
end.
Na wyjściu dostaniesz to samo co we wcześniejszym przykładzie;
Jeśli więc jedna lokalna zmienna więcej przyprawia Cię o ból głowy, to możesz skorzystać z takiego sposobu; Ważne wtedy będzie to, że ostatni znak macierzy arrChars
będzie musiał zawsze zawierać znak null
- w przeciwnym razie funkcja StrLen nie znajdzie końca buforu, albo znajdzie randomowy null
gdzieś w śmieciach sterty;
Tak więc masz dwa rozwiązania, ale wybierz pierwsze - drugie to bardziej ciekawostka.