Problem ze wskaźnikami i tablicami dynamicznymi

0

Mam taką sytuację.
2 unity. Na jednym:

var
  tablica: array of TMojTyp;

Teraz w drugim unicie w tablicy pomocniczej 'tab' chcę mieć to samo, co w tablicy 'tablica', więc robię:

var
  tab: array of TMojTyp;
begin
 tab:=tablica;
end;

Ale to by było za proste ;) Dostaję incompatible types, więc zrobiłem tak:

var
  tab: array of ^TZawodnik;
begin
  tab:=@tablica;
end;

Tu już oczywiście błędu nie ma, ale mam problem z odwołaniem do poszczególnego pola w rekordzie tablicy. Próbowałem na różne sposoby, np:

var
 s: string;
begin
 s:=tab.@nazwa;
end;

Jednak zawsze dostawałem błąd:
Record, object or type class required.
Więc jak mam się odwołać do tego pola?

0

skoro to tablica to musisz przeciez podac indeks, tak powinno byc:
tab[index]^.nazwa, ale tym sposobem bedziesz zmienial takze tablice 'tablica'.

0

Hmm... Może

Tab[i]^.NazwaPola

?

0
i_s_k_a_r napisał(a)

chyba tab^.nazwa, ale tym sposobem, jesli ta tab ma byc pomocnicza bedziesz zmienial takze tablice tablica.

Tylko będę odczytywał, więc nie ma z tym problemu. Ale tak zdaje się, próbowałem. Anyway jutro odpiszę co i jak.

0

Po pierwsze:

Delphi Help napisał(a)

A variable of a class type is actually a pointer that references an object. (..) But you don't have to explicitly dereference a class-type variable to access the object it points to. For example, SomeObject.Size := 100 assigns the value 100 to the Size property of the object referenced by SomeObject; you would not write this as SomeObject^.Size := 100.

Wniosek: przy zapisie TablicaDynamiczna[indeks]^.Pole można pominąć znak daszka (^), nawet gdy tablica zawiera wskaźnik do obiektu posiadającego pole Pole.

Po drugie gdzieś w helpie do Delphi jest napisane, że dynamiczne tablice nie są [jak w językach C/C++] wyłącznie wskaźnikami (bo zawierają dodatkowe info o długości ustawiane przez SetLength(..) ), stąd przypisanie np.: globalnej tablicy (array of Typ) do lokalnej (array of Typ) oznacza dla kompilatora, że są to różne typy tablic, więc jest niezgodność typów. Aby to ominąć zdefiniuj sobie własny typ (MojaArray = array of Typ), a potem i globalną i lokalną zmienną tablicową daj właśnie tego typu.

Po trzecie przypisanie tablica1:=tablica2, nawet po rozwiązaniu powyższego problemu nie kopiuje zawartości tablic, a powoduje, że oba odwołania wskazują na jedną tablicę. To kopiowania służy funkcja Copy(..).

Polceam zajrzeć do Helpa Delphi pod hasłem Dynamic Arrays.

0

Szczawik, wielkie THX! :)

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