Otrzymuje błąd AV - TArray kontra Array of

0

Poniżej kod, nie wiem dlaczego otrzymuje błąd gdy korzystam z TArray

  const  
   FrameClasses: array[0..0] of TacFrame = (TFrame_Contractors);
   FrameClasses2: TArray<TacFrame> = [TFrame_Contractors];
  begin
     FrameClasses[0].Create(Application);
     FrameClasses2[0].Create(Application);  <- Tutaj jest błąd
  end;
0

Pomyśl jaki ma rozmiar tablica.

0

Obie mają po 1 elemencie.

0

Jaka treść błędu? Czemu w ogóle tablice (w dodatku jednoelementowe) i co ostatecznie chcesz osiągnąć?

0

Teraz nie mam jak sprawdzić ale wcale nie jestem pewien czy tablica dynamiczna ma 1 element czy jak przypuszczam zerowy rozmiar po deklaracji a rozmiar trzeba nadać poprzez SetLength.

0

i co to jest TFrame_Contractors oraz TacFrame
@kAzek tablica dynamiczna ma rozmiar = 0 z tym, że tam jest przypisanie to stałej więc może być cokolwiek.

Generalnie PIERWSZE co się podaje w takim przypadku to TREŚĆ BŁĘDU!

0

Jedyne co wiemy (z tytułu wątku), że jest to AV, czyli dostęp do niezarezerwowanej pamięci. A skoro tak, to na 100% TArray ma zerowy rozmiar, a jego komórka o indeksie 0 po prostu nie istnieje. Co jest dziwne, bo jest zainicjalizowana – powinna posiadać jedną komórkę.

Mimo wszystko sugeruję w dokumentacji sprawdzić dlaczego tak się dzieje.

0

Podaję wszelkie szczegóły

type 
   TacFrame = class of TFrame

Tablica jest jednoelementowa ponieważ to tylko przykład, elementów będzie znacznie więcej.

Gdy podczas debugowania najadę kursorem na FrameClasses2 delphi pokazuje mi zawartość tablicy:

FrameClasses2 (TacFrame($12D62F8))
[0] TacFrame($12D62F8)

W przypadku FrameClasses ( array[0..0] of TacFrame ... )
Otrzymuję:

FrameClasses (TacFrame($12D6230))
[0] TacFrame($12D6230)

Czyli tablice posiadają po jednym elemencie. Jednak zauważcie że mają różny adres w pamięci co jest rzeczą raczej nie możliwą gdyż powinny się odwoływać do typu TFrame_Contractors.

Program wywala się na poniższym kodzie:


FrameClasses2[0].Create(Application);  //AV
FrameClasses[0].Create(Application);  //Działa

Program zatrzymuje się w poniższym modulepo wywaleniu AV

VCL.Controls

procedure TControl.SetStyleElements(const Value: TStyleElements);
begin
  if FStyleElements <> Value then
  begin
    FStyleElements := Value;  //Tutaj dokładnie
    if not (csDesigning in ComponentState) and TStyleManager.IsCustomStyleActive then
      UpdateStyleElements;
  end;
end;
0
Rafał D napisał(a):

Czyli tablice posiadają po jednym elemencie. Jednak zauważcie że mają różny adres w pamięci co jest rzeczą raczej nie możliwą gdyż powinny się odwoływać do typu TFrame_Contractors.

Te adresy nie dotyczą danych (czyli tego na co wskazują wskaźniki zawarte w tablicach), a pokazują adresy komórek tych tablic. Tak więc siłą rzeczy muszą mieć inne adresy. Sprawdź jak to będzie wyglądało dla wieloelementowych macierzy.

Tzn. tak obstawiam, bo z Delphi nie korzystam, więc nie sprawdzę empirycznie. ;)

0

No niestety po zdefiniowaniu 3 elementów w tablicy wszystkie mają taki sam adres. Zarówno w pierwszym jak i drugim sposobie definiowania tablicy z tą różnicą że różnią się tym adresem.

array.jpg

Nawet jak zdefiniuje kilka tablic np:


FrameClasses: array[0..1] of TacFrame = (TFrame_Contractors,TFrame_Contractors);
Tablica: array[0..1] of TacFrame = (TFrame_Contractors,TFrame_Contractors);

To adresy są identyczne w jednej jak i drugiej tablicy

0

Ok. Zastanawiałem się dlaczego w przykładzie który podałeś adresy są różne w obu tablicach i adres komórek by to tłumaczył. Ale skoro w drugim przykładzie adresy są takie same to już nic nie wiem.

Być może TArray nie nadaje się do takiego użytku, ale tutaj trzeba by albo przeglądnąć dokumentację w poszukiwaniu odpowiedzi, albo skontaktować się z embarcadero, jeśli nikt nie będzie znał rozwiązania tego problemu.

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