Otrzymuje błąd AV - TArray kontra Array of

Otrzymuje błąd AV - TArray kontra Array of
RD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 212
0

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

Kopiuj
  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;
KA
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Gorlice
0

Pomyśl jaki ma rozmiar tablica.

RD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 212
0

Obie mają po 1 elemencie.

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
0

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

KA
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Gorlice
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.

abrakadaber
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6610
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!

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
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.

RD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 212
0

Podaję wszelkie szczegóły

Kopiuj
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:

Kopiuj

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

Program zatrzymuje się w poniższym modulepo wywaleniu AV

Kopiuj
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;
flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
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. ;)

RD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 212
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:

Kopiuj

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

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.