Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 21.07.2014
Сообщений: 21

Составить прототип функции: Как правильно передать динамический массив по ссылке

02.05.2015, 18:11. Показов 3027. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В dll библиотеке на экспорт имеется прототип следующей функции:

C++
1
extern "C" __declspec(dllexport) void process(double[], double(&)[], const int);
Вторым параметром идет ссылка на результирующий массив чисел double, т.е. в него будет записан результат выполнения функции.

Следующий способ вызова этой функции выдает ошибку:
C++
1
2
3
4
5
6
7
8
9
    HMODULE hDll;
    hDll = LoadLibrary(L"lib.dll");
 
    void(*process) (double[], double(&)[], const int);
    process = (void(*)(double[], double(&)[], const int))GetProcAddress(hDll, "process");
 
    double inputs[] = { 1.1149, 1.1143, 1.1141, 1.1166, 1.1168, 1.1154, 1.1175, 1.1172, 1.1185, 1.1216, 1.1237, 1.1237, 1.125, 1.1229, 1.1224, 1.1244 };
    double * outputs = new double[];
    process(inputs, outputs, 1);
Текст ошибки:
Bash
1
error C2664: 'void (double [],double (&)[],const int)' : cannot convert argument 2 from 'double *' to 'double (&)[]'
И вот никак не могу понять, как правильно передать динамический массив по ссылке. Есть доступ к исходникам библиотеки.
Векторами пользоваться рад бы, да не могу, т.к. стоит extern "C" (это важно и менять нельзя).
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.05.2015, 18:11
Ответы с готовыми решениями:

Как передать в функцию двухмерный динамический массив по ссылке?
как передать в функцию двухмерный динамический массив по ссылке?

Как правильно передать динамический массив в функцию, увеличивающую его размер, чтобы изменения сохранились
Извиняюсь за совсем нубский вопрос, похожее не нашел. Простая учебная задача - написать функцию, которая добавляет элемент в динамический...

Как передать динамический массив из функции в другую функцию
Здравствуйте.Не могу передать массив из функции в функцию сортировки. Подскажите как переделать программу : #include...

4
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
02.05.2015, 18:29
Цитата Сообщение от killbond Посмотреть сообщение
т.к. стоит extern "C"
Если он стоит, то ссылками ты тоже пользоваться не можешь.
Да еще и ссылками на массив неизвестной длины. Такое вообще не должно компилироваться.
Подозреваю, компилятор от VS такое разрешает, но этот код не по стандарту.

Библиотека твоя или сторонняя? Если твоя - переделывай ей интерфейс на нормальный. А то приколотил ты ее гвоздями к одному компилятору этим кодом. Если сторонняя, то стоит послать автору письмо счастья прототип попробуй использовать такой:
C++
1
2
void(*process) (double[], double *, const int);
process = (void(*)(double[], double *, const int))GetProcAddress(hDll, "process");
2
1 / 1 / 0
Регистрация: 21.07.2014
Сообщений: 21
02.05.2015, 19:31  [ТС]
Библиотеку делал я, письмо счастья мне
Проект интегрируется с другим приложением и совершенно точно в нем нет намека на привычные С++ классы вроде векторов, т.е. могу взаимодействовать только базовыми типами.

Почитал, поразбирался, вот здесь народ говорит, что вроде как нельзя передавать динамический массив по ссылке:
You cannot pass the arrays by reference without a size.
Т.е. "правильный" путь - это передавать вместе с массивом число элементов в нем? И, в принципе я могу в связующем приложении определить, из скольки элементов ожидается массив, тогда как все таки правильнее будет - возвращать ссылку на массив из dll функции или все же передавать в dll функцию массив, в котором хотелось бы получить результат и как это реализовать, если с extern "C" ссылками тоже пользоваться нельзя?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
02.05.2015, 19:53
Лучший ответ Сообщение было отмечено killbond как решение

Решение

killbond, Давай ты сперва расскажешь что делает твоя функция в dll (второй параметр).
Выделяет память для массива внутри себя или заполняет уже готовый переданный массив?

Добавлено через 9 минут
Цитата Сообщение от killbond Посмотреть сообщение
что вроде как нельзя передавать динамический массив по ссылке
Там говорят о том же, о чем и я. Ссылка на массив может быть только с указанием размера.
Есть два стандартных пути, как вернуть массив из С-функции.
Первый (память выделяется внутри функции и возвращается указатель на заполненный массив):
C++
1
double * process(double * in, size_t inSize, size_t * outSize);
В этом случае понадобится еще функция освобождения памяти
C++
1
void freeArray(double *);
С помощью нее будет освобождена память, которая была выделена в dll.
Второй (память выделяется на вызывающей стороне, возвращает функция количество реально записанных элементов массива):
C++
1
size_t process(double * in, size_t inSize, double * out, size_t outSize);
В этом случае программа должна заранее выделить каким-либо образом память и передать ее в твою функцию. Параметр размера - это максимальное количество памяти, которое функция имеет право записать.
Как узнать количество памяти, необходимое для выделения - зависит от задачи. Можно, например, сделать еще одну функцию, которая будет возвращать необходимый для работы размер, либо воспользоваться подходом, который использует функция MultiByteToWideChar, либо еще как.
1
1 / 1 / 0
Регистрация: 21.07.2014
Сообщений: 21
02.05.2015, 20:15  [ТС]
Пока показывать код смысле нет, т.к. не закончен, но там все просто - приходит массив с числами double, их обрабатывает нейросеть, а результатом будет массив с выходами нейросети. Известна размерность входов и выходов, т.е. я заранее могу сказать, что количество элементов во входном массиве будет кратным к числу входов, а в выходном - к числу выходов сети. В связующем приложении я могу передавать как массив известного размера, так и динамический, с выбором пока не определился. Первый путь сложнее, т.к. пугает возможными утечками памяти, второй выглядит более привлекательно, поэтому скорее всего сделаю так.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.05.2015, 20:15
Помогаю со студенческими работами здесь

Как правильно создать динамический массив из функции
Вот так ругается компилятор: int** i_matrix; f(i_matrix,N, M); ............................................. void f(int**...

Передать динамический массив как переменную в функции
Есть следующие данные TStringList *allData = new TStringList; void __fastcall sample(variable); Как можно передать...

Как правильно передать вектор по ссылке?
#include <iostream> #include <vector> using namespace std; //------------------------------------------------------------ void...

Как правильно передать объект класса по ссылке
Подскажите, хочу передать объект класса Image, im, компилятор пишет требуется ссылка на объект, как правильно передать этот объект?

Yii как правильно передать параметр по ссылке
Здравствуйте, при передаче строкового параметра н.п. - "people" по ссылки Yii ругается: "The system is unable to find the requested...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru