Dll i dynamiczne tablice.

0

Mam w dll'ku procedure ktorej parametrem jest dyn. tablica

Procedure Test(Var Tablica : Array of Integer);

Kiedy probuje uzyc SetLength, Delphi wywala mi blad "Incopatible types" czy cos w tym rodzaju. Jak to mozliwe skoro w normalnym projekcie wszystko dziala?

Probowalem poprzez wskazniki ale po zastosowaniu SetLength wystepuje wyjatek Invalid Pointer Operation....

A wiec co mam zrobic???? Blagam o pomoc. [glowa]

0

To nie jest wina dll-ki. Mówiąc szczerze, nie bardzo wierzę, że to działa w normalnym projekcie.

jesli parametr tablicowy jest zadeklarowany tak, jak napisałeś, to nie jest to tablica dynamiczna, tylko tablica otwarta. Jako taki parametr możesz przekazać do tej procedury zarówno tablicę dynamiczną jak i statyczną, ale nie możesz zmieniać jej długości - i nie dziwota, bo nie wiadomo z góry, jaka tablica będzie przekazane.

Jak w takim razie zadeklarować procedurę, by parametrem była tablica dynamiczna? Ano tak:

type
TTabDynInt=array of integer;

Procedure Test(Var Tablica : TTabDynInt);

i oczywiście tablice przekazywane do tej procedury również trzeba zadeklarować jako TTabDynInt

Tradycyjnie wspomnę, że już to kilka razy pisałem na forum. W artach też chyba jest.

0

Wielkie dzieki, jestes boski...

A tak a propos to moje "dynamiczne" tablice wykminilem z pomocy Delphi. Tam deklaracja przykladowej tablicy dyn. wyglada tak :

var MyFlexibleArray: array of Real;

Na forum szukalem ale nie znalazlem. Moze szukac nie umiem. [niewinnosc]

0

Tam deklaracja przykladowej tablicy dyn. wyglada tak :

var MyFlexibleArray: array of Real;

Żeby było jasne. To jest poprawna deklaracja tablicy dynamicznej o ile jest użyta normalnie w tekście programu. Natomiast jeśli taki zapis znajdzie się na liście parametrów procedury/funkcji, wtedy traktowany jest jako otwarta.

PS. Bez przesady z komplementami, tym bardziej takimi, zważyszy moją sygnaturkę ;).

0

2 pytanka -

  1. Gdybym chcial teraz zadeklarowac normalnie otwarta tablice to jak mialbym ja zadeklarowac?

  2. Czym rozni sie otwarta od dyn? W dynamicznej komorki tworzone sa podczas dzialania programu (tak pojmuje pojecie "dynamiczny"), a otwartej? Skoro jest otwarta to moze tez moze "przyjac" n komorek.

0

2 odpowiedzi

  1. Nie da się. Tak naprawdę 'tablica otwarta' to skrót, pełna nazwa brzmi 'otwarty parametr tablicowy'. Jest to technika pozwalajaca tworzyc procedury przyjmujace dowolne (statyczne lub dynamiczne) tablice jako parametry.

  2. Otwarty parametr tablicowy nie jest tworzony. Tworzona jest (w programie) tablica, ktora bedzie przekazana jako parametr do procedury. Moze to byc tablica statyczna lub dynamiczna i jest tworzona w odpowiedni sposob. Roznica z punktu widzenia programisty polega na tym, ze nie mozna zmienic wielkosci tablicy otwartej, bo na etapie programowania nie wiadomo, czy pod tym parametrem bedzie 'ukryta' (przekazana) tablica statyczna czy dynamiczna.

0

Wielkie dzieki, wyglada na to ze nie znam podstaw.... :-/

0

Aha, teraz kiedy wychodze z programu wywala blad invalid pointer operation. Dllka dolaczana jest statycznie wiec raczej odpada jakis konflikt miedzy dll a tablica. Moze trzeba zwolnic pamiec po tej tablicy? np SetLength(Tablica, 0);???

0

Trudno mi powiedziec, ja nie mialem takich problemow. Ale jedyny program, w ktorym robilem podobne rzeczy uzywal parametrow otwartych (bez SetLength) i dll byla laczona dynamicznie. Zasadniczo, tablice dynamiczne powinny zwolnic sie same: jesli sa zmiennymi lokalnymi to przy wyjsciu z procki, jesli polami formy to przy zamknieciu tejze. Jesli chcesz zwolnic (np zeby bylo porzadniej albo zeby po prostu grzecznie zwolnic od razu niepotrzebna pamiec) zrob SetLength(Tablica,0) lub Tablica:=nil;

Nie mylisz sie gdzies w indeksach i nie trafiasz obok tablicy? Pamietasz, ze dla tablic dynamicznych Low(Tablica)=0 a High(Tablica)=Pred(Length(Tablica));?
Dosc czestym bledem jest petla po tablicy z gorna granica = Length(Tablica) a nie High(Tablica).

0

Mam prosbe, czy moglbys podeslac mi jakis program ktory poprzez dll zmienialby rozmiar tablicy? byc moze robie cos zle...

[email protected]

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