![]() |
Re: RUTIS Engine (Scripting) [WinCE spinnt]
Genau dieses "misaligned data" hab ich auch als Fehler bekommen ab und zu...
Aber was soll man da dann nur machen.... Es scheint so als bleibt mir nichts anderes übrig, als alle Daten auzurichten... Aber was mich wundert ist, das das Problem auch auf dem emulierten WinCe auftritt :gruebel: Ich werde es weiterhin versuchen. bisher hab ichs eh durch ausrichten der Daten soweit zum laufen gebracht. Nur... was mache ich dann mit packed records????? Fragen über Fragen :wall: MFG |
Re: RUTIS Engine (Scripting) [WinCE spinnt]
Zitat:
Zitat:
|
Re: RUTIS Engine (Scripting) [WinCE spinnt]
Mein Stack hat eine halb-feste Größe.
Während der Ausführung reserviert meine Stack-Class Speicherblöcke mit einer beim Erstellen des Stacks vorgegebenen Blockgröße. Deswegen muss eine Adresse (als Pointer) auf eine Variable im Stack auch über die Array-Property Data[<Stack-Adresse>] ausgewertet werden. Diese Funktion prüft, auf welchem Stack-Block die gewünchte Adresse liegt und gibt das entsprechende Ergebnis zurück. Aber dieses unaligned_Keyword scheint genau das zu sein, was ich brauchte. Ich werde dennoch (der Geschwindigkeit wegen) versuchen, die Variablen weitestgehend am Raster auszurichten. Es stellt sich mir jetzt nur die Frage, was schneller ist: Entweder immer mit unaligned auf die Werte zugreifen, oder vorher eine Prüfung durchführen, ob die Variable auf dem Raster liegt und dem entsprechend unaligned verwenden oder nicht. Ich schätze aber 1. ist schneller, da unaligned bei schon ausgerichteten Werten wohl nix macht. EDIT: VERDAMMT ich glaubs nicht! Das funktioniert so wirklich!!!! VIELEN DANK das war eine große Hilfe!! Ich werde nun mal sehen wie ich das auf die Reihe krige. Am meisten Kopfschmerzen bereitet mir nun die Frage, wie ich das nutzen kann, ohne das sich das Projekt nicht mehr mit Borland-Delphi kompilieren lässt. {$Ifdef WinCe} überall einzubauen wäre eine riesige Arbeit. Vielleicht ließe sich ja sowas mit einer Funktion realisieren, die sich je nach WinCe oder nicht-WinCe unterscheidet. Gibt es da nicht auch so was wie Inline-Funktionen, sodass ich das ganze nutzen kann, ohne eine Menge calls? Leider kenne ich mich mit diesem inline nicht aus. EDIT-2: Mir ist gerade aufgefallen, das das doch einigermaßen geht: Indem ich das so schreibe:
Delphi-Quellcode:
Das solle nicht dermaßen viel arbeit sein.
{$ifdef WinCE}unaligned{$endif}(PCardinal(@Data[adr])^) := val;
unaligned(PCardinal(@Data[adr])^) := val; //So sähe es mit WinCe aus -> lässt sich kompilieren (PCardinal(@Data[adr])^) := val; //So sähe es ohne WinCe aus -> die Klammern stören Delphi ja nicht MFG und VIELEN DANK für die Hilfe (vor allem @Poelser) |
Re: RUTIS Engine (Scripting) [WinCE spinnt]
Das ist aber sehr schade...
Delphi kommt mit meinem ganannten Beispiel dort nicht zurecht. Wenn ich so etwas wie
Delphi-Quellcode:
schreibe sagt der: "[Pascal Fehler]: E2064 Der linken Seite kann nichts zugewiesen werden"
(PCardinal(@Data[adr])^) := val;
Also bleibt mir da fast nur noch eine Variante mit dem inline oder ich muss das ganze dann so schreiben:
Delphi-Quellcode:
:wall:
{$ifdef WinCE}unaligned({$endif}PCardinal(@Data[adr])^{$ifdef WinCE}){$endif} := val;
EDIT: Gute Neuigkeiten! Das mit der inline-Funktion funktioniert gut (zumindest beim auslesen von Werten):
Delphi-Quellcode:
MFG
function GetPCardinal(const Adr: PCardinal): Cardinal; inline;
begin {$ifdef WinCE} Result := unaligned(Adr^); {$else WinCE} Result := Adr^; {$endif} end; Function TRutisStack.PopCardinal : Cardinal; Begin //So sah die alte Zeile aus: Result := PCardinal(Data[Top - 4])^; //Und so die neue Result := GetPCardinal(Data[Top - 4]); //Die neue Anweisung, die am ende dennoch die //gleichen Assembler-Befehle ergibt dank inline Pop(4); End; |
AW: RUTIS Engine (Scripting) [WinCE spinnt]
Hallo,
Meiner Deutsch ist nicht so gut, aber ich darf etwas fragen. Kannst du dieser patch anbringen? grüße, Raymond
Delphi-Quellcode:
Index: RUTIS_Classes.pas
=================================================================== --- RUTIS_Classes.pas (revision 23) +++ RUTIS_Classes.pas (working copy) @@ -134,6 +134,7 @@ //================================================ Property CompilerError : Boolean Read GetCompilerError; Property Error : ERutisCompilerError Read fCompilerError; + Property ScriptError : Boolean Read fScriptError End; TRutisCompiler = Class @@ -1466,7 +1467,7 @@ Begin Result := (Address < 0) or (Address > ScriptData.Stack.Top); If Result Then - ScriptMessage('Address Error (Address ID = ' + IntToStr(Address) + ')'); + ScriptMessage('Address Error (Address ID = ' + IntToStr(Address) + ')', etRuntimeError); End; Function TRutisEngineBase.GetStackLvlAddress(Address, Level : Integer) : Integer; Index: Rutis_Engine.pas =================================================================== --- Rutis_Engine.pas (revision 23) +++ Rutis_Engine.pas (working copy) @@ -308,7 +308,7 @@ fLastAdress := Pointer(ScriptData.Stack.ReadCardinal(src)); If GetExtAddrRange(fLastAdress) = -1 Then Begin - ScriptMessage('Address Error'); + ScriptMessage('Address Error', etRuntimeError); exit; End; @@ -320,7 +320,7 @@ fLastAdress := Pointer(ScriptData.Stack.ReadCardinal(ScriptData.Stack.Top - 4)); If GetExtAddrRange(fLastAdress) = -1 Then Begin - ScriptMessage('Address Error'); + ScriptMessage('Address Error', etRuntimeError); exit; End; End; @@ -1088,7 +1088,7 @@ Begin If ScriptData.CurrCmd.P1 <= 0 Then Begin - ScriptMessage('Error - OpEnumToSet'); + ScriptMessage('Error - OpEnumToSet',etRuntimeError); exit; End; bit := ScriptData.Stack.PopByte; @@ -1649,7 +1649,7 @@ intDouble : Val2 := ScriptData.Stack.PopDouble; intExtended : Val2 := ScriptData.Stack.PopExtended; Else - ScriptMessage('Comparison Error'); + ScriptMessage('Comparison Error',etRuntimeError); End; Case TRutisIntType(ScriptData.CurrCmd.P2) Of @@ -1669,7 +1669,7 @@ intDouble : Val1 := ScriptData.Stack.PopDouble; intExtended : Val1 := ScriptData.Stack.PopExtended; Else - ScriptMessage('Comparison Error'); + ScriptMessage('Comparison Error',etRuntimeError); End; Case TOperatorCode(ScriptData.CurrCmd.P1) Of |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz