C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Анализатор ариф. выражений в rxlib, не могу зарегистрировать собственную ф-ю
vladislav
Отправлено: 18.04.2004, 10:28


Ученик-кочегар

Группа: Участник
Сообщений: 5



Ребята помогите зарегистрировать собственную ф-ю в C++ Builder 5
Все примеры в help для дельфи. Я пытался перевести но что-то не так.

Например: сама ф-я

long double __fastcall GetPhase(Extended X)
{ Extended Y;
Y = X / (2 / 3.14);
Extended Result = (Y — floor(Y)) * (2 * 3.14);
}

далее пытаясь её зарегитрировать выдается ошибка на TMetaClass

rxMathParser1->RegisterUserFunction(?,"PHASE", GetPhase);

Что нужно сюда вставить чтобы всё заработало sad.gif
Admin
Отправлено: 18.04.2004, 14:21


Владимир

Группа: Администратор
Сообщений: 1190



Во первых:
в самой функции вместо Delphi-йского Result поставьте
CODE

return (Y — floor(Y)) * (2 * 3.14);


В общем, попробуйте вот так:

CODE

#include <Parsing.hpp>
long double __fastcall GetPhase(long double X);

void __fastcall TForm1::Button1Click(TObject *Sender)
{
TRxMathParser* rxMathParser1 = new TRxMathParser();
rxMathParser1->RegisterUserFunction(NULL, "PHASE", &GetPhase);
double d = rxMathParser1->Exec("100+PHASE(10)");
ShowMessage(d);
 delete rxMathParser1;
}
//---------------------------------------------------------------------------

#include <math.h>
long double __fastcall GetPhase(long double X)
{
Extended Y;
Y = X / (2 / 3.14);
return (Y — floor(Y)) * (2 * 3.14);
}
//---------------------------------------------------------------------------


Отредактировано Admin — 18/04/2004, 15:26
Admin
Отправлено: 18.04.2004, 15:08


Владимир

Группа: Администратор
Сообщений: 1190



Наверное сразу возникает вопрос — а как подсунуть
не значение, а переменную типа x,
например int x = 25;

Если мы напрямую напишем:

double d = rxMathParser1->Exec("x * 10");

то получим исключение.

Можно это сделать так:
CODE

double d = rxMathParser1->Exec("10 * "+IntToStr(x));


то есть для нашего случая, типа:
double d = rxMathParser1->Exec("100+PHASE(25.45)");
правильно будет так:

CODE


double x = 25.45;

....

double d = rxMathParser1->Exec("100+PHASE("+FloatToStr(x)+")");

....



Отредактировано Admin — 18/04/2004, 16:19
vladislav
Отправлено: 18.04.2004, 17:10


Ученик-кочегар

Группа: Участник
Сообщений: 5



Большое всем спасибо, так тоже все заработало.
Но я убрал class из строк
class procedure RegisterUserFunction(const Name: string; Proc: TUserFunction);
class procedure UnregisterUserFunction(const Name: string);
в файле parsing.pas и соответственно допёр что я забыл return и всё заработало.

Еще раз спасибо.
biggrin.gif biggrin.gif biggrin.gif

Отредактировано vladislav — 18/04/2004, 18:13

Вернуться в Вопросы программирования в C++Builder