现在好像我现在每天都在问一个问题。我不确定这是好事还是坏事......
当使用NI Measurement Studio对象的功能时,今天的“WTF的风味”涉及到我完全彻底的无知。与我以前的大多数问题一样,这是关于实习项目,我在这个项目中负责将VB6项目转换为.Net Framework 2.0中的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装入object
s,并将它们传递给函数。然而,它并不太喜欢。如果我在没有ref
的情况下传递新对象,则表示我需要使用 ref
传递。如果我使用ref
传递它们,则会给出错误:
Cannot Convert ref double[] to ref object
。
double[]
更改为Object
时,我终于让编译器停止产生错误。但是......当我运行该函数时,我收到Type Mismatch
错误。
我真的不知道我从哪里开始。在互联网上有关于使用Measurement Studio进行C#编程的信息几乎没有。即使有,我确信解决方案比我预期的要简单得多。历史告诉我,当有一个我无法弄清楚的错误时,它几乎总是愚蠢的。
答案 0 :(得分: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]);
答案 1 :(得分: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都是新对象()的。
来自this帖子,它说文档要执行以下操作:
开始>>所有程序>> 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 ???方法
答案 2 :(得分:0)
你说DSP是COM,你得到的奇怪错误告诉我,底层问题是“编组”.NET和COM之间的参数。我不是这方面的专家,所以这更像是一个建议来研究如何将DSP封装在COM-interop层并通过该层调用它。
这是MSDN的一个很好的起点:Introduction to COM Interop
答案 3 :(得分:0)
我从未弄清楚这个功能有什么问题,所以这个答案可能对某些人没有帮助。然而,如果你像我一样在C#中使用Measurement Studio并且需要进行FFT,那么显然有一个包含它的.NET类,并且似乎可以工作。
NationalInstruments.Analysis.Dsp.Transforms.FFT(和InverseFFT以及其他一些人)。我仍然想知道与另一个人的交易是什么,但是......
感谢大家的建议。它们都是合乎逻辑的,可能应该有效,但不是出于某种未知原因(可能与函数的内部工作有关)。