Вверх ↑
Этот топик читают: Гость
Ответов: 1429
Рейтинг: 50
#61: 2011-03-17 12:30:38 ЛС | профиль | цитата
Наконец, после суток головоломки, есть следующее решение:

Кроме декларации переменной Resultat методом:

#pas
lng.decl_priv_var(Resultat, 'real')
Нужно повторно задекларировать ее как:

#hws
lang(Resultat:real)

Тогда, при условии, что память, заведомо, переключена на Real, мы получаем:

#hws
event(onResult, Resultat)

#pas
procedure TClassFTCG_Tools_8EA8BB0.event_doData(var Data:TData; index:word);
begin
resultat1 := 6 + 6;
val4 := resultat1;
end;

Единственный костыль в том, что если подключить элемент не Real, то происходит автоматическая конвертация данных, что сильно замедляет схему. Поэтому пользователю элемента прийдется за этим следить, если он хочет сохранить высокую скорость FTCG:

#hws
procedure TClassFTCG_Tools_8EA8BB0.event_doData(var Data:TData; index:word);
begin
resultat1 := 6 + 45;
val4 := double2str(resultat1);
end;
(Это подключено Memory в NULL)
карма: 0

0
Ответов: 1429
Рейтинг: 50
#62: 2011-03-18 12:37:12 ЛС | профиль | цитата
Почему этот код работает:

#hws
test=copy(MathStr, id , 1)
if (test = 9)
trace(test)
end

А этот код не работает!? Он перестает работать именно с символами < или >?

#hws
test=copy(MathStr, id , 1)
if (test <= 9)
trace(test)
end
карма: 0

0
Ответов: 4630
Рейтинг: 749
#63: 2011-03-18 13:02:07 ЛС | профиль | цитата
Я тоже в твоем компоненте на этом зацыклился. У меня сложилось впечатление,
будто результат функции copy() в последующем коде не воспринимается, как
число.
Кажеться, проблема в codegen.dpr:


#pas
function map_copy(parser:TParser; args:TArgs):TScData;
var tp:byte;
begin
tp := args.Values[0].GetType;
if tp <> data_code then // То-есть, результат только типа data_code или data_str, а нужен, наверное, data_int.
tp := data_str;
Result.SetValue(copy(args.Values[0].toStr(), args.Values[1].toInt(), args.Values[2].toInt()), tp);
end;
карма: 26

0
Разработчик
Ответов: 4698
Рейтинг: 426
#64: 2011-03-18 14:37:24 ЛС | профиль | цитата
login, решение просто, как топор Я аж сам удивился
#hws
test=copy(MathStr, id , 1)
if (9 >= test)
trace(test)
end
карма: 10
3
Голосовали:Netspirit, login, Roma
Ответов: 4630
Рейтинг: 749
#65: 2011-03-18 14:54:18 ЛС | профиль | цитата
Прикольно, таким же макаром работают и арифметические операции.
карма: 26

0
Разработчик
Ответов: 4698
Рейтинг: 426
#66: 2011-03-18 15:04:20 ЛС | профиль | цитата
Netspirit писал(а):
Прикольно, таким же макаром работают и арифметические операции.

Ну так все верно! На таком же принципе будет работать и мой прототип байт-код компилятора: если слева string, значит и справа гони мне string, а не нравится, меняй местами
карма: 10
0
Ответов: 1429
Рейтинг: 50
#67: 2011-03-18 16:40:42 ЛС | профиль | цитата
Но, это мне не помогло определить "не число". С помощью условия "больше/меньше" это не выходит.
Какой есть метод определить символ "не число"?
карма: 0

0
Ответов: 4630
Рейтинг: 749
#68: 2011-03-18 17:27:56 ЛС | профиль | цитата
Ну, например, напиши такую функцию:
code_23012.txt
------------ Дoбавленo в 17.27:
На вход подавай символ и проверяй возвращаемый результат
карма: 26

0
файлы: 1code_23012.txt [521B] [389]
Ответов: 1429
Рейтинг: 50
#69: 2011-03-18 18:37:32 ЛС | профиль | цитата
Netspirit, Я бы, точно, не додумался, спасибо!
карма: 0

0
Ответов: 4630
Рейтинг: 749
#70: 2011-03-18 18:58:35 ЛС | профиль | цитата
Ах, да. Если 'true' и 'false' заменить соответственно
на 1 и 0, то функцию можно прямо подставлять в операции сравнения:

#hws
if (IsNumber('0'))
// действия...
end
карма: 26

0
Ответов: 1429
Рейтинг: 50
#71: 2011-03-18 19:49:15 ЛС | профиль | цитата
ага, прикольно!
карма: 0

0
Гость
Ответов: 17029
Рейтинг: 0
#72: 2011-03-18 20:03:11 правка | ЛС | профиль | цитата


Редактировалось 4 раз(а), последний 2021-05-21 07:55:55
карма: 0

0
Ответов: 1429
Рейтинг: 50
#73: 2011-03-20 01:38:25 ЛС | профиль | цитата
Я закончил код мат-парсера, вот:
code_23014.txt

Но теперь, я не пойму, почему мой парсер не работает элементом for, интересно то, что я уже сталкивался с этой ошибкой: Error: Undeclared identifier: 'i5' Может это ошибка самого элемента for, что он не делает доступным переменную своего счетчика i, поясните мне плиз?

Вот не рабочая схема:

code_23015.txt

А вот код Delphi:

code_23016.txt
------------ Дoбавленo в 03.15:
А вот второй вопрос, в этой схеме кодогенератор не соблюдает последовательность подключения к хабу, и печатает код наоборот. Цикл for выполняется в конце а не в начале:


Add(MainForm,2953706,21,105)
{
Width=306
Height=154
Caption="Test"
Position=1
}
Add(FTCG_Tools,5039548,217,105)
{
}
BEGIN_SDK
Add(EditMultiEx,11372400,21,21)
{
WorkCount=#6:doData|6:doCalc|5:doFor|
Width=608
Height=326
link(doData,10594900:doEvent1,[(31,27)(31,34)])
}
Add(FT_Memory,4409165,98,49)
{
Default=Real(6)
}
Add(FTMathParse,4815401,140,140)
{
DataCount=15
MathStr="exp(exp(%1/%2)*%3/(%2/%10))/%10"
ResultType=1
link(onResult,9008319:doValue,[])
link(X1,4409165:Value,[(146,117)(104,117)])
link(X2,13600669:Value,[])
link(X3,5273271:Value,[(160,110)(202,110)])
link(X10,4177038:Value,[(209,122)(391,122)])
}
Add(FT_Memory,13600669,147,49)
{
Default=Integer(45)
}
Add(FT_Memory,9008319,294,140)
{
Default=Real(0)
link(onData,5750475:doMessage,[])
}
Add(FT_Message,5750475,371,140)
{
}
Add(FT_Memory,5273271,196,49)
{
Default=Integer(3)
}
Add(FT_For,2249134,329,28)
{
End=2
Start=1
link(onEvent,4177038:doValue,[])
}
Add(FT_Memory,4177038,385,28)
{
Default=Integer(500)
link(onData,7827668:doMessage,[])
}
Add(FT_Hub,10594900,42,28)
{
link(onEvent1,2249134:doFor,[])
link(onEvent2,4815401:doCalc,[(74,41)(74,146)])
}
Add(FT_Message,7827668,441,28)
{
}
END_SDK
Add(Button,11335642,154,105)
{
Left=100
Top=35
Width=90
Height=25
Caption="Test"
link(onClick,5039548:doData,[])
}
Add(Button,2054337,154,161)
{
Left=100
Top=65
Width=90
Height=25
Caption="Test"
link(onClick,5039548:doCalc,[(202,167)(202,118)])
}



Код Delphi:


#pas
unit hiFTCG_Tools_8EA8B00;

interface

uses windows,kol,Share,hiFTCG_Tools_EM,ftcg_share;

type
TClassFTCG_Tools_8EA8B00 = class(TFTCG_Tools_EM)
private
val3:integer;
resultat5:real;
val9:real;

function readData(index:word):TData;
function readDataInt(index:word):integer;
function readDataStr(index:word):string;
function readDataReal(index:word):real;
public

constructor Create(_Control:PControl);
destructor Destroy; override;
procedure event_doData(var Data:TData; index:word);
procedure event_doCalc(var Data:TData; index:word);
procedure event_doFor(var Data:TData; index:word);
end;

function Create_hiFTCG_Tools_8EA8B00(Control:PControl):TFTCG_Tools_EM;

implementation

uses hiFTCG_Tools;

function Create_hiFTCG_Tools_8EA8B00;
begin
Result := TClassFTCG_Tools_8EA8B00.Create(Control);
end;

constructor TClassFTCG_Tools_8EA8B00.Create;
begin
inherited Create(_Control);
SetLength(doWork, 3);
SetLength(getVar, 0);
doWork[0] := event_doData;
doWork[1] := event_doCalc;
doWork[2] := event_doFor;
val3 := 500;
val9 := 0;
end;

destructor TClassFTCG_Tools_8EA8B00.Destroy;
begin
inherited Destroy;
end;

function TClassFTCG_Tools_8EA8B00.readData;
begin
dtNull(Result);
_ReadData(Result, THIFTCG_Tools(FParent).Datas[index]);
end;

function TClassFTCG_Tools_8EA8B00.readDataInt;
var dt:TData;
begin
dtNull(dt);
_ReadData(dt, THIFTCG_Tools(FParent).Datas[index]);
Result := ToInteger(dt);
end;

function TClassFTCG_Tools_8EA8B00.readDataStr;
var dt:TData;
begin
dtNull(dt);
_ReadData(dt, THIFTCG_Tools(FParent).Datas[index]);
Result := ToString(dt);
end;

function TClassFTCG_Tools_8EA8B00.readDataReal;
var dt:TData;
begin
dtNull(dt);
_ReadData(dt, THIFTCG_Tools(FParent).Datas[index]);
Result := ToReal(dt);
end;

procedure TClassFTCG_Tools_8EA8B00.event_doData(var Data:TData; index:word);
var
i2:integer;
begin
resultat5 := exp(exp(6/45)*3/(45/val3))/val3;
val9 := resultat5;
MessageBox(0, PChar(double2str(val9)), PChar(''), MB_OK);

for i2 := 1 to 2 do
begin
val3 := i2;
MessageBox(0, PChar(int2str(val3)), PChar(''), MB_OK);
end;
end;

procedure TClassFTCG_Tools_8EA8B00.event_doCalc(var Data:TData; index:word);
begin

end;

procedure TClassFTCG_Tools_8EA8B00.event_doFor(var Data:TData; index:word);
begin

end;

end.


Это возможно исправить?
------------ Дoбавленo в 01.38:
Причина "несоблюдения очереди", была в выделении блоков методом: "block.select"
Не знаю почему, но если было, хоть одно, выделение блока, очередь хаба перестает работать.
карма: 0

0
файлы: 3code_23014.txt [1.4KB] [188], code_23015.txt [1.4KB] [180], code_23016.txt [2.4KB] [216]
Ответов: 5446
Рейтинг: 323
#74: 2011-03-20 11:00:41 ЛС | профиль | цитата
login, работа с блоками в FTCG требует аккуратности:
1) переключил блок - не забудь переключиться обратно
2) перенёс содержимое блока - удали его

Это не конкретно по твоему коду, а вообще.
карма: 1

0
Ответов: 1321
Рейтинг: 37
#75: 2011-03-26 10:54:08 ЛС | профиль | цитата
А можно с помощью кода создать дополнительный файл, с таким-же именем как и проект,но с другим расширением?
карма: 0

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)