Невозможно преобразовать ref double [] в объект ref - PullRequest
2 голосов
/ 08 июля 2010

Кажется, я здесь задаю вопрос почти каждый день. Я не уверен, хорошо это или плохо ...

Сегодняшний «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() с. Это прекрасно работает для оригинальной программы. По общему признанию, мои глубокие познания в оригинальной программе являются лишь посредственными, так как я недавно начал проект, и у меня за плечами всего несколько лет программирования (и никаких лет машиностроения. Программист был инженером-механиком, само приложение) измерительный инструмент для выхода машины).

Перенеся код на 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, он настаивает на том, чтобы мне нужно было передать их с ref. Если я передаю их с ref, это дает мне ошибку:

Cannot Convert ref double[] to ref object.

Да ... это выглядит знакомо. Наконец, я получаю, чтобы компилятор прекратил выдавать ошибки, когда я изменяю double[] на Object при создании двух переменных. Но ... когда я запускаю функцию, я получаю ошибку Type Mismatch.

Я действительно понятия не имею, куда я иду отсюда. В Интернете практически нет информации о программировании для C # с Measurement Studio. Даже если бы и было, я уверен, что решение намного проще, чем я ожидаю. История научила меня, что когда есть ошибка, которую я не могу понять, это почти всегда что-то глупое.

Ответы [ 4 ]

3 голосов
/ 08 июля 2010

Сделайте это в вашей функции 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]);
0 голосов
/ 09 июля 2010

Я так и не выяснил, что не так с функцией, поэтому этот ответ может не помочь некоторым людям.Тем не менее, если вы используете Measurement Studio в C #, как я, и вам нужно сделать БПФ, очевидно, был класс .NET, который включает его и, кажется, работает.

NationalInstruments.Analysis.Dsp.Transforms.FFT (и InverseFFT и куча других).Я все еще хотел бы знать, какова была сделка с другим, хотя ...

Спасибо всем за ваши предложения.Все они были логичными, которые, вероятно, должны были работать, но не по какой-то неизвестной причине (вероятно, связанной с внутренней работой функции).

0 голосов
/ 09 июля 2010

Вы говорите, что DSP - это COM, и странные ошибки, которые вы получаете, наводят меня на мысль, что основная проблема заключается в «распределении» параметров между .NET и COM. Я не эксперт в этом, так что это больше похоже на предложение исследовать, как можно инкапсулировать DSP на уровне COM-взаимодействия и вызывать его через этот уровень.

Вот хорошая отправная точка для MSDN: Введение в COM Interop

0 голосов
/ 09 июля 2010

Как насчет того, чтобы просто попытаться отправить объект, а затем проверить тип того, что вы получите обратно.Так что-то вроде этого:

    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 все как новые object ().

Начиная с этой записи, в документации указывается следующее:

Start>> Все программы >> National Instruments >> Measurement Studio 7.1 для VS .NET 2003 >> Документация Measurement Studio

Затем выберите «Measurement Studio» в раскрывающемся меню «Фильтр».

Теперь перейдите к справкеСправка NI Measurement Studio >> Библиотека классов NI Measurement Studio .NET >> Справка >> National Instruments.Analysis.SpectralMeasurements >> Класс измерений >> Методы >> Метод ReFFT ???.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...