Невозможно преобразовать 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???.

Другие вопросы по тегам