Общение с программой на CИ
Модератор: Модераторы
Общение с программой на CИ
Хочу написать модуль для программы на СИ.
На вход она ждет std::map и выдает его же.
Как мне описать это в моей программе?
На вход она ждет std::map и выдает его же.
Как мне описать это в моей программе?
Как вы себе представляете std::map на входе?
Никак, поэтому и спрашиваю 
Вероятно там структура динамическая или вроде того.
Модули на СИ обмениваются без проблем между собой.
Вероятно там структура динамическая или вроде того.
Модули на СИ обмениваются без проблем между собой.
если под входом предполагается стандартный поток ввода, то там std::map быть не может.
если "вход" это процедура с входным параметром типа std::map - тоже облом, на паскале его не сформировать.
Нужна "прокладка" на си, которая примет на "вход" (имею ввиду процедуру с параметрами) какуюта общую си-паскаль структуру данных, сбацает из нее std::map и отправит куда надо
если "вход" это процедура с входным параметром типа std::map - тоже облом, на паскале его не сформировать.
Нужна "прокладка" на си, которая примет на "вход" (имею ввиду процедуру с параметрами) какуюта общую си-паскаль структуру данных, сбацает из нее std::map и отправит куда надо
zub писал(а):если "вход" это процедура с входным параметром типа std::map
Именно так.
zub писал(а):облом, на паскале его не сформировать.
Я еще могу попробовать повлиять на типы входных параметров.
Мне надо передавать (и принимать) ассоциативный динамический массив. Как лучше сделать это универсально и без просадки по скорости?
Еще вариант сделать "прокладку" на си для работы с этим мапом = преобразовать вызовы методов сишного класса в вызов обычных сишных процедур - они совместимы. По принципу как qt4pas работает, си обертка над с++, паскаль с ней работает
Вычленить из аналов C структуру данных из под map, написать С функцию которая возвращает указатель на эти данные. передать в паскаль функцию указатель. Но подобные метод может быть совершенно не эффективен ввиду того что C++ генерирует в реализации методов всякую дрянь ака инкапсуляция, что крайне затрудняет обнаружение и изменение полей объектов, а также подобные фортели могут сломать объект и привести к внезапному вылету, если не обновить все нужные поля объекта(к примеру попытке прочитать не выделенную или освобожденную память).
Заниматься таким извратом я конечно же не советую, но нормальные люди в аналогичных ситуациях используют структуры/массивы(данные из map) и указатели на них, например вызовы WinApi можно делать из любого языка, нужно только знать структуры выводных данных.
Заниматься таким извратом я конечно же не советую, но нормальные люди в аналогичных ситуациях используют структуры/массивы(данные из map) и указатели на них, например вызовы WinApi можно делать из любого языка, нужно только знать структуры выводных данных.
Внутреннее устройство 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 через них.
Наиболее безопасное решение — как предлагает 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 через них.
Начнём с того, что std::map - это шаблон, и весьма не тривиальный. От того чем он специализирован тоже многое зависит если так уж хочется передавать его содержимое pascal<->c++
проще написать "оберку"^
Паскаль - > dll/so -> std::map
Паскаль - > dll/so -> std::map
olegy123 писал(а):проще написать "оберку"^
Паскаль - > dll/so -> std::map
Интерфейс (в смысле COM
