ключевое слово ref с интерфейсом кода C++/CLI

Я пишу код для Windows Phone 8 и пытаюсь изучить все тонкости преодоления барьера кода C#/C++.

Допустим, у меня есть два массива float[] на стороне C#, мы назовем их data1 и data2. Я хочу выполнить поэлементное добавление к ним. Поскольку это в системе реального времени (обработка звука), я не хочу рисковать выделением и освобождением памяти внутри моих процедур обработки звука, поэтому мне нужно что-то вроде data1[i] += data2[i]. Поскольку я явно изучаю, как вызывать C++ из C#, я не буду просто писать цикл for на C#, я напишу его на C++, например так:

void LibFilter::mixIn( Platform::Array<float>^ * data1, const Platform::Array<float>^ data2 ) {
    auto outArray = (*data1);

    // Don't do anything if we don't have matching lengths
    if( data2->Length != outArray->Length )
        return;

    // Sum data2 into outArray (which is just a dereferenced data1)
    for( unsigned int i=0; i<outArray->Length; ++i ) {
        outArray[i] += data2[i];
    }
}

Мне кажется, это должно сработать, но опять же, я программист на C++, а не на C#, и, по-видимому, это следует использовать с ключевым словом out в C#, что означает, что data1 является нулевым указателем, независимо от того, переданное значение. Думаю, вместо этого я хочу использовать ключевое слово ref, но не могу понять, как это сделать с помощью Windows Phone 8 SDK.

Предложения о том, как использовать здесь ключевое слово ref или как лучше всего это спроектировать, будут высоко оценены, поскольку я все еще изучаю передовой опыт работы с C#. Спасибо вам всем!

EDIT: информация об ошибке

Если я просто попытаюсь использовать libfilter.mixIn( ref data1, data2 ); из своего кода C#, я получу следующее:

error CS1502: The best overloaded method match for 'libfilter.LibFilter.mixIn(out float[], float[])' has some invalid arguments
error CS1620: Argument 1 must be passed with the 'out' keyword

person staticfloat    schedule 03.01.2013    source источник
comment
Что вы не можете понять об использовании ключевого слова ref? Вы пробовали и не получилось? Какая у вас ошибка?   -  person user1610015    schedule 04.01.2013
comment
Я обновил вопрос с дополнительной информацией   -  person staticfloat    schedule 04.01.2013


Ответы (1)


На основании вашего редактирования кажется, что метаданные, которые компилятор C++/CX генерирует для метода, используют ключевое слово out, а не ключевое слово ref.

Во всяком случае, я не понимаю, почему вам вообще нужно проходить по ссылке. Platform::Array является изменяемым, поэтому вы можете просто изменить его, даже если он передается по значению. В следующей статье MSDN есть пример, аналогичный вашему коду (см. раздел «Заполнение массивов»):

http://msdn.microsoft.com/en-us/library/windows/apps/hh700131.aspx

person user1610015    schedule 04.01.2013
comment
Platform::Array не изменяемы, потому что они должны передаваться как const Array, Array * или WriteOnlyArray. В первом и третьем случаях я не могу модифицировать элементы, во втором случае массив не инициализируется. Вот почему я искал эквивалент ключевого слова ref, поскольку WinRT поддерживает только in и out. - person staticfloat; 06.01.2013
comment
Ну, образец MSDN использует WriteOnlyArray, чтобы делать то, что вы хотите. - person user1610015; 06.01.2013
comment
Нет, это не так. В примере значение arr только присваивается, но никогда не считывается. Я хочу использовать +=, а не только = - person staticfloat; 06.01.2013