Страница 1 из 1
		
			
				Общение с программой на CИ
				
Добавлено: 
17.05.2017 09:59:14 mirk
				Хочу написать модуль для программы на СИ.
На вход она ждет std::map и выдает его же.
Как мне описать это в моей программе?
			 
			
		
			
				Re: Общение с программой на CИ
				
Добавлено: 
17.05.2017 10:07:30 zub
				Как вы себе представляете std::map на входе?
			 
			
		
			
				Re: Общение с программой на CИ
				
Добавлено: 
17.05.2017 10:32:31 mirk
				Никак, поэтому и спрашиваю 

Вероятно там структура динамическая или вроде того.
Модули на СИ обмениваются без проблем между собой.
 
			
		
			
				Re: Общение с программой на CИ
				
Добавлено: 
17.05.2017 10:39:53 zub
				если под входом предполагается стандартный поток ввода, то там std::map быть не может.
если "вход" это процедура с входным параметром типа std::map - тоже облом, на паскале его не сформировать.
Нужна "прокладка" на си, которая примет на "вход" (имею ввиду процедуру с параметрами) какуюта общую си-паскаль структуру данных, сбацает из нее std::map и отправит куда надо
			 
			
		
			
				Re: Общение с программой на CИ
				
Добавлено: 
17.05.2017 10:58:32 mirk
				zub писал(а):если "вход" это процедура с входным параметром типа std::map
Именно так.
zub писал(а):облом, на паскале его не сформировать.
 
 Я еще могу попробовать повлиять на типы входных параметров.
Мне надо передавать (и принимать) ассоциативный динамический массив. Как лучше сделать это универсально и без просадки по скорости?
 
			
		
			
				Re: Общение с программой на CИ
				
Добавлено: 
17.05.2017 11:05:46 zub
				Еще вариант сделать "прокладку" на си для работы с этим мапом = преобразовать вызовы методов сишного класса в вызов обычных сишных процедур - они совместимы. По принципу как qt4pas работает, си обертка над с++, паскаль с ней работает
			 
			
		
			
				Re: Общение с программой на CИ
				
Добавлено: 
17.05.2017 20:56:07 Azazaz
				Вычленить из аналов C структуру данных из под map, написать С функцию которая возвращает указатель на эти данные. передать в паскаль функцию указатель. Но подобные метод может быть совершенно не эффективен ввиду того что C++ генерирует в реализации методов всякую дрянь ака инкапсуляция, что крайне затрудняет обнаружение и изменение полей объектов, а также подобные фортели могут сломать объект и привести к внезапному вылету, если не обновить все нужные поля объекта(к примеру попытке прочитать не выделенную или освобожденную память).
Заниматься таким извратом я конечно же не советую, но нормальные люди в аналогичных ситуациях используют структуры/массивы(данные из map) и указатели на них, например вызовы WinApi можно делать из любого языка, нужно только знать структуры выводных данных.
			 
			
		
			
				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 через них.
			 
			
		
			
				Re: Общение с программой на CИ
				
Добавлено: 
19.05.2017 20:27:07 AlexVinS
				Начнём с того, что std::map - это шаблон, и весьма не тривиальный. От того чем он специализирован тоже многое зависит если так уж хочется передавать его содержимое pascal<->c++
			 
			
		
			
				Re: Общение с программой на CИ
				
Добавлено: 
19.05.2017 22:37:10 olegy123
				проще написать "оберку"^
Паскаль - > dll/so ->  std::map
			 
			
		
			
				Re: Общение с программой на CИ
				
Добавлено: 
20.05.2017 12:57:05 Vadim
				olegy123 писал(а):проще написать "оберку"^
Паскаль - > dll/so -> std::map
Интерфейс (в смысле COM 

 )?