Step 7 Any-Pointer aus FC zurückgeben

Jason07

Level-1
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> 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:
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
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:

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:
Hallo,
Warum darf ich jetzt nicht DestAny := tmpAny; zuweisen?
Das liegt daran, weil dein IN_OUT-Any von "Aussen" kommt. Du würdest jetzt aber durch die Zuweisung den "äußeren" Zeger verschieben - das wird SCL wohl nicht mögen ...

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;
Was möchtest du damit zum Ausdruck bringen ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Genau das war mein Plan, den äußeren zeiger zu Verbiegen. Dachte das wäre genau der Sinn von Durchgangsparametern. Ähnlich wie die Referenzparameter in C. Anstatt mit Kopien arbeitet man mit dem Original. Schade das das nicht funktioniert. Bleibt nur die Möglichkeit den Any-Pointer als Strucktur zurückzugeben richtig?

Ich wollte damit nichts zum Ausdruck bringen. Ich hatte die Strucktur nur oben in meinem Quellcode genutzt, aber vergessen zu Deklarieren, deswegn hab ich diese noch nachgetragen.
 
Zurück
Oben