Autor Téma: DLL, record, pointer vs out  (Přečteno 367 krát)

Offline Vejrous

  • Nováček
  • *
  • Příspěvků: 8
  • Karma: 2
    • Verze Delphi: Turbo Delphi 2006, Delphi 10.3.2 CE
DLL, record, pointer vs out
« kdy: 02-12-2020, 22:13:36 »
Dobrý den,
mám DLL knihovnu, která provádí nějaké výpočty a mám před sebou 2 varianty.

Používají se v případě ukazatelů out/const?
Pokud je procedure definovaná s out param, nelze použít @ operátor.

Za pomoc děkuji...

1. varianta

Kód: Delphi [Vybrat]
  1. type
  2.   Struct2d = record
  3.     X: Double;
  4.     Y: Double;
  5.   end;
  6.  
  7. procedure Struct2dZero(out Struct: Struct2d); stdcall;
  8.   begin
  9.     Struct.X := 0;
  10.     Struct.Y := 0;
  11.   end;
  12.  
2. varianta

Kód: Delphi [Vybrat]
  1. PStruct2d = ^Struct2d;
  2.  
  3. procedure Struct2dZero(out Struct: PStruct2d); stdcall;
  4.   begin
  5.     Struct^.X := 0;
  6.     Struct^.Y := 0;
  7.   end;

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1134
  • Karma: 49
    • Verze Delphi: 10.3
Re:DLL, record, pointer vs out
« Odpověď #1 kdy: 02-12-2020, 23:35:27 »
Ahoj,

použil bych buď první variantu tak, jak ji máš, nebo druhou variantu bez toho out (out tam nepatří, protože na vstupu už potřebuješ mít hodnotu toho ukazatele zadanou od volajícího).

K.



Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1537
  • Karma: 37
    • Pepak.net
Re:DLL, record, pointer vs out
« Odpověď #2 kdy: 03-12-2020, 06:53:45 »
Deklarace pomocí out X: TRecord je po stránce kódu téměř ekvivalentní s X: PRecord: Rozdíly jsou primárně v možnosti syntaktické analýzy (spolehlivější typová kontrola), z funkčních rozdílů mě napadá pouze možnost předat nil hodnotu jako signál "tato položka mě nezajímá, nevyplňuj ji". Deklaraci out X: PRecord bys použil v případě, že volaná procedura má změnit přímo ukazatel (ne jen obsah struktury odkazované ukazatelem), tedy například naalokovat paměť a naplnit ji. Je ale potřeba řešit, jak tu paměť zase uvolnit, protože to DLL nejspíš nepoužije paměťový manager Delphi - tzn. bude potřeba do DLL přidat ještě uvolňovací proceduru a tu z Delphi volat.

Offline Vejrous

  • Nováček
  • *
  • Příspěvků: 8
  • Karma: 2
    • Verze Delphi: Turbo Delphi 2006, Delphi 10.3.2 CE
Re:DLL, record, pointer vs out
« Odpověď #3 kdy: 03-12-2020, 10:14:36 »
Díky za upřesnění out

Jak se chová const X: PRecord ?

Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1537
  • Karma: 37
    • Pepak.net
Re:DLL, record, pointer vs out
« Odpověď #4 kdy: 03-12-2020, 12:18:10 »
V zásadě stejně jako X: PRecord, ale optimalizátor se může rozhodnout využít té vlastnosti "const" v tom smyslu, že se spolehne na to, že se ten ukazatel nezmění. Nenapadá mě spatra žádný případ, kdy by se ti to mohlo povést změnit, takže to snad nebude problém.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3103
  • Karma: 135
    • Verze Delphi: D2007, XE3, DX10
Re:DLL, record, pointer vs out
« Odpověď #5 kdy: 03-12-2020, 13:10:12 »
V zásadě stejně jako X: PRecord, ale optimalizátor se může rozhodnout využít té vlastnosti "const" v tom smyslu, že se spolehne na to, že se ten ukazatel nezmění. Nenapadá mě spatra žádný případ, kdy by se ti to mohlo povést změnit, takže to snad nebude problém.
A nebo je to stejne jako var X:TRecord s tim, ze ty pointery vyzaduji zbytecne operator dereference...

Podle me se ve vsech pripadech predava effektivni adresa recordu tj. instrukce lea record, ktera v pripade:
X:TRecord si v prologu procedury udela lokalni kopii jako automatickou promennou na stacku a zmeny se po opusteni scope ztrati
-  v pripade const:TRecord prekladac rve, kdyz se objevi na leve strane vyrazu
- var a out je totez jako predavani pointeru
- const X:PRecord nedovoli prepsat hodnotu pointeru, ale jak pise pepak, je to stejne hodnota na stacku, kterou kdyz prepises, tak se po opusteni scope ztrati

neco jineho je pointer na pointer, ktery umoznuje realokovat vlastni record, ale jak psal pepak, u DLL je treba dat pozor na memory managery.
a jeste neco jineho je cirkus, ktery se objevi v pripade, ze record obsahuje managed typy.


Offline Vejrous

  • Nováček
  • *
  • Příspěvků: 8
  • Karma: 2
    • Verze Delphi: Turbo Delphi 2006, Delphi 10.3.2 CE
Re:DLL, record, pointer vs out
« Odpověď #6 kdy: 03-12-2020, 22:14:58 »
Děkuji všem za pomoc.