R&D Steuerungstechnik

Übergabe Variablenfeld an Unterprogramm

Beitrag 21.01.2025, 16:19 Uhr
mrmojo1
Level 1 = Community-Lehrling
*
Hallo zusammen,

ich versuche gerade ein Array von meinem Hauptprogramm an ein Unterprogramm Call-By-Value zu übergeben und bekomme die Rückmeldung "unerlaubter Array-Index1". Ich konnte im HB-AV auch nicht eindeutig herauslesen ob das überhaupt funktioniert. Unter Call-By-Reference wird zumindest knapp angedeutet, dass die aus dem HP übergebenen Variablen im Unterprogramm als Array zusammengefasst werden können...

Die Variablen sind nicht in der UGUD definiert und das Unterprogramm liegt auch nicht unter "Herstellerzyklen".

Hauptprogramm:

N10 EXTERN KREISDAT(REAL,REAL,REAL,REAL,REAL,REAL)
N20 DEF REAL PKT[3,2],ERG[3]
... ;(Wertzuweisung Variabeln)
N110 KREISDAT(PKT[3,2]) ; Unterprogrammaufruf

Unterprogramm:

N10 PROC KREISDAT(REAL _PKT[3,2]) ;SBLOF
N30 DEF BOOL STATUS ;Variable für Status
N40 IF $P_SUBPAR[7]==TRUE
N50 STATUS = CALCDAT(_PKT,4,ERG) ;Aufruf der ermittelten Kreisdaten
;<Status>=CALCDAT(<Kreispunkte>[<Anzahl>,<Art>],<Anzahl>,<Ergebnis>)
N60 ELSE
N70 STATUS = CALCDAT(_PKT,3,ERG) ;Aufruf der ermittelten Kreisdaten
N80 ENDIF
N90 IF STATUS == FALSE GOTOF ERROR
N100 RET
N110 ERROR:
N120 MSG("Punkte liegen nicht auf einem gemeinsamen Kreis")
N130 G4 F2
N140 GOTOB ERROR

Bei N110 im Hauptprogramm kommt die besagte Fehlermeldung. Ich vermute, dass versucht wird nicht das Feld, sondern die Einzelvariable PKT[3,2] zu übergeben. Die Arrayposition gibt es natürlich in beiden Dimensionen nicht weil PKT[2,1]aus dem Feld die letzte Variable ist.

Habt Ihr dazu eine Idee?

Gruß
Mojo

Der Beitrag wurde von mrmojo1 bearbeitet: 21.01.2025, 16:20 Uhr
   
Beitrag 21.01.2025, 16:28 Uhr
mrmojo1
Level 1 = Community-Lehrling
*
Ergänzend muss ich noch erwähnen, dass folgender Aufun im Hauptprogramm auch nicht funktioniert hat:

N110 KREISDAT(PKT)

da kam die Fehlermeldung "Feld PKT Element nicht vorhanden"... die Variablen sind aber in der LUD geschrieben.

Der Beitrag wurde von mrmojo1 bearbeitet: 21.01.2025, 16:28 Uhr
   
Beitrag 22.01.2025, 07:41 Uhr
Tobe87
Level 2 = Community-Facharbeiter
**
Moin,

KREISDAT(PKT[3,2]) <-- Das geht so nicht. Alle Parameter einzeln übergeben.
KREISDAT(PKT[0,0],PKT[0,1],PKT[1,0],PKT[1,1],PKT[2,0],PKT[2,1]) <-- So

PROC KREISDAT(REAL _PKT[3,2]) <-- Hier das selbe. Alle einzeln mit dem Typ.
N10 PROC KREISDAT(REAL _PKT0,REAL _PKT1,REAL _PKT2,REAL _PKT3,REAL _PKT4,REAL _PKT5) <-- So

Gruß
Tobi
   
Beitrag 22.01.2025, 07:42 Uhr
SeanClaud
Level 3 = Community-Techniker
***
Hallo,

hab ich so noch nicht probiert aber in der Doku steht folgendes:
PROC <ProgName> (VAR <Array1Type> <Array1Name> [<m>,<n>,<o>], VAR <Array2Type> <Array2Name> [<m>,<n>,<o>], ...)
Felder mit variabler Länge
​Mit Feldern unbestimmter Feldlänge als Formalparameter können Unterprogramme Felder variabler Länge bearbeiten. Dazu wird bei der Definition z. B. eines zweidimensionalen Feldes als Formalparameter die Länge der 1. Dimension nicht angegeben. Das Komma aber muss geschrieben werden.
​Beispiel:
PROC <ProgName> (VAR REAL <ArrayName>[ ,5])

ev. so probieren:
KREISDAT(PKT[ ,2]) ; Unterprogrammaufruf
oder so?
KREISDAT(PKT[ , ]) ; Unterprogrammaufruf

würde mich aber auch interessieren ob und wie das funktioniert smile.gif

LG
   
Beitrag 22.01.2025, 07:54 Uhr
Tobe87
Level 2 = Community-Facharbeiter
**
ZITAT(SeanClaud @ 22.01.2025, 07:42 Uhr) *
Hallo,

hab ich so noch nicht probiert aber in der Doku steht folgendes:
PROC <ProgName> (VAR <Array1Type> <Array1Name> [<m>,<n>,<o>], VAR <Array2Type> <Array2Name> [<m>,<n>,<o>], ...)
Felder mit variabler Länge
​Mit Feldern unbestimmter Feldlänge als Formalparameter können Unterprogramme Felder variabler Länge bearbeiten. Dazu wird bei der Definition z. B. eines zweidimensionalen Feldes als Formalparameter die Länge der 1. Dimension nicht angegeben. Das Komma aber muss geschrieben werden.
​Beispiel:
PROC <ProgName> (VAR REAL <ArrayName>[ ,5])

ev. so probieren:
KREISDAT(PKT[ ,2]) ; Unterprogrammaufruf
oder so?
KREISDAT(PKT[ , ]) ; Unterprogrammaufruf

würde mich aber auch interessieren ob und wie das funktioniert smile.gif

LG



wow.gif
Und wieder mal der Beweis.
Ich sollte doch mal wieder öfter in der Doku lesen. thumbs-up.gif
   
Beitrag 29.01.2025, 11:45 Uhr
mrmojo1
Level 1 = Community-Lehrling
*
ZITAT(SeanClaud @ 22.01.2025, 08:42 Uhr) *
hab ich so noch nicht probiert aber in der Doku steht folgendes:
PROC <ProgName> (VAR <Array1Type> <Array1Name> [<m>,<n>,<o>], VAR <Array2Type> <Array2Name> [<m>,<n>,<o>], ...)


Das ist mir im HB auch aufgefallen. Dieser Hinweis steht aber nur unter "Call-By-Reference", im Kapitel für "Call-By-Value" steht das nicht. Eine Info ob das nun für beider Übergabevarianten gilt hielt der Ersteller der Doku wohl für unwichtig....

Ich habe momentan leider andere Prioritäten und muss das aktuelle Thema aufschieben. Außerdem komme ich momentan an keine Anlage. Der Simulation über Sinutrain traue ich nicht weil ich nur die freie Version habe und dort das MD11120
"LUD_EXTENDED_SCOPE" nicht gesetzt ist. Ich bin mir nicht sicher ob das Auswirkungen auf die Tests hat...

Ich melde mich auf jeden Fall wenn es was neues zu berichten gibt.
   
Beitrag 30.01.2025, 21:01 Uhr
Hexogen
Level 7 = Community-Professor
*******
ZITAT(SeanClaud @ 22.01.2025, 09:42 Uhr) *
Hallo,

hab ich so noch nicht probiert aber in der Doku steht folgendes:
PROC <ProgName> (VAR <Array1Type> <Array1Name> [<m>,<n>,<o>], VAR <Array2Type> <Array2Name> [<m>,<n>,<o>], ...)
Felder mit variabler Länge
​Mit Feldern unbestimmter Feldlänge als Formalparameter können Unterprogramme Felder variabler Länge bearbeiten. Dazu wird bei der Definition z. B. eines zweidimensionalen Feldes als Formalparameter die Länge der 1. Dimension nicht angegeben. Das Komma aber muss geschrieben werden.
​Beispiel:
PROC <ProgName> (VAR REAL <ArrayName>[ ,5])

ev. so probieren:
KREISDAT(PKT[ ,2]) ; Unterprogrammaufruf
oder so?
KREISDAT(PKT[ , ]) ; Unterprogrammaufruf

würde mich aber auch interessieren ob und wie das funktioniert smile.gif

LG


Call By Referenz liest und beschreibt bzw. gibt den Wert zurück in die Variable die über die Call By Referenz definiert wird.
Es wird auch keine Werte übertragen sondern eine Variable definiert in die werte geschrieben oder gelesen werden.

QUELLTEXT
proc rechne(var real ergebnis[ , ], real wert 1, real wert2)

ergebnis[1,1]=wert1+wert2
ergebnis[0,1]=ergbnis[1,1]
ergebnis[2,1]=wert1*ergebnis[0,1]

ret


hier werden die Variablen direkt aus dem Unterprogamm gehandhabt

QUELLTEXT
def real ergebnis[5,10]

rechne(ergebnis[5,10],12,18.555)


msg("ergebnis 1="<<ergebnis[1,1])
msg("ergebnis 2="<<ergebnis[0,1])

usw.

also kann ich die call by referenz auch als ersatz für das "übliche" >>> return(varibale) <<< wie in python nutzen.
und auch auf alle variablen zugreifen.


--------------------
Schaut doch mal rein:
Mein Youtube Kanal


Anwendungen, Zyklen, CAD/CAM





-----------------------------------------------------------------------------------------------------------------------------
   
1 Besucher lesen dieses Thema (Gäste: 1)
0 Mitglieder: