[ Ivan Vasić @ 18.07.2004. 17:53 ] @
Imam ActiveX kontrolu za F Furijeovu transformaciju koja sadrži metod definisan na seleći način (C++) :

Code:
void FFT(BOOL Inverse, unsigned int NumSamples, double* ReIn, double* ImIn, double* ReOut, double* ImOut)


Kako da je pozovem koristeći C# ???

Probao sam ovako nešto:
Code:
double ReIn, ReOut, ImOut; //takodje i sa double[1024]

axFFT.FFT(false, 1024, ref ReIn, null, ref ReOut, ref ImOut);

ali se kompajler naravno buni. (plus ne prihvata null)

Pointeri u ActiveX/u ukazuju na nizove double[NumSamples] (u primeru 1024)

Kako da ovo izvedem ?
[ Ivan Vasić @ 19.07.2004. 20:42 ] @
Daj ljudi sigurno neko zna !

Tata ?
[ Dragi Tata @ 19.07.2004. 20:47 ] @
Šta tačno prijavi kompajler?
[ Ivan Vasić @ 20.07.2004. 00:01 ] @
Tačno prijavi :
Citat:
Argument '4': cannot convert from '<null>' to 'ref double'

za "null". To je manji problem jer mogu da postavim neki ref argument koji ne koristim.

Nego evo uopšteno problem:

Kako da referenciram NIZ ? Pošto su mi ReIn, ReOut,ImOut - double a fja iz C++ uzima pointere na nizove dužine NumSamples, kontaš ?

Probao sam sa
double[] ReIn = new doube[1024]; ali onda kompajler izbaci :
Citat:
cannot convert from 'ref double[]' to 'ref double'


Jel moguće opšte ovo nekako da se odradi ili ne ?
[ havramm @ 20.07.2004. 12:51 ] @
Citat:
ivan@elfak: za "null". To je manji problem jer mogu da postavim neki ref argument koji ne koristim.


Ne. Stavi IntPtr.Zero umesto null.

E sad, ako ti je u COM-u deklarisano ovako:
Code:

void FFT(BOOL Inverse, unsigned int NumSamples, double* ReIn, double* ImIn, double* ReOut, double* imIn, double* ImOut)


Probaj da deklarises (managed) funkciju ovako:
Code:

public static extern void FFT(bool Inverse, uint NumSamples, ref IntPtr ReIn, ref IntPtr ImIn, ref IntPtr ReOut, ref IntPtr ImOut);


A ulazne nizove inicijalizuj ovako:
Code:

double[] ReIn = new double[1024]; // recimo...
IntPtr buffer1 = Marshal.AllocCoTaskMem(Marshal.SizeOf(double) * ReIn.Length);
Marshal.Copy(ReIn, 0, buffer, ReIn.Length);
// tako i za ImIn, ReOut, ImOut -> buffer2, buffer3 i buffer4
FFT(inv, numSamp, ref buffer1, ref buffer2, ref buffer3, ref buffer4);
Marshal.Copy(buffer3, ReOut, 0, ReOut.Length);
// i sad radis sa ReOut ili sa cim vec oces
...
// na kraju
Marshal.FreeCoTaskMem(buffer1); // itd...


Probaj pa javi, ja nisam probao, samo sam bacio pogled u MSDN (ovde) i "nasvrlj'o" ovo...
[ Ivan Vasić @ 20.07.2004. 13:07 ] @
Thnx, havramm. Čim probam javiću kako je ispalo.
[ Ivan Vasić @ 20.07.2004. 14:05 ] @
Ok. U pitanju je bila OCX kontrola pa sam je prepravio u ATL COM i uradio ovo odozgo.
Kompajler se opet pobunio zbog
Citat:
IntPtr buffer1 = Marshal.AllocCoTaskMem(Marshal.SizeOf(double) * ReIn.Length);

i to :
Citat:
Invalid expression term 'double'
totalno glupo.

Inače ako za arg. iskoristim promenljivu (objekat) tipa "double", prolazi. ( Marshal.SizeOf(objDouble) ).

Osim ove sitnice kod prolazi kompajliranje i mislim da je to to. Proveriću samo rezultate kasnije.

U svakom slučaju hvala puno.
[ havramm @ 20.07.2004. 16:11 ] @
Moja greska. Prevideo sam da Marshal.SizeOf trazi objekat (object) ili tip (Type) a ne ime tipa. Stara navika iz c++-a...