2012-02-08 11 views
4

タイトルとして、Tamas SzalayのC# port of FFTWをVisual C#2010 Professional(試用版) 、私は2次元の変換を使用しようとすると、上記のエラーが発生しています。 (私がdft_c2r_2d()に切り替えると問題は解決しません)。他の関数(特に、fftw.malloc())はうまく動作します。FFTWLib(C#)の使用:vshostが実行されていない場合、fshw.exeまたはメインプログラムがクラッシュする

詳細:

unsafe void FFTFind(IntPtr Scan0, int stride, int width, int height, Rectangle roi) 
{ 
    IntPtr ComplexImage = fftw.malloc(width * height * 16); 
    double[] pComplexImage = new double[width * height * 2]; 
    byte* pScan0 = (byte*)Scan0.ToPointer(); 

    Console.WriteLine("3"); 

    for (int y = 0; y < height; y++) 
    { 
     for (int x = 0; x < width; x++) 
     { 
      pComplexImage[x * y * 2] = pScan0[y * stride + x * 4]; 
      //pComplexImage[x * y * 2] = pScan0[y * stride + x]; 
     } 
    } 

    Console.WriteLine("3.05"); 

    Marshal.Copy(pComplexImage, 0, ComplexImage, width * height * 2); 

    Console.WriteLine("Starting FFTFind"); 

    FFTFindKernel(ComplexImage, stride, width, height, roi); 
} 

unsafe void FFTFindKernel(IntPtr imageIn, int stride, int width, int height, Rectangle roi) 
{ 
    Console.WriteLine("3.1"); 
    IntPtr hScan0 = (IntPtr) GCHandle.Alloc(imageIn, GCHandleType.Pinned); 
    Console.WriteLine("3.3"); 
    IntPtr FourierPlan; 

    Console.WriteLine("3.5"); 
    int start = System.Environment.TickCount; 
    Console.WriteLine("3.7"); 
    FourierPlan = fftw.dft_r2c_2d(width, height, hScan0, hScan0, 0); 
    Console.WriteLine("4"); 
    fftw.execute(FourierPlan); 
    Console.WriteLine("Time: {0} ms", (System.Environment.TickCount - start)); 
} 

"3.7" までのコンソール印刷されます。 FourierPlan = ...を実行しようとすると、プログラムがクラッシュする原因となり、メッセージボックスがポップアップする:

vshost.exe has stopped working. 

Visual Studioのホストプロセスを無効にするだけ「FFTFind」と「vshost.exe」を置き換えます。

おそらく関連があります:x64環境(Windows Server標準)で実行していますが、dllとプログラムはx86です。このpreviously caused a problem in Visual C# 2010 Expressは、Professional Trialに切り替えて、「x86」から「Any CPU」に手動で構成ターゲットを変更することで解決されました。

更新:提供されたテストコードを実行すると正常に動作します。

+0

ネイティブメソッドのpinvokeかネイティブコードのバグを発見したようです。投稿していないので、どうすれば助けますか? –

+0

私はどちらも書きませんでした。コードはTamas SzaleyのC#ポートの記事にリンクされています。あなたがそれが適切だと思うなら、私はそれについての電子メールを送ってきますが、これは時間の影響を受けやすいものなので、私は援助に感謝します。 – linkhyrule5

+0

(オハイオ州とSzaleyは彼のソースを公開しており、使用法には制限がないので、それを遠く離れて欲しいなら、そのオプションがあります。私は、あなたが私に指示を与えるならば、私は盲目的に指示に従うことができます。) – linkhyrule5

答えて

0

プラン関数は、「ダミー」ポインタを取ることはできません。ポインタが指す配列を初期化する必要があります。振り返ってみると、これは明白であったはずです...

関連する問題