Auch Pointer lösen das Problem nicht, da an das aufgerufene Programm sowieso nur Pointer übergeben werden.

Aufrufparameter stellen eine Konvention dar, die genauestens einzuhalten ist.
Eine Laufzeitprüfung über den Typ gibt es leider nicht.

Bei CLP's wird zumindest die Anzahl der Parameter festgelegt (siehe DSPPGM), bei HLL's (COBOL, RPGLE) noch nicht mal das. Hier kann man zwischen 0 und 255 Parametern übergeben, egal ob sie gebraucht werden oder nicht.

Eine Typisierung bzw. Typprüfung wird nicht unterstützt, man kann nocht nicht mal die Art der Definition (Zeichen, Numerisch, usw.) per Programm prüfen außer per MONMSG (bzw. Monitor-Anweisung) eine MCH-Überwachung zu programmieren.

Ich habe mir des öfteren Wrapper-CLP's geschrieben, die die Parameter nur mit CHAR(1) definiert haben, um dann die "Adressen" der Parameter an die nächste Ebene zu üergeben.

CMD's sind eine gute Lösung dieses Problem zu lösen, wenn das Programm per Kommandozeile oder QCMDEXC aufgerufen wird.
Zumal sich mit optionalen Parametern dann Defaults übergeben lassen.

Aufgerufen wird dann nicht das Kommando CALL sondern das per CRTCMD erstellte Kommando (genau wie alle anderen Kommandos des Systems).