-> 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_FUNCTIONDa 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: 
			
		
	
								
								
									
	
		
			
		
		
	
	
	
		
			
		
		
	
								
							
							 
	 
  
  
 
		 
 
		