Я пишу код для 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