Newsgroup: it.comp.lang.delphi
Titolo: Variable parameters e null pointers

Salve,
ho una domanda da fare!
Spesso, quando i file di header C/C++ vengono traslati in delphi, funzioni che
hanno parametri passati per riferimento passano da una forma come questa:
HRESULT GetCurrentImage(long *pBufferSize, long *pDIBImage);
a questa:
function GetCurrentImage(var BufferSize: Longint; var pDIBImage): HResult;
stdcall;
Il secondo parametro, che in C++ era un puntatore, in Object Pascal diventa una
parametro variabile contrassegnato con la clausola "var".
... Il problema è che in C++ posso anche passare un puntatore nullo (anzi, a
volte questo ha un particolare significato), mentre in Delphi non posso passare
nil perché pretende che gli si passi una espressione assegnabile!!
Come si fa in Delphi a passare un puntatore nullo ad una funzione che si
aspetta un parametro variabile ?!
Grazie per l'attenzione;
Fiduciosamente aspetto un aiuto!
Crism
-- 
Posted from  [212.177.19.163] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ha scritto nel messaggio
news:5bb0a17142eed9ff034...@mygate.mailgate.org...

Devi dichiarare la variabile di tipo variant e non longint, sarai poi tu a
fare il cast (attento!) al tipo longint, in questo modo puoi passare un
valore null.
--
Massimo
mago_merlino(at)
bigfoot.com

aspetta un parametro variabile ?!
Non lo si definisce come parametro per riferimento, ma come
puntatore.
In ogni caso e' sbagliato pensare di passare un puntatore
nullo ad una funzione che dovrebbe agire sul valore puntato.
--
Andrea Laforgia - walkietalkie(at)
libero.it
http://www.geocities.com/AndreaLaforgia


Mi ero dimenticato di dirti che potresti anche assegnare un valore di
default alla procedura/funzione, ad es.
[..]
private
  function MiaFunzione (AValue: Integer = 0);
public
In questo modo quando chiami MiaFunzione puoi omettere il parametro
Spero di esserti stato utile
--
Massimo
mago_merlino(at)
bigfoot.com

 nullo ad una funzione che dovrebbe agire sul valore puntato.
...il problema è che non sono stato certo io a definire la funzione!
Altrimenti me la sarei definita come mi pare, e non in un modo che poi
mi dà problemi! :)
Nel caso specifico, parlo della funzione GetcurrentImage 
dell'interfaccia IBasicVideo dell' SDK DirectX, che nella sua versione C++
riceve un puntatore, mentre nella traslazione in delphi operata dal 
"Project Jedi" riceve un parametro variabile.
Il problema è appunto che, stando alla documentazione su MSDN, 
la funzione si comporta in due modi diversi a seconda che gli si passi
un puntatore NULL (restituisce la dimensione richiesta per il buffer)
oppure il puntatore al buffer (riempie il buffer con l'immagine corrente).
... ecco da dove veniva il mio problema!!
Saluti,


oppure il puntatore al buffer (riempie il buffer con l'immagine corrente).
Credo allora sia sbagliata l'implementazione Jedi, infatti
quel parametro non andava rappresentato con un parametro
"var", ma con un puntatore.
In ogni caso, tu puoi sovrascrivere l'implementazione Jedi
con una tua implementazione, con la quale definisce il
parametro come puntatore.


 ... ecco da dove veniva il mio problema!!
supponendo che sia
function GetXxxx(hwnd: THandle; var Buffer; var Dim: Cardinal);
la chiamata la farei cosi':
var Buf: Pointer;
    BufDim: cardinal;
...
Buf := nil;
GetXxxx(anH, Buf, BufDim);
// Alloca BufDim su Buf e richiama la funzione
GetMem(Buf, BufDim);
try
    GetXxxx(anH, Buf, BufDim);
    ...
finally
    FreeMem(Buf);
end;
si veda anche l'help di D relativo a "Untyped parameters"
Saluti
Paolo Arosio