2

好像我现在几乎每天都在这里问一个问题。我不确定这是好事还是坏事……

今天的“Flavor-Of-The-WTF”涉及我在使用 NI Measurement Studio 对象中的函数时完全无知。与我之前的大多数问题一样,这是关于一个实习项目,我的任务是在 .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()s。它在原始程序中工作得很好。诚然,我对原始程序的了解只是平庸,因为我最近拿起了这个项目,并且只有几年的编程经验(没有多年的机械工程。程序员是机械工程师,应用程序本身机器输出量的测量工具)。

将代码转移到 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.

咦……似曾相识。当我更改double[]Object两个变量的实例化时,我终于让编译器停止产生错误。但是......当我运行该函数时,我得到一个Type Mismatch错误。

我真的不知道我从这里去哪里。互联网上几乎没有关于使用 Measurement Studio 进行 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 控制台应用程序中尝试了第二种方法,所以我很确定它可以工作。如果没有,那么我们需要退后一步,重新评估情况。

尝试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

我从来没有弄清楚这个功能出了什么问题,所以这个答案可能对某些人没有帮助。不过,如果您像我一样在 C# 中使用 Measurement Studio 并且需要进行 FFT,那么显然有一个 .NET 类包含它,并且似乎可以工作。

NationalInstruments.Analysis.Dsp.Transforms.FFT(以及 InverseFFT 和其他一些)。我仍然很想知道与另一个人的交易是什么,虽然......

谢谢大家的建议。它们都是合乎逻辑的,可能应该起作用,但由于某种未知的原因(可能与函数的内部工作有关)没有起作用。

于 2010-07-09T18:44:16.443 回答
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 ...)
    }

更新:刚刚看到你上面的最后一条评论。您可能想要创建三个单独的对象。Test1、Test2 和 Test3 都作为 new object() 的。

这篇文章中,它说文档要执行以下操作:

开始 >> 所有程序 >> National Instruments >> Measurement Studio 7.1 for VS .NET 2003 >> Measurement Studio 文档

然后选择 Filter 下拉菜单下的“Measurement Studio”。

现在将帮助树导航到“NI Measurment Studio 帮助 >> NI Measurement Studio .NET 类库 >> 参考 >> National Instruments.Analysis.SpectralMeasurements >> 测量类 >> 方法 >> ReFFT??? 方法。

于 2010-07-08T20:27:07.147 回答
0

您说 DSP 是 COM,而您遇到的奇怪错误向我表明,根本问题是“编组”.NET 和 COM 之间的参数。我不是这方面的专家,所以这更像是研究如何将 DSP 封装在 COM 互操作层中并通过该层调用它的建议。

这是 MSDN 上的一个很好的起点:COM Interop 简介

于 2010-07-08T21:13:01.013 回答