Это можно сделать довольно легко: либо как предлагают Тим Кен или Том Баском, либо:
Выделите достаточно большую область памяти для хранения данных:
def var mp as memptr no-undo.
set-size(mp) = 1024. /* pre-calculated size depending on the data, in bytes */
/* copy contents of temp-table into mp */
run procedureInC (mp). /* run external procedure */
set-size(mp) = 0. /* free up the memory */
Необходимо заполнить три основные вещи:
- Решение о том, как данные должны быть структурированы в пределах области памяти, это включает в себя соглашение о том, как будут представлены типы данных 4GL (т. Е. Представление и длина строк, десятичные числа, даты и т. Д.) И хорошее понимание как лежит ваш конкретный компилятор C вне структур в памяти .
- Как только будет достигнуто соглашение по первому пункту, ребята из 4GL могут развернуть функцию, которая с помощью дескриптора временной таблицы вычислит требуемый размер области памяти на основе размера записи, рассчитанной с использованием точки 1 и количества записей.
- Следующие ребята из 4GL могут развернуть процедуру, копируя временную таблицу в область памяти, следуя правилам, согласованным в пункте 1 (см. PUT-BYTE, PUT-STRING и т. Д. В Руководстве по выполнению).
Есть еще одна вещь, которую нужно помнить, поскольку область памяти будет выделена средой выполнения Progress, а затем будет освобождена сразу после вызова вашей функции C, вам нужно будет скопировать содержимое, поскольку оно не будет больше доступно после вашего возвращения.
- Решение Тима является самым простым в реализации с точки зрения 4GL, но вам нужно будет проанализировать XML в C, и оно будет использовать значительно больше памяти, чем два других решения.
- Решение Тома - это компромисс. Данные отправляются в двоичном виде, однако это требует немного больше усилий и навыков на стороне 4GL. Вам нужно будет развернуть API, управлять состоянием, и данные будут передаваться в нескольких последовательных вызовах.
- Решение, которое я описал, - то, о чем вы просили. Это позволяет передавать данные с минимальными издержками за один раз. Однако это будет зависеть от конфигурации - имеет значение расположение структур, сгенерированных вашим компилятором Си.
Другая проблема состоит в том, что третье решение требует, чтобы кто-то на стороне 4GL понимал, как данные представлены на машинном уровне, чтобы вы могли вести содержательный разговор о различных строковых представлениях и кодировках, порядке байтов, заполнении, представлении десятичных чисел прогресса в C без потеря точности, представление даты и так далее. Очевидно, что с тех пор, как люди из 4GL попросили вас изучить решение, они могут не разбираться во всех этих темах, и поэтому вам лучше максимально упростить для них задачу и выполнить большую часть работы за них.
Другой способ - нанять подходящего консультанта на стороне 4GL, чтобы сделать и тщательно задокументировать этот кусок работы для вас.
Еще один способ - продолжать задавать меньшие вопросы здесь, в Stackoverflow, выполняя большую часть работы по исследованию и программированию самостоятельно - мы будем рады помочь. Удачи.