c# - 无法将 ref double[] 转换为 ref 对象

标签 c# object reference measurement-studio

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

今天的“WTF 风格”涉及我在使用 NIMeasurement Studio 对象中的函数时完全无知的情况。与我之前的大多数问题一样,这是一个实习项目,我的任务是将 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() 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 装箱到 object 中s,并将它们传递给函数。然而,它不太喜欢这样。如果我传递没有 ref 的新对象,它坚持要求我需要通过它们 with ref 。如果我用 ref 通过它们,它给了我错误:

Cannot Convert ref double[] to ref object

呃……看起来很眼熟。当我更改 double[] 时,我终于让编译器停止产生错误至Object在两个变量的实例化中。但是...当我运行该函数时,我得到 Type Mismatch错误。

我真的不知道我该去哪里。互联网上几乎没有关于使用Measurement Studio 进行C# 编程的信息。即使有,我也确信解决方案比我预期的要简单得多。历史告诉我,当出现我无法弄清楚的错误时,它几乎总是愚蠢的。

最佳答案

在您的 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]);

关于c# - 无法将 ref double[] 转换为 ref 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3206673/

相关文章:

javascript - Javascript 中对象如何引用自身?

c# - 仅在特定 GridViewColumn 中右键单击时显示上下文菜单

c# - 在 C# 中实现三角反函数

javascript - JS 函数不更新对象

c# - Xamarin 不兼容的目标框架错误 - NuGet 可以帮助我吗?

c++ - 从临时对象返回左值引用

c# - System.Object 是基类

c# - Serilog 无法登录我的本地数据库

javascript - 如何分隔数组值

java - 创建并连接游戏的位置