powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Составить уравнение на лету
10 сообщений из 10, страница 1 из 1
Составить уравнение на лету
    #34935312
Borr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть следующая задача есть набор значений A, B, C, D, E нужно проверять их значение по некоторым проверочным соотношениям типа A+B <= C+D, A+B+C < D/3 и т.д. Проверочные соотношения постоянно меняются. Как это лутше делать? Задавать проверочные соотношения строчкой а потом парсить? Кто уже решал такую задачу как лутше?
...
Рейтинг: 0 / 0
Составить уравнение на лету
    #34936284
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если набор этих соотношений конечный, пусть и большой, но конечный. То можно написать набор функций, сложить указатели на эти функции в массив и... все.

Если же на этапе компиляции набор соотношений не известен, то да - прийдется писать свой или подключать чужой парсер.
Самый простой способ написать свой - это парсер Forth'a.
Самый простой способ подключить чужой - это взять perl, php или WScript (если жизнь только под виндой). Описания как подключать первые два есть в документации на них, работа с WScript описана много где.
...
Рейтинг: 0 / 0
Составить уравнение на лету
    #34936399
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Borr wrote:
> Автор: "Borr"
> Есть следующая задача есть набор значений A, B, C, D, E нужно проверять
> их значение по некоторым проверочным соотношениям типа A+B <= C+D, A+B+C
> < D/3 и т.д. Проверочные соотношения постоянно меняются. Как это лутше
> делать? Задавать проверочные соотношения строчкой а потом парсить? Кто
> уже решал такую задачу как лутше?

Можно взять чужое - есть куча библиотек, вычисляющих выражения (искать в
google что-нибудь типа "expression evaluation"). Внешние языки - на мой
взгляд лучше подключить что-нибудь полегче. Например, lua. Писать свое -
берешь yacc (bison), если умеешь пользоваться - делов на полчаса от
силы, если нет - ищешь к нему пример calc и дополняешь своими
переменными и реляционными операциями.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Составить уравнение на лету
    #34936585
Leshij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
On Tue, 13 Nov 2007 14:03:51 +0300, Borr <nospam@sql.ru>; wrote:

> Есть следующая задача есть набор значений A, B, C, D, E нужно проверять
> их
> значение по некоторым проверочным соотношениям типа A+B <= C+D, A+B+C <
> D/3 и т.д.
> Проверочные соотношения постоянно меняются. Как это лутше делать?
> Задавать
> проверочные соотношения строчкой а потом парсить? Кто уже решал такую
> задачу как
> лутше?

Если функции будут примерно как в примере, можно выбрать общее уравнение
для такого класса функций и хранить его коэффициенты.

--
Здесь у нас туманы и дожди, здесь у нас холодные рассветы,
Здесь на неизведанном пути ждут замысловатые сюжеты!
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Составить уравнение на лету
    #34937116
Borr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно маленький пример с WScript. Я не пойму как получить результаты его работы.
...
Рейтинг: 0 / 0
Составить уравнение на лету
    #34937194
Borr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такая штука замечательная gawk.
Пишу в консоли gawk "BEGIN {print 1+2.369*(1+3)}" и получаю результат. А как мне получить этот результат если я ее запускаю через ShellExecute или CreateProcess и использовать его в моей программе.
...
Рейтинг: 0 / 0
Составить уравнение на лету
    #34937292
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BorrЕсть такая штука замечательная gawk.
Пишу в консоли gawk "BEGIN {print 1+2.369*(1+3)}" и получаю результат. А как мне получить этот результат если я ее запускаю через ShellExecute или CreateProcess и использовать его в моей программе.

Самый простой вариант загнать в файл. Можно помутить и с перенаправлением стандартного потока.
...
Рейтинг: 0 / 0
Составить уравнение на лету
    #34939201
Borr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такая проблемы пытаюсь получить данные с консоли вот функция
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
void GetFromConsoleFrame::ExecConsoleApp(string CommandLine, string &Output, string &Errors)
{
      HANDLE hOutputRead, hOutputWrite;
      HANDLE hInputRead, hInputWrite;
      HANDLE hErrorsRead,  hErrorsWrite;
      HANDLE hThread;
      DWORD ThreadId;
      DWORD nBytesRead;
      SECURITY_ATTRIBUTES sa;
      PROCESS_INFORMATION pi;
      STARTUPINFO si;
      char szInput[ 256 ];
      char env[ 100 ];
      char lpBuffer[ 256 ];
      ifstream in;
      ofstream out;
      // Set up the security attributes struct.
      sa.nLength= sizeof(SECURITY_ATTRIBUTES);
      sa.lpSecurityDescriptor = NULL;
      sa.bInheritHandle = TRUE;
      CreatePipe(&hOutputRead, &hOutputWrite, &sa,  0 );
      CreatePipe(&hErrorsRead, &hErrorsWrite, &sa,  0 );
      ZeroMemory(&si, sizeof(STARTUPINFO));
      ZeroMemory( &pi, sizeof(pi) );
      ZeroMemory(szInput,  256 );
      ZeroMemory(lpBuffer,  256 );
      ZeroMemory(env,  100 );
      si.cb = sizeof (si);
      si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
      si.wShowWindow = SW_HIDE;
      si.hStdInput =  0 ;
      si.hStdOutput = hOutputWrite;
      si.hStdError = hErrorsWrite;
      if(!CreateProcess(NULL, (char*)CommandLine.c_str(), NULL, NULL, TRUE,
                         CREATE_NEW_CONSOLE | NORMAL_PRIORITY_CLASS, env,NULL,&si,&pi))
          {
              CloseHandle(hOutputRead);
              CloseHandle(hOutputWrite);
              CloseHandle(hErrorsRead);
              CloseHandle(hErrorsWrite);
              return;
          }
       CloseHandle(hOutputWrite);
       CloseHandle(hErrorsWrite);
       if (ReadFile(hOutputRead, lpBuffer, sizeof(lpBuffer),
                                          &nBytesRead, NULL))
          Output = lpBuffer;
       if(ReadFile(hErrorsRead, lpBuffer, sizeof(lpBuffer),
                                          &nBytesRead, NULL))
          Errors = lpBuffer;
      WaitForSingleObject(pi.hProcess, INFINITE);
      CloseHandle(pi.hProcess);
      CloseHandle(hOutputRead);
      CloseHandle(hErrorsRead);
}

Пока одна строчка все нормально а как получить несколько строк?
...
Рейтинг: 0 / 0
Составить уравнение на лету
    #34940039
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BorrЕсть такая штука замечательная gawk.
Пишу в консоли gawk "BEGIN {print 1+2.369*(1+3)}" и получаю результат. А как мне получить этот результат если я ее запускаю через ShellExecute или CreateProcess и использовать его в моей программе.CreatePipe() поможет. Издеваться над консолью не нужно.
...
Рейтинг: 0 / 0
Составить уравнение на лету
    #34940706
Borr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без CreateProcess один фиг не обойтись. А в чем приемущество использования CreatePipe?
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Составить уравнение на лету
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]