2013-12-10 3 views
1

Мне было интересно, можно ли передать часть многомерного массива в C++. Например скажем, у меня есть массив из трех размеров (размер X * Y * Z):Передача части многомерного массива

int array[X][Y][Z]; 

И сказать, у меня также есть функция, которая принимает два одномерных массивов (размер Y * Z), как один из его параметров :

void function(int stuff[Y][Z]); 

Можно ли назвать функцию следующим образом?

function(array[x_var]); 

Как и как передать x_var кусочек трехмерного массива только и, следовательно, проходящей через два двумерный массив [у] [г] в силу ..

Или я должен использовать два новых размерный массив, скопируйте фрагмент в это, затем передайте это в функцию?

+0

Рассмотрите возможность использования достойной библиотеки линейной алгебры: посмотрите BLAS на сайте www.boost.org. Затем вы можете просто передать объект. – Bathsheba

+1

Почему бы просто не попробовать и не посмотреть, что происходит? –

+0

Массивы распадаются на указатели, поэтому в обоих случаях вы передаете указатель, не знаете, что вы пытаетесь сохранить/сделать здесь. – Andreas

ответ

1

Вы можете! Только изменение порядка размеров требует переупорядочения, например. если у вас есть 2-мерные массивы и функция, которая должна брать либо строку , либо столбец.

1

Я бы предложил взглянуть на Boost Multidimensional Array Library, так как это значительно облегчает обработку разреза (которые называются «Views» в этой библиотеке). Если вы создаете свои собственные многомерные массивы с синтаксисом стиля C int array[X][Y][Z], вы можете передать только срез в одном измерении. Например, если вы хотите передать строку, а не столбец, вы не можете легко сделать это с помощью синтаксиса стиля C.

Если вы используете библиотеку типа boost::multi_array, то вы, вероятно, обнаружите, что большая часть вашего кода будет работать без изменений (поскольку вы также можете обращаться к элементам как array[x][y][z]), основное изменение будет заключаться в определении массива как правильного размера когда вы его построите. Кстати, вы также можете изменить его более легко, чем в случае с C-стилем (где размеры должны быть фиксированы во время компиляции).

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