Pointer na různé promenné rozdílného datového typu

Autor Téma: Pointer na různé promenné rozdílného datového typu  (Přečteno 1126 krát)

Offline age.new

  • Plnoletý
  • ***
  • Příspěvků: 115
  • Karma: 0
Zdravím,
poradil by mi někdo zkušený, zda-li je možné nějak šikovně "schovat" pod pointer různé proměnné (rozdílných datových typů)?

Mám proceduru, která mi plní různé proměnné. Proměnných je velké množství - od základních Delphi, tak i pole a struktury.


// příklad promených
var
 mBool : boolean;
 mInt : integer;
 mCard : cardinal;

// příklad volání procedury NAPLN
procedure NAPLN(@mBool, SizeOf(mBool));
procedure NAPLN(@mInt, SizeOf(mInt));
procedure NAPLN(@mCard, SizeOf(mCard));


V místě volání procedury NAPLN vím, jakou proměnnou musím použít, ale nechci mít složitý case a velký počet procedur NAPLN. Šlo by použít něco (pointer, nebo variant ..?) pod co bych mohl schovat všechny typy proměných a pak pouze jednou zavolat proceduru NAPLN? Např. mít funkci VRAT_UKAZATEL a v ní by byl case, který by mi podle toho jakou proměnou potřebuji, vrátil pointer na určitý datový typ. A ten bych pak použil v proceduře NAPLN...

type
 Tpotrebuji = (_boolean, _integer, _cardinal ...)

function VRAT_UKAZATEL(const co_potrebuji : Tpotrebuji) : PtrPromena;
begin
  case co_potrebuji of
    _boolean : result := mBool;
    _integer : result := mInt;
    _cardinal : result := mCard;
  end;
end;

procedure NAPLN(@PtrPromena, SizeOf(PtrPromena));


Napadá někoho jak by to šlo elegantně vyřešit?
Děkuji.




Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1095
  • Karma: 41
    • Verze Delphi: 7, 2010
Re:Pointer na různé promenné rozdílného datového typu
« Odpověď #1 kdy: 19-06-2015, 07:57:04 »
Já bych řekl "zapomeň". Není těžké z čehokoliv udělat pointer, ztrácíš ale pak informaci, jaký je to datový typ.
Pointery se už nenosí, používej OOP - společnou třídu a potomky.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1326
  • Karma: 30
    • Pepak.net
Re:Pointer na různé promenné rozdílného datového typu
« Odpověď #2 kdy: 19-06-2015, 10:48:05 »
Co takhle typ Variant?

Jinak ne, jenom se samotným pointerem si z principu nemůžeš vystačit. Vždy k tomu potřebuješ informaci navíc. Jak přesně je ta informace uložená (jestli jako interní proměnná variantu nebo jako explicitní proměnná nějakého recordu nebo jako identifikátor třídy nebo jako ukazatel na údaje o property) není podstatné.

Online pf1957

  • Padawan
  • ******
  • Příspěvků: 2165
  • Karma: 116
    • Verze Delphi: D2007, XE3, DX10
Re:Pointer na různé promenné rozdílného datového typu
« Odpověď #3 kdy: 19-06-2015, 11:27:46 »
Já bych řekl "zapomeň". Není těžké z čehokoliv udělat pointer, ztrácíš ale pak informaci, jaký je to datový typ.
Pointery se už nenosí, používej OOP - společnou třídu a potomky.
Presne. Dneska se k eliminici opakovaneho kodu pouzivaji generika a ty uz Delphi nejaky patek podporuje (v Delphi uz dost dlouho nic noveho nedelam, tak nevim jak moc dobra je jejich podpora, ale bezne veci by v tom mohli jit napsat).

Matlani pointeru a presypani raw dat po pameti patri nekam do minuleho tisicileti.

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2013
  • Karma: 89
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Pointer na různé promenné rozdílného datového typu
« Odpověď #4 kdy: 19-06-2015, 12:12:31 »
Dneska se k eliminici opakovaneho kodu pouzivaji generika a ty uz Delphi nejaky patek podporuje (v Delphi uz dost dlouho nic noveho nedelam, tak nevim jak moc dobra je jejich podpora, ale bezne veci by v tom mohli jit napsat).

To mne mrzí, že jsi to tak napsal. Limity generik určitě jsou, ale zatím snad kromě jednoho člověka (https://bitbucket.org/sglienke/spring4d) na světě na ně nikdo nenarazil (no dobře snad je pár dalších, kteří dokáží používat generika na max) .
Embarcadero MVP - Czech republic

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: