Общение с программой на CИ

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Ответить
mirk
постоялец
Сообщения: 319
Зарегистрирован: 24.09.2007 10:03:39

Общение с программой на CИ

Сообщение mirk »

Хочу написать модуль для программы на СИ.
На вход она ждет std::map и выдает его же.
Как мне описать это в моей программе?
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Как вы себе представляете std::map на входе?
mirk
постоялец
Сообщения: 319
Зарегистрирован: 24.09.2007 10:03:39

Сообщение mirk »

Никак, поэтому и спрашиваю :)
Вероятно там структура динамическая или вроде того.
Модули на СИ обмениваются без проблем между собой.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

если под входом предполагается стандартный поток ввода, то там std::map быть не может.
если "вход" это процедура с входным параметром типа std::map - тоже облом, на паскале его не сформировать.
Нужна "прокладка" на си, которая примет на "вход" (имею ввиду процедуру с параметрами) какуюта общую си-паскаль структуру данных, сбацает из нее std::map и отправит куда надо
mirk
постоялец
Сообщения: 319
Зарегистрирован: 24.09.2007 10:03:39

Сообщение mirk »

zub писал(а):если "вход" это процедура с входным параметром типа std::map

Именно так.

zub писал(а):облом, на паскале его не сформировать.

:cry:

Я еще могу попробовать повлиять на типы входных параметров.
Мне надо передавать (и принимать) ассоциативный динамический массив. Как лучше сделать это универсально и без просадки по скорости?
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Еще вариант сделать "прокладку" на си для работы с этим мапом = преобразовать вызовы методов сишного класса в вызов обычных сишных процедур - они совместимы. По принципу как qt4pas работает, си обертка над с++, паскаль с ней работает
Azazaz
новенький
Сообщения: 41
Зарегистрирован: 21.04.2015 19:00:03

Сообщение Azazaz »

Вычленить из аналов C структуру данных из под map, написать С функцию которая возвращает указатель на эти данные. передать в паскаль функцию указатель. Но подобные метод может быть совершенно не эффективен ввиду того что C++ генерирует в реализации методов всякую дрянь ака инкапсуляция, что крайне затрудняет обнаружение и изменение полей объектов, а также подобные фортели могут сломать объект и привести к внезапному вылету, если не обновить все нужные поля объекта(к примеру попытке прочитать не выделенную или освобожденную память).
Заниматься таким извратом я конечно же не советую, но нормальные люди в аналогичных ситуациях используют структуры/массивы(данные из map) и указатели на них, например вызовы WinApi можно делать из любого языка, нужно только знать структуры выводных данных.
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

Внутреннее устройство std::map может варироваться в зависимости от используемой реализации STL, аллокатора, компилятора и опций компиляции, поэтому даже на самом С++ передавать структуру из одного бинарника в другой можно только на свой страх и риск.

Наиболее безопасное решение — как предлагает zub, внутри модуля предоставить API для работы с std:map, т.е. функции вида std_map_create: TMap, std_map_free(Map: TMap), std_map_insert(Map: TMap; const Key: TKey; const Value: TValue), std_map_find(Map: TMap; const Key: TKey): TIterator, std_map_end(Map: TMap): TIterator и т.д., где TMap = Pointer, TIterator = Pointer, и работать с std::map через них.
Аватара пользователя
AlexVinS
новенький
Сообщения: 95
Зарегистрирован: 27.01.2009 00:18:01

Сообщение AlexVinS »

Начнём с того, что std::map - это шаблон, и весьма не тривиальный. От того чем он специализирован тоже многое зависит если так уж хочется передавать его содержимое pascal<->c++
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

проще написать "оберку"^
Паскаль - > dll/so -> std::map
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

olegy123 писал(а):проще написать "оберку"^
Паскаль - > dll/so -> std::map

Интерфейс (в смысле COM ;-) )?
Ответить