# [ ST - Structured Text ] Pointer Casten



## caret (16 Oktober 2009)

Kann man in ST eigentlich Pointer Casten?

Folgendes Beispiel:* ptrVoidOINTER TO T_VOID;
fbMyFb:FB_MY_FB;

ptrVoid:=ADR(fbMyFb);* ​T_VOID ist ein beliebiger selbst definierter Typ. ptrVoid kann ich nun zwar über ^ Operator dereferenzieren, aber natürlich nur in den Typ T_VOID. Klar ist jedoch, dass ich irgendwann aber auch in den Typ FB_MY_FB dereferenzieren will. Bisher gefundene Lösung:* ptrMyFbOINTER TO FB_MY_FB;

ptrMyFb:=ptrVoid;* ​Das funktioniert zwar (Pointer werden intern ja ALLE nur als DWORD gehandelt), ist aber eine umständliche Methode, da ich eine Zwischenvariable verwende. Ich bräuchte
eine CAST Operation wie sie in Hochsprachen üblich ist. 
Mal am C, bzw. C++  angelehnt, so etwas wie: (POINTER TO FB_MY_FB) ptrVoid


----------



## Neals (16 Oktober 2009)

Der Adress Operatio ist

ptrVoid^

in ST und äquivalent zu

ptrVoid->

in C++.


http://infosys.beckhoff.com/index.php?content=content/1031/tcplccontrol/html/tcplcctrl_pointer.htm


----------



## RobiHerb (16 Oktober 2009)

*Pointer*



caret schrieb:


> Kann man in ST eigentlich Pointer Casten?
> 
> Folgendes Beispiel:* ptrVoidOINTER TO T_VOID;
> fbMyFb:FB_MY_FB;
> ...



Ich habe mich mal zu dieser Problematik mit den Entwicklern von CoDeSys unterhalten. Aussage ist, dass in der Norm zwar Pointer angedacht sind aber nicht einheitlich von den Herstellen implementiert werden. DWORD ist also, sagen wir mal im speziellen Fall so, aber nicht garantiert. (Es hat auch in der Sprache C dieses Problem gegeben und mit der Einführung der neueren Prozessoren war das dann plötzlich nicht mehr so.)

Was fehlt, ist insbesondere die Pointer Arithmetik, was bedeutet : 
intPtr := intPrt+1? Zeigt der Pointer jetzt ein Byte oder ein Int weiter?

Ausprobieren und hoffen, das nächste Update macht es ganauso! Die Norm gibt es nicht her.

Das Casten wird übrigens auch sonst in CoDeSys durch Funktionsaufrufe  gemacht, so einen Aufruf könnte man sich dann für seinen eigenen Datentyp selber schreiben.


----------



## caret (16 Oktober 2009)

RobiHerb schrieb:


> Was fehlt, ist insbesondere die Pointer Arithmetik, was bedeutet :
> intPtr := intPrt+1? Zeigt der Pointer jetzt ein Byte oder ein Int weiter?



Wobei ich in meinem Beispiel keine Arithmetik verwende und damit auch auf der sicheren Seite bin, wenn mal auf 64Bit gewechselt werden sollte. Ich weise ja nur einer Adressvariable eine andere Adresse zu. Ob die Adressen 32Bit oder 64Bit oder was auch immer für ein Datentyp haben ist unerheblich. Generell stimmt es aber natürlich schon, dass Zeigerarithmetik wünschenswert wäre.



RobiHerb schrieb:


> Das Casten wird übrigens auch sonst in CoDeSys durch Funktionsaufrufe  gemacht, so einen Aufruf könnte man sich dann für seinen eigenen Datentyp selber schreiben.



Allerdings lässt sich der Rückgabewert einer Funktion auch nicht wieder direkt per ^ dereferenzieren, d.h. ich muss den wieder in eine Variable speichern und diese dereferenzieren. Da spare ich mir also leider auch nichts ein.


----------

