Patrzyłem na Delphi: array of Char and TCharArray "Incompatible Types" i zacząłem eksperymentować. To, co odkryłem, jest dość interesujące.Czy tablica dynamiczna Char jest dozwolona, gdy typem parametru jest otwarta tablica Char?
procedure Clear(AArray: array of Integer);
var
I: Integer;
begin
for I := Low(AArray) to High(AArray) do
AArray[I] := 0;
end;
var
MyArray: array of Integer;
begin
Clear(MyArray);
end.
Ten prosty mały przykład pokazuje, w jaki sposób można przekazać dynamiczną tablicę do procedury za pomocą parametru Open Array. Kompiluje i działa dokładnie zgodnie z oczekiwaniami.
procedure Clear(AArray: array of Char);
var
I: Integer;
begin
for I := Low(AArray) to High(AArray) do
AArray[I] := #0;
end;
var
MyArray: array of Char;
begin
Clear(MyArray);
end.
Tu jest prawie identyczny kod jedyna różnica polega na tym, że wykorzystuje tablicę Char
zamiast Integer
. To się nie kompiluje. Zamiast tego kompilator wypluwa:
E2010 Incompatible types: 'Array' and 'Dynamic array'
Dlaczego miałoby to być?
Po pewnym czasie odszukałem raport QC this. Używam Delphi 2009 i nadal się dzieje.
Co to jest "zgodnie z oczekiwaniami"? Tablica nie jest wyczyszczona w pierwszym przypadku. –
Nadal +1, tylko dla jednego z przypadków kompilujemy (nawet jeśli używamy 'AnsiChar'), co jest dość dziwne, ponieważ istnieje bardzo mała różnica między liczbą całkowitą a" AnsiChar ". –
@Andreas, Ok, masz mnie tam. Pusta tablica nie ma nic do wyczyszczenia. Mój kod testowy miał wywołanie SetLength, ale usunąłem go, ponieważ nie był bezpośrednio związany z błędem kompilacji. –