|
179 / 127 / 25
Регистрация: 12.01.2012
Сообщений: 623
|
|
Как скомпоновать модуль с кодом C++ с Си?05.10.2012, 05:56. Показов 2165. Ответов 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 строку? Как скомпоновать програму в один ехе файл?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|