gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:45:07 29 4
gpt4 key购买 nike

看来我现在几乎每天都在这里问问题。我不确定这是好事还是坏事...

今天的“WTF flavor ”涉及我在使用来自 NI Measurement 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()。它在原始程序中的作用就很好。诚然,我对原始程序的深入了解只是平庸,因为我最近才接手这个项目,并且只有几年的编程经验(没有多年的机械工程经验。程序员是机械工程师,应用程序本身机器输出的测量工具)。

将代码移交给 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);

仅返回:无法将 ref double[] 转换为 ref 对象

所以我做了我认为显而易见的事情。我将 realData 和 imgData 装箱到 object 中,并将它们传递给函数。然而,它不太喜欢那个。如果我在不使用 ref 的情况下传递新对象,它坚持认为我需要通过 with ref 传递它们。如果我用 ref 传递它们,它会给我错误:

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

嗯……这看起来很眼熟。当我在两个变量的实例化中将 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com