Невозможно преобразовать ref double[] в объект ref
Похоже, я здесь задаю вопрос почти каждый день. Я не уверен, хорошо это или плохо...
Сегодняшний "Flavor-Of-The-WTF" подразумевает мою полную и полную невежественность при использовании функции из объекта NI Measurement Studio. Как и в большинстве моих предыдущих вопросов, это касается проекта стажировки, где мне было поручено перевести проект VB6 на C# в.Net Framework 2.0.
Исходный код 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
и передал их функции. Это не слишком любит это, однако. Если я передам новые объекты без ref
настаивает на том, что мне нужно передать их с ref
, Если я передам их с ref
, это дает мне ошибку:
Cannot Convert ref double[] to ref object
,
Ха... это выглядит знакомо. Я, наконец, заставляю компилятор перестать выдавать ошибки при изменении double[]
в Object
в реализации двух переменных. Но... когда я запускаю функцию, я получаю Type Mismatch
ошибка.
Я действительно понятия не имею, куда я иду отсюда. В Интернете практически нет информации о программировании для C# с Measurement Studio. Даже если бы и было, я уверен, что решение намного проще, чем я ожидаю. История научила меня, что когда есть ошибка, которую я не могу понять, это почти всегда что-то глупое.
4 ответа
Я никогда не выяснял, что не так с функцией, поэтому этот ответ может не помочь некоторым людям. Тем не менее, если вы используете Measurement Studio в C#, как я, и вам нужно сделать FFT, очевидно, был класс.NET, который включает его и, похоже, работает.
NationalInstruments.Analysis.Dsp.Transforms.FFT (и InverseFFT и куча других). Я все еще хотел бы знать, какова была сделка с другим, хотя...
Спасибо всем за ваши предложения. Все они были логичными, которые, вероятно, должны были работать, но не по какой-то неизвестной причине (вероятно, связанной с внутренней работой функции).
Попробуйте это в вашей функции 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]);
Вы говорите, что DSP - это COM, и странные ошибки, которые вы получаете, наводят меня на мысль, что основная проблема заключается в "распределении" параметров между.NET и COM. Я не эксперт в этом, так что это больше похоже на предложение исследовать, как можно инкапсулировать DSP на уровне COM-взаимодействия и вызывать его через этот уровень.
Вот хорошая отправная точка на MSDN: Введение в COM Interop
Как насчет того, чтобы просто попытаться отправить объект, а затем проверить тип того, что вы получите обратно. Так что-то вроде этого:
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 все как новый объект ().
Из этого поста в документации сказано сделать следующее:
Пуск >> Все программы >> National Instruments >> Measurement Studio 7.1 для VS .NET 2003 >> Документация Measurement Studio
Затем выберите "Студия измерений" в раскрывающемся списке "Фильтр".
Теперь перейдите по дереву справки к "Справке NI Measurement Studio" >> Библиотека классов NI Measurement Studio .NET >> Справка >> National Instruments.Analysis.SpectralMeasurements >> Класс измерений >> Методы >> Метод ReFFT???.