2015-11-16 2 views
0

У меня есть исполняемый файл vb.net, который вызывает dll C++/clr (который, в свою очередь, вызывает родную dll C++). Мне нужно передать массивы между всеми тремя. В vb.net я использую следующее:vb.net и длина массива C++/clr

Dim arrsize = 10 
Dim array(arrsize,arrsize) as Double 

я передать это с ++/CLR код

result = vbcalltocppcode(array) 

и в C++/код CLR (внутри public ref class, что я создать экземпляр в VB .net)

bool vbcalltocppcode(array<double,2>^ clrarray) 

Если я пытаюсь извлечь длину это с помощью

size_t cpparrsize = clrarray->GetLength(1); 

cpparrsize = 11. Почему это? Есть ли какие-то накладные расходы, которые я не вижу или что?

(причина этого заключается в том, что когда я пытаюсь заполнить это в нативном коде C++ массивами ранга 2 и 3, предполагая в собственном C++, что массив является одномерным, я теряю некоторые значения, то есть некоторые значения ставятся в clrarray [*, 11], который я не хочу.)

Конечно, я мог бы решить это, просто пропустив то, что я считаю 11-м индексом, но так как я не уверен, что это кажется немного опасным.

ответ

1

Вот как работает Basic, вы на самом деле выделили массив 11x11. Лучший способ подумать об этом: вы указываете последний действительный индекс в массиве.

Эта причуда была вызвана необходимостью поддерживать совместимость с предыдущими базовыми версиями в течение последних 40 лет. Путь назад, когда, массивы начали индексацию на 1 вместо 0. еще вокруг некоторой степени, модели COM объект, как Бюро может начать их массивы в 1.

Fix:

Dim arrsize = 9 
+0

Спасибо большое @Hans Passant! –

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