Hallo,
1. Wenn eine Funktion mit ENDFCT abgeschlossen wird, sollte sie auch als solche definiert sein. Da hat sich Dirk aber sicher nur vertippt.
In der Tat - Tippfehler. Es muss natuerlich END heissen.
2. Wenn die Variable POSi in der Funktion deklariert wird, ist sie nur dort gültig. Wenn die Funktion beendet ist, verliert sie ihre Gültigkeit und kann nicht weiter verarbeitet werden. Zudem bin ich mir nicht sicher, ob das Programm so überhaupt kompiliert werden kann, da beim Aufruf der Funktion die mit Call by Reference referenzierte Variable noch nicht bekannt ist. Ich würde sie deshalb ebenfalls in der .dat deklarieren.
Da haben wir uns evtl. missverstanden.
POSi ist der formale Parameter in SetPos, der Call-By-Reference uebergeben werden soll.
Also z.B. so:
DECL POS aPos;
...
aPos = {POS:X 1.1,Y 1.2,Z 1.3, A 0.0,B 45.0,C 90.0}
SetPos(aPos, 1, 1, 17)
oder alternativ so:
SetPos({POS:X 1.1,Y 1.2,Z 1.3, A 0.0,B 45.0,C 90.0}, 1, 1, 17)
Der koennte eigentlich auch als :IN vereinbart werden, aber als "alter" C/C++-Programmierer weiss ich natuerlich, dass man Speicher und Zeit sparen kann, wenn man groessere Datenstrukturen (die in der Funktion/Prozedur nicht geaendert werden) als :OUT (also call-by-reference, sprich: per Speicher-Adresse) uebergibt.
Das DECL mag an der Stelle falsch sein. Das liegt daran, dass ich bis heute leider nicht verstanden habe, wann man es genau verwenden muss.
Das Handbuch ist leider auch ueberhaupt nicht hilfreich dabei. In meinen Beispielquellen habe ich es teils so und teils so gefunden.
Daher habe ich fuer mich beschlossen, dass DECL ein Relikt ist, dass man verwenden kann aber nicht muss.
Fuer Er-/Aufklaerung bin ich natuerlich (wie immer) sehr dankbar.
Da ihr (wie ich inzwischen feststellen konnte) groesstenteils ausgemachte Pragmatiker seid, und die Datenlisten aus irgendwelchen CAD-Tools bezieht, koennte man diese SetPos-Prozedur u.U. auch einfach ersatzlos streichen.
GetPos() sollte man uebrigens direkt ueberall dort verwenden koennen, wo urspruenglich die Variable stehen sollte.
z.B. so:
oder so:
FOR I1 = 1 TO 3
FOR I2 = 1 TO 2
FOR I3 = 1 TO 350
PTP GetPos(I1,I2,I3)
ENDFOR ; I3
ENDFOR ; I2
ENDFOR ; I1
Gruss, Dirk.