2

今、私はここでほぼ毎日質問をしているようです。それが良いことなのか悪いことなのかわかりません...

今日の「Flavor-Of-The-WTF」には、NIMeasurementStudioオブジェクトの関数を使用するときの私の完全で完全な無知が含まれています。これまでのほとんどの質問と同様に、これは、.Net Framework 2.0でVB6プロジェクトをC#に変換することを任されたインターンシッププロジェクトに関するものです。

元のVBコードは次のようになります。

Public Sub FFT(ZData() As Single, FFTData() As Single)
    Dim realdata As Variant
    Dim imgdata As Variant

    // (... Some unrelated other code in here ...)

    // Here we pass three variables to a NI CWDSP object's ReFFT function
    CWDSP1.ReFFT ZData, realdata, imgdata

    // (... More unrelated code ...)
End Sub

ある時点でMsgBoxにとどまり、realdataとimgdataがどのように解釈されているかを確認しました。どちらもですDouble()。元のプログラムでは、それが何をするかについては問題なく機能します。確かに、元のプログラムに関する私の親密な知識は、最近プロジェクトを取り上げたので平凡であり、プログラミングは数年しかありません(そして、機械工学は何年もありません。プログラマーは機械エンジニアであり、アプリケーション自体でした。機械出力用の測定ツール)。

コードをC#に引き継いで、次のように書き直してみました。

private void FFT(float[] ZData, float[] FFTData){
    double[] realData = new double[1000];
    double[] imgData = new double[1000];

    // (... Unrelated intermediate code ...)

    DSP.ReFFT(ZData, realData, imgData);

    // (... Unrelated intermediate code ...)
}

ご覧のとおり、基本的には元のVBと同じ方法で実行することから始めました。次のエラーが発生しました。Cannot Convert double[] to ref object

まあ、それは良くありません。だから私は試しました:DSP.ReFFT(ZData, ref realData, ref imgData);

戻るためだけに:Cannot Convert ref double[] to ref object

だから私は自分が明白だと思ったことをしました。realDataとimgDataをobjectsにボックス化し、それらを関数に渡しました。しかし、それはあまり好きではありません。を付けずに新しいオブジェクトを渡す場合はref、を付けて渡す必要があると主張します ref。で渡すとref、エラーが発生します。

Cannot Convert ref double[] to ref object

ええと...おなじみですね。2つの変数のインスタンス化に変更double[]すると、最終的にコンパイラーにエラーの生成を停止させます。Objectしかし...関数を実行すると、Type Mismatchエラーが発生します。

ここからどこへ行くのか本当にわからない。インターネット上にあるMeasurementStudioを使用したC#のプログラミングに関する情報はほとんどまたはまったくありません。あったとしても、私が思っているよりもはるかに簡単な解決策だと思います。歴史は、私が理解できないバグがあるとき、それはほとんど常に愚かなことであると私に教えてくれました。

4

4 に答える 4

3

これをFFT関数で試してみてください。

object realData = new double[1000];
object imgData = new double[1000];
ReFFT(new object(), ref realData, ref imgData);

double[] realDataArray = (double[])realData;

オブジェクトを新しいdouble[1000]としてインスタンス化することにより、realDataをオブジェクトとして扱っているにもかかわらず、その基になるタイプがdouble[]であることを確立しています。後で、メソッド呼び出しの後、新しい配列を作成し、前の配列を元の型にキャストして、realData配列を閉じます。厳密に必要とされるよりも多くのボクシング/アンボクシングである可能性がありますが、うまくいけば、それは全体にポイントをもたらします

2を試してください:

double[] somerealData = new double[1000];
double[] someimgData = new double[1000];
object realData, imgData;
realData = somerealData;
imgData = someimgData;

ReFFT(new object(), ref realData, ref imgData);

double[] realDataArray = (double[])realData;
Console.WriteLine(realDataArray.Length);
realDataArray[0] = 1.0d;
Console.WriteLine(realDataArray[0]);

.NET 2.0コンソールアプリで2番目のアプローチを試したので、それが機能すると確信しています。そうでない場合は、一歩下がって状況を再評価する必要があります。

試してみてください3:ReFFTメソッドの最初のパラメーターがfloat[]であることに気づきました。これを試してみましょう:

double[] somerealData = new double[1000];
double[] someimgData = new double[1000];
//float[] zData placeholder since array comes from input param

object realData, imgData, zObj;
realData = somerealData;
imgData = someimgData;
zObj = zData;

ReFFT(zObj, ref realData, ref imgData);

double[] realDataArray = (double[])realData;
Console.WriteLine(realDataArray.Length);
realDataArray[0] = 1.0d;
Console.WriteLine(realDataArray[0]);
于 2010-07-08T19:07:50.817 に答える
0

あなたはDSPがCOMであると言います、そしてあなたが得ている奇妙なエラーは私に根本的な問題が.NETとCOMの間のパラメータを「マーシャリング」していることを示唆しています。私はこれに関する専門家ではないので、これは、DSPをCOM相互運用層にカプセル化し、その層を介して呼び出す方法を調査するための提案に沿ったものです。

これがMSDNの良い出発点です:COM相互運用機能の概要

于 2010-07-08T21:13:01.013 に答える
0

オブジェクトを送信してから、返されるもののタイプを確認してみてはどうでしょうか。だからこのようなもの:

    private void FFT(float[] ZData, float[] FFTData)
    {
        object realData = new object();
        object imgData = new object();
    
        // (... Unrelated intermediate code ...)
    
        DSP.ReFFT(ZData, ref realData, ref imgData);
        
        // Find out what the type actual is (this will probably only work
        // if the values are assigned with the new data type)
        // but worth a shot:
        type t1 = typeof(realData);
        type t2 = typeof(imgData);
    
        // if t1 and t2 show the actual types, replace the
        // type above (new object() with the type here)
    
        // (... Unrelated intermediate code ...)
    }

更新:上記の最後のコメントを見たところです。おそらく、3つの別々のオブジェクトを作成することをお勧めします。Test1、Test2、およびTest3はすべて新しいobject()として使用されます。

この投稿から、ドキュメントは次のことを行うようになっています。

スタート>>すべてのプログラム>>NationalInstruments >> Measurement Studio 7.1 for VS .NET 2003 >> Measurement Studio Documentation

次に、[フィルター]プルダウンの下にある[測定スタジオ]を選択します。

次に、ヘルプツリーを「NIMeasurmentStudioヘルプ>>NIMeasurementStudio.NETクラスライブラリ>>リファレンス>>NationalInstruments.Analysis.SpectralMeasurements>>測定クラス>>メソッド>>ReFFT???メソッドに移動します。

于 2010-07-08T20:27:07.147 に答える
0

関数のどこが悪いのかわからなかったので、この答えは役に立たない人もいるかもしれません。それでも、私のようにC#でMeasurement Studioを使用していて、FFTを実行する必要がある場合は、それを含む.NETクラスがあり、機能しているように見えます。

NationalInstruments.Analysis.Dsp.Transforms.FFT(およびInverseFFTとその他の多数)。私はまだ他のものとの取引が何であったか知りたいですが...

皆さんの提案に感謝します。それらはすべて、おそらく機能するはずの論理的なものでしたが、何らかの理由で機能しませんでした(関数の内部動作に関連している可能性があります)。

于 2010-07-09T18:44:16.443 に答える