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

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

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

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

Сообщение mirk » 17.05.2017 09:59:14

Хочу написать модуль для программы на СИ.
На вход она ждет std::map и выдает его же.
Как мне описать это в моей программе?
mirk
постоялец
 
Сообщения: 317
Зарегистрирован: 24.09.2007 10:03:39

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

Сообщение zub » 17.05.2017 10:07:30

Как вы себе представляете std::map на входе?
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение mirk » 17.05.2017 10:32:31

Никак, поэтому и спрашиваю :)
Вероятно там структура динамическая или вроде того.
Модули на СИ обмениваются без проблем между собой.
mirk
постоялец
 
Сообщения: 317
Зарегистрирован: 24.09.2007 10:03:39

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

Сообщение zub » 17.05.2017 10:39:53

если под входом предполагается стандартный поток ввода, то там std::map быть не может.
если "вход" это процедура с входным параметром типа std::map - тоже облом, на паскале его не сформировать.
Нужна "прокладка" на си, которая примет на "вход" (имею ввиду процедуру с параметрами) какуюта общую си-паскаль структуру данных, сбацает из нее std::map и отправит куда надо
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение mirk » 17.05.2017 10:58:32

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

Именно так.

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

:cry:

Я еще могу попробовать повлиять на типы входных параметров.
Мне надо передавать (и принимать) ассоциативный динамический массив. Как лучше сделать это универсально и без просадки по скорости?
mirk
постоялец
 
Сообщения: 317
Зарегистрирован: 24.09.2007 10:03:39

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

Сообщение zub » 17.05.2017 11:05:46

Еще вариант сделать "прокладку" на си для работы с этим мапом = преобразовать вызовы методов сишного класса в вызов обычных сишных процедур - они совместимы. По принципу как qt4pas работает, си обертка над с++, паскаль с ней работает
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение Azazaz » 17.05.2017 20:56:07

Вычленить из аналов C структуру данных из под map, написать С функцию которая возвращает указатель на эти данные. передать в паскаль функцию указатель. Но подобные метод может быть совершенно не эффективен ввиду того что C++ генерирует в реализации методов всякую дрянь ака инкапсуляция, что крайне затрудняет обнаружение и изменение полей объектов, а также подобные фортели могут сломать объект и привести к внезапному вылету, если не обновить все нужные поля объекта(к примеру попытке прочитать не выделенную или освобожденную память).
Заниматься таким извратом я конечно же не советую, но нормальные люди в аналогичных ситуациях используют структуры/массивы(данные из map) и указатели на них, например вызовы WinApi можно делать из любого языка, нужно только знать структуры выводных данных.
Azazaz
новенький
 
Сообщения: 41
Зарегистрирован: 21.04.2015 20:00:03

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

Сообщение Дож » 17.05.2017 21:26:52

Внутреннее устройство 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 через них.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

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

Сообщение AlexVinS » 19.05.2017 20:27:07

Начнём с того, что std::map - это шаблон, и весьма не тривиальный. От того чем он специализирован тоже многое зависит если так уж хочется передавать его содержимое pascal<->c++
Аватара пользователя
AlexVinS
новенький
 
Сообщения: 95
Зарегистрирован: 27.01.2009 01:18:01

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

Сообщение olegy123 » 19.05.2017 22:37:10

проще написать "оберку"^
Паскаль - > dll/so -> std::map
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

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

Сообщение Vadim » 20.05.2017 12:57:05

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

Интерфейс (в смысле COM ;-) )?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19

Рейтинг@Mail.ru