-> Hier kostenlos registrieren
Hallo,
ich habe mal wieder Probleme mit den Any-Pointern. Ich habe eine Funktion geschrieben die die Byteadresse die im Any-Pointer gespeichert ist um eine beliebige Anzahl Bytes erhöht.
Hier der Quelltext:
Die Funktion erwarte am Eingang SrcAny einen AnyPointer dessen Byteadresse um die Anzahl Bytes die am Eingang NumBytes übergeben wird erhöht wird. da der Ursprüngliche Pointer nicht verändert werden soll wird noch ein zweiter Any-Pointer an DestAny übergeben. Ich habe die Funktion im TestModus beobachtet, sie macht was sie soll, also um den Code müsst ihr euch nicht kümmern. Einzig und alleine die Rückgabe (rot makiert) ist das Problem.
Da Any-Ausgangsparameter nicht mit Temporären Variablen versorgt werden können habe ich DestAny als Durchgangparameter deklariert.
Hier meine 1. Frage? Warum ist die Versorgung eines Any-Ausgangsparameters mit einem temporären Any-Pointer verboten??? Wenn ich dem Any-Ausgang bspw. einen temporären INT zuweise verstehe ich das ganze. Die Funktion beendet sich, der AnyPointer zeigt auf eine Stelle im L-Stack an der aber die INT-Variable nicht mehr vorhanden ist.
Aber warum wird die Versorgung mit einem lokalen ANY verboten. Weise ich einem Any-Pointer einen anderen Any-Pointer zu wird doch, jedes Feld des ANY einfach kopiert.
Kleines Beispiel:
tmpAyn2 zeigt in dem Beispiel genauso auf intTest wie tmpAny1. Beide ANY sind identisch von ihrem Inhalt.
Warum darf ich jetzt nicht DestAny := tmpAny; zuweisen?
DestAny ist auch nach dem Funktionsaufruf vorhanden, da dies ja eine Variable ist, die von einem anderen Baustein übergeben wurde. Jetzte kopiere ich den tmpAny eins zu eins nach DestAny. Das der tmpAny nach dem sich die Funktion beendet hat nun nicht mehr vorhanden ist, spielt doch keine Rolle. Ich habe ja nur den Inhalt des Pointers kopiert.
Die 2. Frage wäre dann: Weiß jemand wie man dies Einschränkung umgehen kann und ich den neuen ANY wieder aus meinem FC herausbekomme?
Grüße
Jason07
EDIT: Wichtig wäre noch mein UDT: STR_ANY
ich habe mal wieder Probleme mit den Any-Pointern. Ich habe eine Funktion geschrieben die die Byteadresse die im Any-Pointer gespeichert ist um eine beliebige Anzahl Bytes erhöht.
Hier der Quelltext:
Code:
FUNCTION ANY_ADD : VOID
VAR_INPUT
NumBytes: INT;
SrcAny: ANY;
END_VAR
VAR_IN_OUT
DestAny: ANY;
END_VAR
VAR_TEMP
tmpAny: ANY;
tmpAnyView AT tmpAny: STR_ANY;blen
byteAddress: INT;
END_VAR
BEGIN
tmpAny := SrcAny;
//Byte Adresse aus Any Pointer holen
byteAddress := DWORD_TO_INT(SHR(IN:= tmpAnyView.bytePointer, N:= 3));
//Byte Adresse um NumBytes erhöhen
byteAddress := byteAddress + NumBytes;
//Alte Addresse Löschen
tmpAnyView.bytePointer := tmpAnyView.bytePointer AND DW#16#FF000000;
//Neuen Addresse Einfügen
tmpAnyView.bytePointer := tmpAnyView.bytePointer OR SHL(IN := INT_TO_DWORD(byteAddress), N:= 3);
[COLOR=#ff0000]//Hier tritt das Problem auf!!!
DestAny := tmpAny;
[/COLOR]
END_FUNCTION
Da Any-Ausgangsparameter nicht mit Temporären Variablen versorgt werden können habe ich DestAny als Durchgangparameter deklariert.
Hier meine 1. Frage? Warum ist die Versorgung eines Any-Ausgangsparameters mit einem temporären Any-Pointer verboten??? Wenn ich dem Any-Ausgang bspw. einen temporären INT zuweise verstehe ich das ganze. Die Funktion beendet sich, der AnyPointer zeigt auf eine Stelle im L-Stack an der aber die INT-Variable nicht mehr vorhanden ist.
Aber warum wird die Versorgung mit einem lokalen ANY verboten. Weise ich einem Any-Pointer einen anderen Any-Pointer zu wird doch, jedes Feld des ANY einfach kopiert.
Kleines Beispiel:
Code:
VAR_TEMP[INDENT]tmpAny1: ANY;
tmpAny2: ANY;
intTest: INT;[/INDENT]
END_VAR
tmpAny1 := intTest;
tmpAny2 := tmpAny1;
tmpAyn2 zeigt in dem Beispiel genauso auf intTest wie tmpAny1. Beide ANY sind identisch von ihrem Inhalt.
Warum darf ich jetzt nicht DestAny := tmpAny; zuweisen?
DestAny ist auch nach dem Funktionsaufruf vorhanden, da dies ja eine Variable ist, die von einem anderen Baustein übergeben wurde. Jetzte kopiere ich den tmpAny eins zu eins nach DestAny. Das der tmpAny nach dem sich die Funktion beendet hat nun nicht mehr vorhanden ist, spielt doch keine Rolle. Ich habe ja nur den Inhalt des Pointers kopiert.
Die 2. Frage wäre dann: Weiß jemand wie man dies Einschränkung umgehen kann und ich den neuen ANY wieder aus meinem FC herausbekomme?
Grüße
Jason07
EDIT: Wichtig wäre noch mein UDT: STR_ANY
Code:
TYPE STR_ANY
STRUCT[INDENT]syntaxID: BYTE;
dataType: BYTE;
dataCount: WORD;
dbNumber: WORD;
bytePointer: DWORD;[/INDENT]
END_STRUCT;
Zuletzt bearbeitet: