[ ST - Structured Text ] Pointer Casten

caret

Level-1
Beiträge
82
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Kann man in ST eigentlich Pointer Casten?

Folgendes Beispiel:
ptrVoid:pOINTER 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:
ptrMyFb:pOINTER 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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Pointer

Kann man in ST eigentlich Pointer Casten?

Folgendes Beispiel:
ptrVoid:pOINTER 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:
ptrMyFb:pOINTER 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

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.
 
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.

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.
 
Zurück
Oben