[Delphi] Hoe wordt parameter aan procedure doorgegeven?

Pagina: 1
Acties:
  • 114 views sinds 30-01-2008
  • Reageer

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 00:12

Tomatoman

Fulltime prutser

Topicstarter
Gegeven de volgende proceduredeclaraties:
Delphi:
1
2
3
4
procedure ProcA(ParamA: Integer);
procedure ProcB(const ParamB: Integer);
procedure ProcC(ParamC: array of Integer);
procedure ProcD(const ParamD: array of Integer);
Bij ProcA wordt de waarde van ParamA aan de procedure doorgegeven (by value), terwijl bij ProcB een pointer naar ParamB wordt doorgegeven (by reference).

Parameters bij ProcD worden ook by reference doorgegeven, maar hoe zit het bij ProcC? Ik begin te vermoeden dat ook ParamC by reference wordt doorgegeven. Reden: Bij de code hieronder wordt in een code tag bij regel 8 door Delphi aangegeven dat TIntArray van het type ^array of Integer is, een dereferenced pointer dus!
Delphi:
5
6
7
8
type
  TIntArray = array of Integer;

procedure ProcE(ParamE: TIntArray);
Weet iemand hoe Delphi complexe datatypen zoals arrays en records aan procedures doorgeeft? Is dat altijd by reference of alleen als er const voor staat?

Een goede grap mag vrienden kosten.


  • Coltrui
  • Registratie: Maart 2001
  • Niet online

Coltrui

iddqd

Als ik me niet vergis had ik ooit een soortgelijke vraag...

http://gathering.tweakers.net/forum/list_messages/623914

  • Sjnirk
  • Registratie: Maart 2001
  • Laatst online: 27-03-2025

Sjnirk

Hie vrieve

Bij visual c worden ze altijd als reference meegegeven,m zou goed kunnen hier ook

Bikkelen gebeurt pas na 2:00


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

ProcD is niet hetzelfde als ProcE, daar de eerste een Open array parameter is en de ander een Dynamisch array. In het topic dat Wezen aangeeft staat wat de verschillen tussen de vele soorten array's zijn die Delphi kent.

Bij een 'var' altijd By Reference als pointer. Anders ('const' en 'value') hangt het af van het type en de groote: Een Dynamisch array wordt als een pointer behandeld en worden dus altijd By Reference doorgegeven als pointer. Een Open array wordt ook als pointer doorgegeven, maar krijgt nog een extra getal mee voor de lengte. Ook hier wordt dus altijd By Reference doorgegeven. Statische array's worden By Value doorgegeven als ze kleiner zijn als 4 bytes, anders By Reference als pointer. Of deze parameters via het register of de stack worden doorgegeven hangt af van de 'calling conventions'.

Maar wat je eigenlijk wilt weten, denk ik, is het volgende:
Bij Statische en Open array's wordt een copy gemaakt op de stack als het een 'value' parameter is. Bij Dynamische array's wordt bij een 'var' parameter direct de pointer doorgegeven, anders een copy van de pointer op de stack. De inhoud van een Dynamisch array kan dus altijd aangepast worden, ondanks dat er 'const' gebruikt wordt. Niet de inhoud, maar de pointer is in dit geval constant (Net als bij een TObject). Er kan dus geen SetLength gedaan worden bijvoorbeeld. 'Const' garandeerd dus niets en is alleen een extra compiler check.

Je kan het zelf zien door gebruikt te maken van het CPU venster en de asm code te lezen :) Of te kijken naar de addressen van de parameters die doorgegeven worden buiten en binnen de functie. Zie ook Help - Contents - Object Pascal Reference - Program control - Parameters and function results - Parameter passing.

Kortom: Alles naast simpele ordinal values (Getallen, Sets, Enumirations) voor zover mogelijk als 'const' doorgeven. Daarnaast zorgt 'const' er ook nog voor dat Reference counting bij String, Interfaces en Dynamische array's niet uitgevoerd wordt en nog dus een kleine winst geeft.

We adore chaos because we like to restore order - M.C. Escher


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 00:12

Tomatoman

Fulltime prutser

Topicstarter
_/-\o_ LordLarry!

Een goede grap mag vrienden kosten.