C ++ - Как взять большой массив в качестве входных данных для функции - PullRequest
2 голосов
/ 27 февраля 2020

У меня есть функция, которая принимает на вход пару больших многомерных массивов с плавающей точкой. В результате я создаю sh стек.

Я новичок в C / C ++, поэтому заранее извинюсь, если этот вопрос глуп. В любом случае, посмотрев вокруг net, эта проблема не является чем-то новым, и общим решением является либо сделать ее глобальной переменной, либо использовать вектор (вместо массива).

Однако этот фрагмент кода C ++ предназначался для использования в качестве разделяемой библиотеки и принимает входные данные из скрипта Python и возвращает (или изменяет) значение (также в массивах). Поэтому я не думаю, что было бы возможно объявить глобальным (поправьте меня, если я ошибаюсь).

Так, кроме использования вектора, есть ли другой способ сделать это? Причина, по которой я отказался от использования вектора C ++, заключается в том, что в Python нет эквивалентного типа данных. Я использую ctypes для связи между Python и C ++, если это имеет значение.

1 Ответ

1 голос
/ 27 февраля 2020

В C / C ++ нет способа передать массив как аргумент функции по значению. Вы можете передать указатель на массив и размер массива. В C ++ вы также можете передать ссылку на массив и размер массива (в параметрах шаблона). В любом случае массив не копируется, и вызываемая функция обращается к массиву на месте, где его выделил вызывающий объект.

Обратите внимание, что массив может быть заключен в структуру, и в этом случае его можно передать по значению. В C ++ std::array является примером такого. Но вызывающая сторона должна инициализировать эту структуру вместо необработанного массива. std::vector похоже на то, что это структура, которая автоматически копирует элементы при копировании вектора, но в отличие от C массивов и std::array она динамически распределяет память для элементов.

Однако, если вы При интеграции с C API вы, скорее всего, ограничены указателем + размер или указатель + размер, заключенным в C структурные решения. Правила работы с массивом (например, кто выделяет и освобождает массив, это запись в разрешенный массив и т. Д. c.) Указывают c для конкретного API, с которым вы работаете. Зачастую существует специальный набор функций для работы с массивами, предоставляемыми библиотекой. Вам следует прочитать документацию API о соглашениях, принятых в Python.

...