好像我现在每天都在问一个问题。我不确定这是好事还是坏事..。
今天的“味觉-WTF”涉及到我在使用来自NI测量工作室对象的函数时完全和完全的愚蠢。与我之前的大多数问题一样,这是关于一个实习项目的,在这个项目中,我的任务是将VB6项目转换为.Net框架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装箱到objects中,并将它们传递给函数。不过,它不太喜欢这样。如果我在没有ref的情况下传递新对象,它会坚持我需要用ref传递它们。如果我用ref传递它们,它会给出错误:
Cannot Convert ref double[] to ref object。
嗯..。看起来很眼熟。当我在两个变量的实例化中将double[]更改为Object时,我终于让编译器停止产生错误。但是..。当我运行这个函数时,我会得到一个Type Mismatch错误。
我真的不知道我从这里要去哪里。在互联网上,很少或根本没有关于用测量工作室为C#编程的信息。即使存在,我相信解决方案比我预期的要简单得多。历史告诉我,当我发现一个错误时,它几乎总是愚蠢的。
发布于 2010-07-09 18:44:16
我从来没有弄清楚这个函数到底出了什么问题,所以这个答案可能对某些人没有帮助。尽管如此,如果您像我一样在C#中使用度量衡工作室,那么显然有一个包含它的.NET类,并且看起来很有效。
NationalInstruments.Analysis.Dsp.Transforms.FFT (以及InverseFFT和其他一些人)。我还是很想知道另一个是怎么回事.
谢谢大家的建议。它们都是逻辑上的,可能应该起作用,但由于一些未知的原因(很可能与函数的内部工作有关)而没有起作用。
发布于 2010-07-08 19:07:50
在你的FFT函数中尝试一下:
object realData = new double[1000];
object imgData = new double[1000];
ReFFT(new object(), ref realData, ref imgData);
double[] realDataArray = (double[])realData;通过将对象实例化为一个新的double1000,您将确定尽管您将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-08 20:27:07
如果只是尝试发送一个对象,然后检查您返回的内容的类型如何?所以就像这样:
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都是作为新对象()的。
在这文章中,它说文档需要执行以下操作:
启动>>所有程序>>国家仪器>>测量室7.1 for VS .NET 2003 >>测量工作室文档 然后选择“测量工作室”下的过滤器拉下。 现在将帮助树导航到"NI Measurment Studio帮助>> NI测量工作室.NET类库>> Reference >> National Instruments.Analysis.SpectralMeasurements >>度量值类>>方法>> ReFFT??方法“。
https://stackoverflow.com/questions/3206673
复制相似问题