sobota, października 25, 2008

Wywoływanie funkcji w C z języka C#

Udało mi się, po paru próbach, dojść do takiego kodu:

[C#]
       [DllImport("mytest.dll", EntryPoint="makeFFT")]
       private static extern void makeFFT_(IntPtr inputArray, IntPtr outputArray);

       public static void makeFFT(float[] inpArr, float[] outArr)
       {
            IntPtr inpArrBuf = Marshal.AllocHGlobal(sizeof(float) * inpArr.Length);
            IntPtr outArrBuf = Marshal.AllocHGlobal(sizeof(float) * outArr.Length);
            
            Marshal.Copy(inpArr, 0, inpArrBuf, inpArr.Length);

            makeFFT_(inpArrBuf, outArrBuf);

            Marshal.Copy(outArrBuf, outArr, 0, outArr.Length);
            
            Marshal.FreeHGlobal(inpArrBuf);
            Marshal.FreeHGlobal(outArrBuf);
       }

Gdzie funkcja w C ma typ:
[C]
void makeFFT( float* inArr, float* outArr )

Kod, choć niezbyt piękny, działa i robi to o co od niego oczekiwałem: wywołuje zawartą w bibliotece funkcję makeFFT gdzie inArr jest parametrem wejściowym, zaś outArr - wyjściowym. Zasadnicze pytanie brzmi: czy da się to zrobić krócej, bardziej elegancko?

2 komentarze:

  1. Fajne, muszę zapamiętać, że to opisałeś. Kiedyś może się przydać ;-)

    Dla C# powinna być jakaś biblioteka do szybkiej transformaty fouriera (chyba, że to FFT od czegoś innego jest).

    OdpowiedzUsuń
  2. Są, ale nie znalazłem żadnej która:
    [1] byłaby wystarczająco sprawdzona
    [2] byłaby odpowiednio giętka
    [3] i przy okazji szybka
    [4] i miała licencję, która umożliwia korzystanie z niej w projektach komercyjnych.
    [5] była w C# :-)

    Punkty [1]-[4] spełnia biblioteka KISS FFT, która jest jednak napisana w C. Stąd potrzeba funkcji przejściowej.

    OdpowiedzUsuń