| |
|
|
| proc Name( [ Parameter, [ ...
Definiert eine Prozedur/ namens Name und für ihre (optionalen) Parameter die Namen der Variablen.
Prozeduren können Werte aller Variablentypen (einschließlich Arrays) per return zurückliefern.
Prozeduren können Über- und Unterladen werden: Parameter müssen nicht an eine Proc übergeben werden, auch dann nicht, wenn welche definiert sind. Übergibt man an eine Proc z.B. nur die Parameter a und b statt auch c, dann ist c in der Proc definiert aber hat den Wert null. So kann man auch innerhalb einer Proc erkennen, ob ein Parameter übergeben wurde oder nicht. Eine Proc ohne Return liefert immer null. Hinweis: Null ist nicht gleich 0!
In Infinity-Profan gibt es auch Procs in Procs, die inneren Procs sind nur in der Elternproc bekannt.
Wie bei XProfan und XPSE mit nProcs ist es in Infinity-Profan egal, ob Procs am Programmkopf oder Fuß definiert werden, da der Kompilierer ohnehin den Quelltext umsortiert und die tatsächlich verwendeten Funktionen an der passenden Stelle des Quelltextes verknüpft. So kann man sich oben im Programmkopf auf den eigentlichen Quelltext/ Ablauf konzentrieren und benötigte Procs am Fuß ablegen.
Die Beschränkung der Anzahl der übergebenen Parameter liegt theoretisch bei 9100, jedoch sollten so viele Parameter keiner Proc übergeben werden um Speicherprobleme zu vermeiden.
Parameterwerte werden byValue übergeben, byRef für Arrays mit vorangestelltem @ vor jedem Parameternamen. Auf Parameter, die nicht vom Typ Array übergeben werden, hat @ keinen Einfluss, jedoch wird die Prüfung für diesen Parameter auf eine Array-Kopie beim setzen des @-Zeichens abgeschaltet. Bei Funktionen, bei denen es auf höchste Geschwindigkeit ankommt, ist also eine Optimierung per @ für jeden Parameter mit einzubeziehen.
Hinweis: Zeiger auf eine Proc per @Procname
Beispiele:
Ebenso - dank Space-Operator - einfachere Syntax möglich:
Bei der Parameter-Definition kann auch gleich ein Vorwert übergeben werden, ein Wert der genutzt werden soll wenn der Parameter nicht mit übergeben wurde:
Selbe:
Das geht auch:
Selbe:
Hinweis zur Performance:
ist schneller als:
weil für alle Parameter die Prüfung auf ein Array wegfällt, dessen Daten ggf. für die Proc dupliziert würden.
Keywords: Prozeduren, Funktionenproc endproc |
|
|
| |
|
|
|
HofK | Wie ist die Art der Parameterübergabe vorgesehen?
Nur call by value? aber bei arrays? |
|
|
| |
|
|
|
| Bei Arrays und Procs die Referenz, andernfalls der Wert. |
|
|
| |
|
|
|
HofK | OK, kann man bei Bedarf auch einelementiges array a übergeben, dann aber a[0] immer "mitschleppen".
Was spricht (intern?) gegen proc beispiel(var a, var b, c, d) zur Übergabe "by reference"? |
|
|
| |
|
|
|
| Habe da eine Idee:
Wenn Du auf eine Variable byref zugreifen willst, dann deklariere sie doch einfach nicht in der Parameter-Beschreibung.
Das var in der Parameterbeschreibung könnte redundant verstanden werden und ist imho nicht eineindeutig, dann eher byref a, byref b, oder C-Style &a, &b...
Das kann ich natürlich einbauen, aber ich halte es für Doppelgemoppel wegen "Idee". |
|
|
| |
|
|
|
HofK | Für ein einzeln betrachtetes Programm nehme ich auch globale Variablen in der Prozedur.
Wenn ich mir aber Prozeduren als eigene "Features" zur Manipulation auch von Variablen schreibe, die ich in verschiedenen Programmen einsetzen möchte, gibt es ein Problem mit den Bezeichnern. Einmal heißt die Variable etwa meineSpezialzeit, in einem anderen Programm wegen der inneren Systematik aber x_time. Dann müsste man die globalen Variablen in der Prozedur extra umbenennen.
Man sollte sich die in der Prozedur benutzten globalen Variablen auch extra irgendwie dokumentieren, sonst übersieht man leicht etwas. Als Parameter mit z.B. proc bsp(ref a, ref b, c, d) sind sie dagegen deutlich sichtbar. (bei GFA war es damals "doppelt" var)
In dem Zusammenhang muss man aber sicher auch die Namensräume bei Include (siehe XProfan) betrachten. Ist alles eher keine Anfängerproblematik, mehr was für AndroidProfanXtended. |
|
|
| |
|
|
|
| Ja das verstehe ich, werde solch Syntax dann für spätere Versionen umsetzen. Ich finde das "ref" nicht schlecht, so werden wir das wohl machen. |
|
|
| |
|
|
|
| Ebenso - dank Space-Operator - einfachere Syntax möglich:
|
|
|
| |
|
|
|
| Bei der Parameter-Definition kann auch gleich ein Vorwert übergeben werden, ein Wert der genutzt werden soll wenn der Parameter nicht mit übergeben wurde:
Selbe:
Das geht auch:
Selbe:
|
|
|
| |
|
|
|
| Proc-Parameter Typ Array Übergabe nun byVal statt byRef: [...] |
|
|
| |
|
|