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);
Что нужно сюда вставить чтобы всё заработало |
|
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 и всё заработало.
Еще раз спасибо.
Отредактировано vladislav — 18/04/2004, 18:13 |
|