Darf man out-Parameter lesen?

Christoph Karl Walter Grein

Hier ein immer aktuelles Problem. Als ich vor einigen Jahren zum ersten Mal ein Thema für Ada Magica suchte, stieß ich darauf, und wie der Zufall es so will, ist es gerade wieder einmal virulent. Wie oft hat man sich schon darüber geärgert, dass formale out-Parameter (in Ada 83) nicht gelesen werden dürfen. Das geht im Laufe der Zeit so ins Blut über, dass man auch da Verrenkungen macht, wo es überhaupt nicht nötig ist. Drum sei es allen laut verkündet:

Wir haben zum Beispiel einen Haufen von Akten verschiedenster Art (einen diskriminierten Verbund), und für alle Varianten dieses Verbundes wollen wir Werte zwischenspeichern:

Na ja, so geht's. Wenn man fragt, warum mit dem falschen Modus in out oder so umständlich mit dem Schlüsselparameter mit statt nur einfach und richtig und symmetrisch zu Schreib

kriegt man unweigerlich zur Antwort: "Aber out-Parameter darf ich ja nicht lesen!"

Doch, man darf, zumindest gewisse Teile – für Felder sind es die Grenzen, für Verbunde ihre Diskriminanten und die Grenzen und Diskriminanten ihrer Komponenten, die gelesen werden dürfen, RM_83 6.2 (5)! Warum das so ist? Nun, wie sollte sonst jemals Folgendes funktionieren?

Jeder kennt Text_IO. Hier ist Text der aktuelle Parameter für den formalen out-Parameter Item, und im Rumpf von Get_Line geschieht etwa Folgendes:

Die Attribute Item'First [21], Item'Last [30], Item'Range können zum Lesen der Grenzen verwendet werden, wobei die Werte für unser Beispiel in Klammern angegeben sind. Die Lösung für unser Schlüsselproblem lautet folglich

und wir räumen den Tresor mit

Wenn allerdings noch nie etwas im Tresor lag, bekommen wir Constraint_Error. Was haben wir vergessen?

Lösung