[Allegro] Wieder mal: #nn. ++ p>X m>Y mit Flex-Mitteln

Sibylle Koczian Sibylle.Koczian at T-Online.de
Mo Jun 4 13:48:00 CEST 2007


Lieber Herr Allers, liebe Liste,

ich hab' natürlich doch nicht die Finger von diesem Flex lassen können, er ist zu interessant.

"Allers Heinrich" <Allers at goethe.de> schrieb:
> Zugegeben, das Verfahren verdient es, etwas besser kommentiert und dadurch transparenter zu werden; ich versuch's mal:
> 
> 
>   // Kommentierung erfolgt bezogen auf den allerersten 
>   // Durchlauf der Schleife ':anfang\...\jump anfang':
> var "96"\=   // internen Zähler mit 96 vorbesetzen
> :anfang\+1
>   // Jetzt hat interner Zähler Z den Wert 97:
>   // 97 ist der ASCII-Code des Zeichens 'a'!
> var Z\if >122 end  //122 ist Ascii-Code von 'z'
> var ' "#30" ' Z
>   // Jetzt stehen in der iV genau die 
>   // 8 Zeichen:  "#30" 97
>   // 8 Zeichen - d.h. auch die Hochkommata stehen so drin in der iV!
> var  // Jetzt stehen die 4 Zeichen #30a in der iV

Das war der Stolperstein: Zu "var" allein steht in der Dokumentation ja nur: 
"Fehlt cstring, wird statt dessen der Inhalt der  iV  interpretiert, d.h. es entsteht daraus ein neuer Inhalt in der iV."
Dass zu dieser Interpretation eine Umwandlung von Zahlen in die zugehörigen ASCII-Zeichen gehört (immer? unter welchen Umständen bzw. wann nicht?), muss einem ja auch erst mal gesagt werden.

> ins #ux2  // Dieser Befehl ist nicht essentiell!
>    // Er dient nur zum Festhalten der Kategoriebezeichnung,
>    // um sie bei der Verarbeitung im UP aktion zur Verfügung
>    // zu haben.
> var   // Da derzeit der Inhalt der iV #30a ist, ist dieser Befehl
>    // äquivalent zu 'var #30a', d.h. hinterher steckt der Inhalt von
>    // #30a in der iV.
> if not "" perf aktion   // Mache UP aktion nur, wenn #30a nicht leer ist! 
> jump anfang
> :aktion\ins #ux1   // #ux1 ist aktueller Kategorieninhalt
> var "Mit >>" #ux2 #ux1 "<< machen, was man will"\mes
> return
> 
> 
> > Mit 32..127 (oder 255?) könnte man Grundkategorie und _alle_ legalen
> > Wiederholungszeichen erfassen, das passt dann insbesondere auch, wenn
> > M2 in der Konfiguration
> > steht - wie im Standard vorgesehen.
> 

Dachte ich. Dass man dabei auch illegale Wiederholungszeichen mit erwischt, ist aber alles andere als harmlos: Ist die Grundkategorie belegt, dann stürzt A99 ab, wenn die Schleife zum ASCII-Code 40 (das ist "(") kommt. Man kann das mit diesem Flex ohne Schleife sehen:

var "40"
=
var Z
var ' "#20" ' Z
message
var
message
var
message

Vor Ausführung der dritten "message"-Anweisung verabschiedet sich A99 und Microsoft möchte das Problem gemeldet bekommen. In diesem Test-Flex habe ich die #20 benutzt, weil in der Demo-Datenbank die #30 meist (immer?) fehlt und nur #30a... belegt sind. Das ist aber völlig egal, man kann ebenso gut irgendeinem Satz eine #30 zusätzlich verpassen.

Die Klammer ist das erste Zeichen, das diesen Absturz auslöst, ob sie das einzige ist, habe ich nicht probiert und würde es erst einmal bezweifeln. Das heißt, dass die Angelegenheit um einiges trickreicher wird, wenn die Grundkategorie mit bearbeitet werden soll und vor allem, wenn auch Ziffern und/oder Großbuchstaben als Wiederholungszeichen in Frage kommen. Man hätte u.U. neben der Bearbeitung der Grundkategorie noch drei Schleifen, die im Prinzip das Gleiche tun, oder aber zwei bis drei Extra-Abfragen, um die Bereiche mit verbotenen Folgezeichen abzufangen.

Da neige ich doch eher dazu, eine Ansprechmöglichkeit für die "nächste Kategorie, die mit #nn anfängt" auf die Wunschliste zu setzen (sprich, die geschilderten Komplikationen vor unsereinem zu verstecken und mittels C++ schneller zu bearbeiten).

> ###
> 
> Unabhängig von der eigentlichen Aufgabe bleibt für mich interessant, warum das Verfahren zusammenbricht, wenn man 
> var ' "#30" ' Z    ersetzt durch   var '"#30" ' Z   ersetzt. (Dann steht nämlich in der iV im ersten Schleifendurchlauf nicht 
> "#30" 97, sondern nur #30" 97).
> 

Das wird durch "var" aber trotzdem in #30a umgewandelt. Warum das vordere '"' wegfällt, frage ich mich allerdings auch vergeblich.

Beste Grüße,
Koczian

-- 
Dr. Sibylle Koczian 
Fasanenstrasse 12  
D-82293 Mittelstetten 




Mehr Informationen über die Mailingliste Allegro