Problem ze wskaźnikami

0

Witam,
mam następujący problem: mam listę (tablicę dynamiczną) z wskaźnikami (Pointer). Chcę ją wykożystać w następujący sposób - przechowywać w niej obiekty różnych typów. Tak więc dodaję w ten sposób:

var
 tmp:TVcpppClass;
begin
 tmp:=TVcpppClass.Create;
 tmp.val := 'aaaaaaaaaa';
 AddListElement(tmp);

gdzie TVcpppClass to moja klasa z polem "val:string" a funkcja AddListElement(data:pointer); dodaje do tablicy dynamicznej element. No i wszystko pięknie, aż do czasu gdy chcę odwołać się do któregoś z obiektów :showmessage(TVcpppClass(FList[0]).val); powoduje Access Violation. Sprawdziłem, okazuje się że FList[0] = nil. A jednak, na sto procent przypisywałem do elementu 0 jakąś wartość. Odnosze więc wrażenie że element tmp zostaje automatycznie zwolniony (czyli wskaźnik na liście wskazuje na błędny obszar pamięci).
Proszę o pomoc!
Pozdrawiam
vcppp

0

Może w AddListElement(data:pointer); nie ma zwiększenie wielkości tablicy przez SetLength(). ?

0
Deti napisał(a)

Może w AddListElement(data:pointer); nie ma zwiększenie wielkości tablicy przez SetLength(). ?

Procedura wyglądać powinna tak:

SetLength(Flist, length(FList)+1);
 FList[High(Flist)]:=Data;
0
migajek napisał(a)
Deti napisał(a)

Może w AddListElement(data:pointer); nie ma zwiększenie wielkości tablicy przez SetLength(). ?

Procedura wyglądać powinna tak:
SetLength(Flist, length(FList)+1);
FList[High(Flist)]:=Data;

Witam
i wygląda dokładnie tak :)
Pozdrawiam
vcppp

0
vcppp napisał(a)
migajek napisał(a)
Deti napisał(a)

Może w AddListElement(data:pointer); nie ma zwiększenie wielkości tablicy przez SetLength(). ?

Procedura wyglądać powinna tak:

SetLength(Flist, length(FList)+1);
FList[High(Flist)]:=Data;

Witam
i wygląda dokładnie tak :)
Pozdrawiam
vcppp

a na sto procent nie masz tam gdzies tmp.free? :) lub freeandnil(tmp)?

0

moze tez przekazywac tablice z wektorami jako parametr.

0
Shrek napisał(a)

moze tez przekazywac tablice z wektorami jako parametr.

Tfu, ze wskaznikami. Jak nie ma tam var albo nie jest to openarray - efekt ten sam.

0

A musisz się bawić na poziomie Pointera? Skoro to klasy, to są to również wskaźniki. A korzystając z tego, że w Delphi każda klasa dziedziczy od TObject, nie możesz zamiast Pointer dać typu TObject?

0

Witam,
zrobiłem tak jak mówisz: zamieniłem pointer na TObject ale nic mi to nie dało : nadal wskaźnik ten jest błędny
pozdrawiam
vcppp

0

a jeszcze lepiej będzie zrobić tak:

var 
  FList: array of TVcpppClass;
  ...
  SetLength(FList, Length(FList) + 1);
  FList[High(FList)] := TVcpppClass.Create;
  FList[High(FList)].Val := 'aaaa';

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