|
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
|
|
Как скомпоновать модуль с кодом C++ с Си?05.10.2012, 05:56. Показов 2113. Ответов 9
Метки нет (Все метки)
Такое дело: имеется один модуль на C++, там чисто внутри используется STL, std::string, структуры применяются в стиле C++ и другое. Требуется использовать этот модуль в Си программе. В принципе, требуется вызывать только одну функцию, аргументы которых будут Сишные типы(строки char *, и указатель на функцию)
Поделитесь опытом, каким образом это лучше всего реализовать?
0
|
|
| 05.10.2012, 05:56 | |
|
Ответы с готовыми решениями:
9
Как скомпоновать данные как скомпоновать программу а линуксе? Как скомпоновать уравнение с постоянными коэффициентами? |
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||||||||||||
| 05.10.2012, 09:36 | ||||||||||||||||
|
Buckstabue,
Если пример поконкретнее - мутим что-нибудь вроде такого.
1
|
||||||||||||||||
|
|
|
| 05.10.2012, 14:12 | |
|
ForEveR, ты нарисовал решение к обратной постановке задачи
Добавлено через 1 минуту Использование C++ кода внутри программы на C: какие есть варианты?
0
|
|
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 05.10.2012, 14:33 | |
|
Evg, Есть С++ программа. Одну из функций нужно вызвать из С. Из С кода не должны быть видны С++ функции. При этом, если код компилируется С++ компилятором - он должен работать. Решение к какой еще обратной постановке я нарисовал? Может я что-то не понимаю... Это не написание обертки - это просто некое переделывание кода модуля. Вместо этого конечно можно и обертку написать.
0
|
|
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 05.10.2012, 14:40 | |
|
Evg, Согласен. Ок. Есть модуль. Мы считаем, что мы можем переписывать именно его или нет? Если нет - только оберти. Если да - чем не катит мой вариант?
0
|
|
|
|
|||
| 05.10.2012, 14:52 | |||
|
1
|
|||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 05.10.2012, 15:03 | |
|
Evg, Понятно. Собственно, тогда согласен.
0
|
|
|
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
|
|
| 05.10.2012, 16:37 [ТС] | |
|
Требуется реализовать некоторое подобие виртуальной командной строки. Сам модуль командной строки может быть написан и на C++ и скомпилирован в виде компонуемого объектного файла или библиотеки, но самую главную(и выходит самую легкую) часть, где происходит регистрация команд, надо написать на языке Си и скормить это именно компилятору gcc. Вообще требуется, чтобы Си программа могла каким угодно способом запустить функцию runComand(char * cmdStr) , которая содержится в модуле "командной строки". Код примерно таков(альфа версия, пока недопилил до перевода некоторых строк в строки в стиле Си). Посоветуйте плиз как это сделать, может объявление Си++ структур данных перенести в cpp файл и оставить объвление только runComand(char *) ? Или это не есть гут?
P.S. еще забыл функцию registerComand(), которая должна регистрировать функцию в командой строке cmdline.hpp
#ifndef CMDLINE_HPP
#define CMDLINE_HPP #include <list> #include <string> struct Command { std::string cmdStr; // имя команды std::string helpStr; // справка команды void (*func)(int argc, char **argv); // функция команды inline bool operator==(const Command& other) { return other.cmdStr == cmdStr; } }; /* функция, регистрирующая команду * возвращает 0, если операция прошла удачно -1, если функцию невозможно зарегистрировать, т.е. она содержит нечисловой или небуквенный символ, кроме символа -(тире) -2, если функцию нельзя зарегистрировать, т.к. данное имя команды уже используется */ int registerCommand(const char * _cmdCharStr, // название команды void (*func)(int, char **), // функция, вызываемая при вводе команды const char * const _helpStr); // помощь по команде // запустить команду int runCommand(std::string& cmdStr); // выводиь список доступных команд void help(); // справка по выбранное команде void helpCommand(std::string cmdStr); #endif // CMDLINE_HPP CMDLINE.CPP
#include "cmdline.hpp"
#include <list> #include <string> #include <vector> #include <algorithm> #include <string.h> #include <iostream> std::list<Command> cmdList; // -------------------------------------------- int runCommand(std::string& cmdLine) { if (cmdLine.empty() || cmdLine[0] == ' ') return 0; std::vector<char *> cmdArgs; int pos; int curPos; std::string curWord; std::string cmdStr; char * curArg = NULL; pos = 0; curPos = 0; while ((pos = cmdLine.find(" ", curPos)) != std::string::npos) { curWord = cmdLine.substr(curPos, pos - curPos); curArg = new char[curWord.length() + 1]; strcpy(curArg, curWord.c_str()); cmdArgs.push_back(curArg); curPos = pos + 1; } curWord = cmdLine.substr(curPos, cmdLine.length() - curPos); curArg = new char[curWord.length() + 1]; strcpy(curArg, curWord.c_str()); cmdArgs.push_back(curArg); cmdStr = std::string(cmdArgs.front()); // сохранение имени команды в cmdStr bool cmdWasFound = false; // флаг - команда найдена в списке зарегистрированных команд for (auto const &i : cmdList) { if (i.cmdStr == cmdStr) { i.func(cmdArgs.size(), &cmdArgs[0]); cmdWasFound = true; } } for (auto &i : cmdArgs) { // очистка динамически выделенной памяти delete[] i; i = nullptr; } if (!cmdWasFound) { std::cout << "command not found" << std::endl; return -1; } return 0; } // -------------------------------------------- int registerCommand(const char * _cmdCharStr, void (*func)(int, char **), const char * const _helpStr) { const size_t CMDSTR_LEN = strlen(_cmdCharStr); for (size_t i = 0; i < CMDSTR_LEN; ++i) { if (!isalnum(_cmdCharStr[i]) && _cmdCharStr[i] != '-') { // если это небуквенный, нецифровой символ или не знак подчеркивания // то неверная команда std::cout << "ERROR. Can not register command with non [a-zA-Z0-9\\-] symbols" << std::endl; return -1; } } Command cmdStruct; cmdStruct.cmdStr = _cmdCharStr; cmdStruct.helpStr = _helpStr; cmdStruct.func = func; if (std::find(cmdList.begin(), cmdList.end(), cmdStruct) == cmdList.end()) { // если это новая команда cmdList.push_back(cmdStruct); return 0; } else { // если команда уже зарегистрирована return -2; } } // -------------------------------------------- main.cpp
#include <string> #include <iostream> #include "cmdline.hpp" void test(int argc, char **argv) { int i; for (i = 0; i < argc; ++i) { std::cout << argv[i] << std::endl; } } int main() { Command cmdStruct; std::string cmdStr; bool wantExit; registerCommand("test", test, "test help"); wantExit = false; while (!wantExit) { std::getline(std::cin, cmdStr); if (cmdStr == "quit" || cmdStr == "exit") { wantExit = true; } else { runCommand(cmdStr); } } } Проше прощения, но у меня тут отступы почему-то не отображаются, хотя в редакторе они есть
0
|
|
|
|
|||
| 05.10.2012, 16:54 | |||
|
1
|
|||
| 05.10.2012, 16:54 | |
|
Помогаю со студенческими работами здесь
10
Посоветуйте, как правильно скомпоновать страницы? Как скомпоновать весь код в 1 строку? Как скомпоновать програму в один ехе файл?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|