wonderfulworld
Level-1
- Beiträge
- 114
- Reaktionspunkte
- 10
-> Hier kostenlos registrieren
Hi ich spiel mal wieder mit CoDeSys V3 (alias SoMachine Motion) rum und da kann ich mir momentan folgende Beobachtung nicht erklären.
Ich hab ein Interface definert:
Davon hab ich ein FB Element erstellt, das sich von diesem IElement ableitet. Die implementierte Methode sieht so aus:
Dann hab ich ein Array aus Element erstellt und so probiert auf die Elemente zuzugreifen.
Das seltsame ist jetzt, ich dass ich die Methode iElement.getOhterElement(index) mit einem gültigen Index immer aufrufen kann und keinen Laufzeitfehler bekomme, obwohl ich in der Methode getOtherElement das Element dereferenziere. Der Laufzeitfehler kommt erst, wenn ich im Programm newiElement.getTrue() aufrufe. Aber dort kommt es auch nicht immer zu einem Laufzeitfehler. Wenn ich mit dem Debugger durchsteppe, kann es sein das erst beim dritten oder vierten Aufruf der Fehler kommt. Könnt ihr mir sagen warum das so ist? Ich kann mir das garnicht erklären.
P.S. Dass das was ich hier beschrieben habe, ist nicht sauber und wahrscheinlich auch nicht zu empfehlen. (Element weiß ja nicht wieviele Teile sich im Array befinden.) Ich wollte eigentlich nur schauen ob es geht. Und das es jetzt manchmal geht und manchmal nicht irritiert mich doch ein bisschen, zumal ich eigentlich keine Erklärung habe warum es nicht geht. Meiner Meinung nach sollte es immer gehen.
Ich hab ein Interface definert:
Code:
INTERFACE IElement :
METHOD getOtherElement : IElement
VAR_INPUT
index : UINT;
END_VAR
METHOD getTrue: BOOL
VAR_INPUT
END_VAR
Davon hab ich ein FB Element erstellt, das sich von diesem IElement ableitet. Die implementierte Methode sieht so aus:
Code:
METHOD getOtherElement : IElement
VAR_INPUT
index : UINT;
END_VAR
VAR
element : Element;
test : BOOL;
END_VAR
element := THIS[index];
test := __QUERYINTERFACE(element, getOtherElement);
getOtherElement.getTrue(); (*der Aufruf funktioniert immer, hier gibt es keinen Laufzeitfehler*)
METHOD getTrue: BOOL
VAR_INPUT
END_VAR
getTrue := TRUE;
Dann hab ich ein Array aus Element erstellt und so probiert auf die Elemente zuzugreifen.
Code:
VAR
elements : ARRAY[0..10];
iElement : IElement;
newiElement : REFERENCE TO IElement; (*eigentlich müsste hier ja IElement langen, aber der Compiler schimpft wenn es nicht da steht*)
END_VAR
iElement := elements[0];
newiElement REF= iElement.getOtherElement(1);
newiElement.getTrue(); (*hier gibt es manchmal einen Laufzeitfehler*)
Das seltsame ist jetzt, ich dass ich die Methode iElement.getOhterElement(index) mit einem gültigen Index immer aufrufen kann und keinen Laufzeitfehler bekomme, obwohl ich in der Methode getOtherElement das Element dereferenziere. Der Laufzeitfehler kommt erst, wenn ich im Programm newiElement.getTrue() aufrufe. Aber dort kommt es auch nicht immer zu einem Laufzeitfehler. Wenn ich mit dem Debugger durchsteppe, kann es sein das erst beim dritten oder vierten Aufruf der Fehler kommt. Könnt ihr mir sagen warum das so ist? Ich kann mir das garnicht erklären.
P.S. Dass das was ich hier beschrieben habe, ist nicht sauber und wahrscheinlich auch nicht zu empfehlen. (Element weiß ja nicht wieviele Teile sich im Array befinden.) Ich wollte eigentlich nur schauen ob es geht. Und das es jetzt manchmal geht und manchmal nicht irritiert mich doch ein bisschen, zumal ich eigentlich keine Erklärung habe warum es nicht geht. Meiner Meinung nach sollte es immer gehen.