Вверх ↑
Ответов: 1304
Рейтинг: 405
#1: 2014-01-14 19:29:21 ЛС | профиль | цитата
Netspirit писал(а):
Особых трудностей при переводе компонентов на 64 бита нет. Единственная проблема - вставки на ассемблере, в котором я недостаточно разбираюсь. Из-за этого в данный момент не работает MathParse и зависимый от него Math.

Netspirit, может попробовать использовать данную директиву

#pas
{$IFDEF ASM_VERSION}
код...
{$ENDIF ASM_VERSION}
далее примерчик полезной для меня функции, после перевода компилятора в ASM_VERSION результат положительный для всех компиляторов включая "FPCx64".

пример
Add(MainForm,2953706,63,175)
{
Width=367
Height=210
Caption="PosEx(substr, s, start);"
Position=1
}
Add(Button,8247793,119,175)
{
Left=120
Top=90
Width=115
Caption="Выполнить"
link(onClick,14394038:PosEx_s,[])
}
Add(InlineCode,14394038,175,175)
{
@Hint=#116:PosEx(substr, s, start); - Находит позицию подстроки(substr=d) в строке(s), поиск начинается с позиции(start=count).|
WorkPoints=#7:PosEx_s|
EventPoints=#7:onEvent|
DataPoints=#5:Str_s|5:Str_d|9:Num_Count|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses Windows,Share,Debug,KOL;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|0:|9: public|21: onEvent:THI_Event;|19: Str_s:THI_Event;|19: Str_d:THI_Event;|23: Num_count:THI_Event;|3: |49: procedure PosEx_s(var Data:TData; index:word);|3: |5: end;|0:|14:implementation|0:|7://PosEx|20:{$IFDEF ASM_VERSION}|89:Function PosEx(const substr : String; const s : String; const start: Integer ) : Integer;|20:Type StrRec = record|25: allocSiz: Longint;|23: refCnt: Longint;|23: length: Longint;|9: end;|29:Const skew = sizeof(StrRec);|3:asm|49:{ ->EAX Pointer to substr }|49:{ EDX Pointer to string }|49:{ ECX Pointer to start //cs }|49:{ <-EAX Position of substr in s or 0 }|0:|23: TEST EAX,EAX|24: JE @@noWork|23: TEST EDX,EDX|29: JE @@stringEmpty|38: TEST ECX,ECX //cs|38: JE @@stringEmpty //cs|0:|19: PUSH EBX|19: PUSH ESI|19: PUSH EDI|0:|65: MOV ESI,EAX { Point ESI to }|65: MOV EDI,EDX { Point EDI to }|0:|46: MOV EBX,ECX //cs save start|60: MOV ECX,[EDI-skew].StrRec.length { ECX = }|90: PUSH EDI { remember s position to calculate index }|0:|35: CMP EBX,ECX //cs|35: JG @@fail //cs|0:|72: MOV EDX,[ESI-skew].StrRec.length { EDX = bstr) }|0:|76: DEC EDX { EDX = Length(substr) - }|76: JS @@fail { < 0 ? return }|76: MOV AL,[ESI] { AL = first char of }|84: INC ESI { Point ESI to 2'nd char of substr }|76: SUB ECX,EDX { #positions in s to look }|89: { = Length(s) - Length(substr) + 1 }|22: JLE @@fail|30: DEC EBX //cs|30: SUB ECX,EBX //cs|30: JLE @@fail //cs|30: ADD EDI,EBX //cs|0:|7:@@loop:|21: REPNE SCASB|22: JNE @@fail|82: MOV EBX,ECX { save outer loop }|82: PUSH ESI { save outer loop substr pointer }|82: PUSH EDI { save outer loop s }|0:|23: MOV ECX,EDX|21: REPE CMPSB|85: POP EDI { restore outer loop s pointer }|85: POP ESI { restore outer loop substr pointer }|23: JE @@found|78: MOV ECX,EBX { restore outer loop nter }|22: JMP @@loop|0:|7:@@fail:|78: POP EDX { get rid of saved s nter }|23: XOR EAX,EAX|22: JMP @@exit|0:|14:@@stringEmpty:|23: XOR EAX,EAX|24: JMP @@noWork|0:|8:@@found:|89: POP EDX { restore pointer to first char of s }|89: MOV EAX,EDI { EDI points of char after match }|89: SUB EAX,EDX { the difference is the correct index }|7:@@exit:|19: POP EDI|19: POP ESI|19: POP EBX|9:@@noWork:|4:end;|20:{$ENDIF ASM_VERSION}|3://*|0:|58:procedure THiAsmClass.PosEx_s(var Data:TData; index:word);|3:var|11:d : string;|11:s : string;|16:start : Integer;|19:Result_s : Integer;|5:begin|37: d := ReadString(Data, Str_d, '');|37: s := ReadString(Data, Str_s, '');|45: start := ReadInteger(Data, Num_Count, 0);|35: Result_s := PosEx(d, s, start);|36: _hi_OnEvent(onEvent, Result_s); |4:end;|0:|4:end.|
link(onEvent,5558045:doText,[])
link(Str_s,12163355:Text,[])
link(Str_d,14571651:Text,[])
link(Num_Count,5208559:Text,[])
AddHint(65,-91,173,52,@Hint)
}
Add(Edit,12163355,175,35)
{
Left=120
Top=10
Width=180
Font=[MS Sans Serif,8,1,0,1]
Text="a100 /b200 ! /b200 /a100"
}
Add(Edit,14571651,182,77)
{
Left=120
Top=35
Width=115
Font=[MS Sans Serif,8,1,0,1]
Text="/a100"
}
Add(Edit,5208559,189,119)
{
Left=120
Top=60
Width=115
Font=[MS Sans Serif,8,1,0,1]
Text="12"
}
Add(Label,501503,119,35)
{
Left=5
Top=15
Width=59
Height=17
Font=[MS Sans Serif,8,1,8388608,1]
Caption="строкa(s)"
}
Add(Label,14611983,119,77)
{
Left=5
Top=40
Width=107
Height=17
Font=[MS Sans Serif,8,1,8388608,1]
Caption="подстрока(substr)"
}
Add(Label,308790,119,119)
{
Left=5
Top=65
Width=101
Height=17
Font=[MS Sans Serif,8,1,8388608,1]
Caption="с позиции(start)"
}
Add(Edit,5558045,224,175)
{
Left=120
Top=120
Width=115
}
карма: 3

0