Форум программистов, компьютерный форум CyberForum.ru

Как скомпоновать модуль с кодом C++ с Си? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Проверка строчных букв на упорядоченность по алфавиту http://www.cyberforum.ru/cpp-beginners/thread663877.html
Доброго времени суток! Помогите с программой пожалуйста. Отблагодарю не только словами. Программу надо написать на языке Си иди С++, но оочень желательно на Си. Если темой не попал в раздел, простите. Я только после создания заметил что раздел c++, модераторы если можете удалите этот топик, нехочу нарушать правила, создал аналогичный, но уже в правильном разделе. Задание: Дан текст,...
C++ операция сдвига Объясните пожалуйста как именно работает и для чего нужна операция сдвига влево, в выражении например: N = 10; r = 1 << N; И если можете объяснить этот код: #include<iostream> const int N = 10; http://www.cyberforum.ru/cpp-beginners/thread663873.html
Функция для сравнения двух массивов C++
Функция нужна для ответа на вопрос задачи "Верно ли, что все элементы 1-ой последовательности входят во 2-ю последовательность." помогите пожалуйста
Строка с C в C++ C++
Вот фрагмент, помогите, пожалуйста перевести на язык C++, спасибо while(scanf("%d %d",&a,&b) == 2) { ... }
C++ Упорядочить массив R(L) по невозростанию http://www.cyberforum.ru/cpp-beginners/thread663842.html
Привет всем, помогите пожалуйста с кодом, заранее благодарен. Упорядочить массив R(I) по невозростанию, используя следующий подход: для i=2,3,....,I каждый элемент {r}_{i} вставлять в нужное место среди упорядоченных ранее элементов r1,r2,..,r(i-1) раздвигая их за счет {r}_{i}
C++ Вызов деструктора При ручном вызове деструктора, освобождается ли память* подробнее

Показать сообщение отдельно
Buckstabue
 Аватар для Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
05.10.2012, 16:37  [ТС]     Как скомпоновать модуль с кодом C++ с Си?
Требуется реализовать некоторое подобие виртуальной командной строки. Сам модуль командной строки может быть написан и на 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);
}
}
}

Проше прощения, но у меня тут отступы почему-то не отображаются, хотя в редакторе они есть
 
Текущее время: 07:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru