Pointer als Rückgabewert einer Funktion

kai86

Level-1
Beiträge
158
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
über sinn und unsinn lässt sich hier streiten.
Mich interessiert nur kann ich eine Funktion für Siemens und Beckhoff schreiben, welche mir als Rückgabewert einen Pointer gibt.

Funktion F_Adresse : Pointer
VAR_INPUT
IN : BYTE;
END_VAR
F_Adresse:= IN;
END_FUNCTION

Ja ich weiß die Funktion ist schwachsinn, aber das ist hier egal :)

Bei Siemens wird bei Funktionen ja sowieso nur die Adresse übergeben und die will ich wieder raus geben, aber nicht als VAR_Output, sondern als Rückgabewert der Funktion.
Bei Beckhoff sollte es mit ADR irgendwie gehen.

Mein Hauptproblem ist aber der Pointer als Rückgabewert.
 
Sollte normalerweise Funktionieren...
Wenn ich mal Zeit hab mach ich nen Test... Maybe heute Abend...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
bei mir kommt da ein fehler ungültiger oder fehlender funktionstyp bei siemens. in der hilfe habe ich aber auch noch nix gefunden, was Pointer als Rückgabewert verbietet.
 
Hinweis
  • <LI style="FONT-SIZE: 9pt">Bei den Datentypen ANY und POINTER gelten besondere Regeln bei der Versorgung.
  • Bei Durchgangsparametern nicht-elementaren Datentyps sind als Aktualparameter nicht erlaubt:
      • <LI style="FONT-SIZE: 9pt">FB-Durchgangsparameter
      • FC-Parameter

Hier ein kleiner Trick dass es doch mit dem Pointer am Ausgang klappt...

Code:
FUNCTION PointerTest : Void
TITLE = 'PointerTest'
VERSION : '1.0'
// KNOW_HOW_PROTECT
AUTHOR  : CG
NAME    : Test
FAMILY  : Test
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//+ Schnittstellendeklaration
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
CONST                                                   // KONSTANTEN
  
END_CONST    
VAR_INPUT                                               // EINGANGSVARIABLEN
END_VAR
VAR_OUTPUT                                              // AUSGANGSVARIABLEN
END_VAR
VAR_IN_OUT                                              // IN/OUT VARIABLEN
    Out                     : Pointer;
END_VAR    
VAR
END_VAR
VAR_TEMP                                                // TEMPORAERE VARIABLEN
END_VAR
LABEL                                                   // SPRUNGMARKEN
END_LABEL
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++                                                                                                    
//+ Bausteincode                                                                                                                                                                                              
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 

END_FUNCTION
 
IN/Out ist doch ein Rueckgabewert...

Etwas "unelegant" wäre da die Möglichkeit eines FB denn du immer mit der gleichen Instanz aufrufst...
 
naja das bringt mir nicht so viel.

wollte die Folgender maßen einbauen.

F_Test(pPointer := F_Adresse(Byte));

ist zwar sinnlos da ich die F_Adresse auch weglassen könnte, aber bei beckhoff steht da halt noch ADR() und um den Code gleich zu haben sollte da jetzt ne extra Funktion rein.

Ja ich weiß nicht sehr sinnvoll, aber so ist es :)
 
Ist nicht wirklich ein Integer sondern ein ByteArray beliebiger länge. Deshalb übergebe ich da den Pointer und die Länge, sowohl bei Beckhoff als auch bei siemens der einzigste unterschied ist das ADR() bei Beckhoff und das will ich weg haben bzw. bei beiden optisch gleich
 
Nö - nicht das ich wüsste. Dann übergib halt der F_Test den Pointer.
Ich arbeite gern mit der "Any" da du fast alles damit erschlagen kannst...
 
ich auch aber da ich für beide programmiere, muss das schon beides gleich sein. wird man nie in allen teilen erreichen aber in den Hauptkomponenten schon. mein letzter unterschied ist nur noch der ADR()
 
Zurück
Oben