2010-07-08 3 views
2

Кажется, что я здесь задаю вопрос примерно каждый день. Я не уверен, что это хорошо или плохо ...Невозможно преобразовать ref double [] для возврата объекта

Сегодняшний «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.

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

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

+0

Является ли DSP-класс .NET? – Robaticus

+0

Нет, .COM. Извините за не указание. – KChaloux

+0

В коде VB6 какие типы 'realdata' и' imgdata' фактически хранятся? Что такое подпись метода класса DSP? –

ответ

0

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

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

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

3

Дайте это идти в функции FFT:

object realData = new double[1000]; 
object imgData = new double[1000]; 
ReFFT(new object(), ref realData, ref imgData); 

double[] realDataArray = (double[])realData; 

от экземпляра объекта, как новый двойной [1000], вы устанавливаете, что, хотя вы лечите realData как объект, его основной тип двойной []. Позже, после вызова метода, вы закрываете массив 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, так что я Я уверен, что он работает. Если этого не произойдет, нам нужно сделать шаг назад и переоценить ситуацию.

Try 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

Мне нравится идея, но это я уже пробовал (и попробовал еще раз просто сейчас, чтобы быть уверенным). Я все еще получаю ошибку несоответствия типа, которая меня преследует. Я заметил, что когда я помещаю точку останова в программу, он говорит мне, что «realData» и «imgData» имеют типы 'object {double []}' в отличие от чистого 'object'. Может быть, это имеет к этому какое-то отношение. – KChaloux

+0

Хммм. Я пробовал код в своем ответе в LINQPad, и он работал нормально. Обновление ответа с использованием другого подхода –

+0

Обратите внимание, что функция FFT поступает из внешнего источника: National Instruments Measurement Studio. Компания использует его практически для всех, и это дало мне много хлопот, работая по-разному от VB до C# практически без документации. Я не знаю, может ли это вызвать мою проблему ... – KChaloux

0

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

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 все как новый объект().

От this поста, говорится в документации, чтобы сделать следующее:

Start >> All Programs >> National Instruments >> Measurement Studio 7.1 for VS .NET 2003 >> Measurement Studio Documentation

Then select "Measurement Studio" under the Filter pull down.

Now navigate the help tree to "NI Measurment Studio Help >> NI Measurement Studio .NET Class Library >> Reference >> National Instruments.Analysis.SpectralMeasurements >> Measurements Class >> Methods >> ReFFT??? Method.

+0

Это странная вещь, которая заставляет меня поверить, что что-то ужасно неправильно с самой функцией , Даже если я отправляю все объекты, он сообщает о ошибке несоответствия типа. – KChaloux

+0

Нет такой удачи в отношении создания 3 отдельных объектов. К сожалению, я не знаю, что с ними делать, поэтому, если ошибка внутри функции, это может быть что угодно. – KChaloux

+0

Хм, да, вы пытались использовать ключевое слово 'out' вместо 'ref', для double []? – SwDevMan81

0

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

Вот хорошая отправная точка на MSDN: Introduction to COM Interop

 Смежные вопросы

  • Нет связанных вопросов^_^