REXX-Programmieranfänger hat Fragen

(DE) Anwendungen für Office, Multimedia und Spiele, Werkzeuge, Hilfsprogramme, etc
(EN) Applications for Office, Multimedia or Games, Tools, Utilities, e.g.
Antworten
ajunra
Beiträge: 375
Registriert: Mo 23. Dez 2013, 06:40
Wohnort: Insel Rügen

REXX-Programmieranfänger hat Fragen

Beitrag von ajunra »

Hallo Profis!
Ich muß erstmal etwas ausholen. Ich habe Anfang des Jahres meinen alten C64 wieder aus dem Keller befereit und nun wieder lauffähig gemacht. Nun - nachdem ich einige Zeit wieder mit GEOS hantiert habe - hatte ich mich nun wieder ans "blanke Eisen gewagt" und wieder ein Progrämmchen aus einigen Zeilen Commodore BASIC 2.0 reingehackt. Hach war das ein Gefühl - es ist zwar primitiv, aber läuft doch trotz eingerosteter Kenntnisse tatsächlich sofort! 8-)
Nun kam ich auf den Geschmack und dachte mir, daß ich ja auf diesem Wege mir mal REXX beibringen könnte. Erst in BASIC; dann in REXX wiederholen. Doch schon kamen die ersten Probleme.
Im Basic habe ich eine kleine Schleife programmiert welche eine Datenzeile Zeichen für Zeichen in eine Zeichenketten-variable ausliest und dann auch Zeichen für Zeichen auf dem Bildschirm ausgibt. Zwischendurch kommt es noch zu einer Verzögerungsschleife um es langsamer zu machen, aber die ist kein Problem.
Meine Frage bezieht sich auf die Datenzeilen und das auslesen. Unter Basic sieht das ungefähr so aus:

Code: Alles auswählen

1 REM C64-Basic 2.0
10 DATA d,a,s,-,i,s,t,-,t,e,x,t : REM Datenzeile
20 FOR Anfang = 1 to 12 : REM Beginn Ausleseschleife
30   READ Text$ : PRINT Text$; : REM Auslesen und ausgeben
40   FOR Zeit = 1 to 200 : NEXT Zeit : REM Verzögerungsschleife
50 NEXT Anfang
Gibt es in REXX ein Äquivalent zur 'DATA'/'READ' Kombination? Oder muss ich das ganze schon in Variablen fixieren; zb. Text$(1)="d":Text$(2)="a" etc? Oder muss ich eine Queue mit PUSH füllen? Wie geht sowas genau?

Entschuldigt daß das ganze Primitiv ist, aber irgendwo muss man ja mal Anfangen :oops:
(Vielleicht kann man das ganze auf der gleichen Art und Weise mit WDSibyl machhen...?)
Schöne Grüße von Deutschlands größter Insel
ajunra
Benutzeravatar
wilfried
Beiträge: 667
Registriert: Mo 23. Dez 2013, 18:26
Wohnort: Barsinghausen
Kontaktdaten:

Beitrag von wilfried »

Hallo Arne,

etwas vergleichbares für Data gibt es in REXX nicht.
Du kannst es mit einer Variable machen und die Zeichen für Zeichen ausgeben oder du versteckst die Daten in einer Kommentarzeile. Du kannst es natürlich auch über den Stack machen.

Hier mal das Beispiel über Variable. Wobei jedes Zeichen in einer neuen Zeile geschrieben wird. Der Nachbau von Print Text$; erfordert in Rexx Trickserei.
/* 1 REM C64-Basic 2.0 */
/* REXX für Arne */
/* 10 DATA d,a,s,-,i,s,t,-,t,e,x,t : REM Datenzeile */
Data = 'das-ist-text'
/* 20 FOR Anfang = 1 to 12 : REM Beginn Ausleseschleife */
do Anfang = 1 to Length(Data)
/* 30 READ Text$ : PRINT Text$; : REM Auslesen und ausgeben */
Text = substr(Data,Anfang,1); say Text
/* 40 FOR Zeit = 1 to 200 : NEXT Zeit : REM Verzögerungsschleife */
do 200
nop
end
/* 50 NEXT Anfang */
end
ajunra
Beiträge: 375
Registriert: Mo 23. Dez 2013, 06:40
Wohnort: Insel Rügen

Beitrag von ajunra »

Hallo Wilfried,
das hatte ich mit einzelnen Variablen gelöst. Deine Version finde ich aber eleganter. Hier der Code von mir:

Code: Alles auswählen

/*Das ist mein REXX-Test*/

A.1=D
A.2=a
A.3=s
A.4="-"
A.5=i
A.6=s
A.7=t
A.8="-"
A.9=T
A.10=e
A.11=x
A.12=t
do Text = 1 to 12
say A.Text
do a=1 to 200000 /* ein PC ist halt etwas schneller als der C64 */
nop
end
end
Wo wären wir aber ohne aber?
Wie bekommt man es mit REXX hin, daß say nicht jedes mal eine neue Zeile anfängt sondern hintereinander schreibt? In Basic hänge ich an den PRINT-Befehl einfach ein Semikolon (PRINT Text$;) und schon bleibt der Cursor hinter dem letzten Zeichen; schreibt den Text also in eine Zeile. Wenn man ein Komma anhängt (PRINT Text$,) wird das ganze wie mit einem Tabulator ausgegeben; es werden also 10 Zeichen übersprungen bzw. ausgelassen bei der Ausgabe. Eine Funktion wie in Basic der Strichpunkt (;) wäre schon schön. Wie sähe denn solche Trickserei aus?
Erst Corsorposition retten, dann Variable schreiben, dann gerette Cursorposition um eins nach rechts, dann cursor positionieren?
Schöne Grüße von Deutschlands größter Insel
ajunra
Benutzeravatar
wilfried
Beiträge: 667
Registriert: Mo 23. Dez 2013, 18:26
Wohnort: Barsinghausen
Kontaktdaten:

Beitrag von wilfried »

ajunra » Do 4. Jun 2015, 08:26 hat geschrieben: Wo wären wir aber ohne aber?
Wie bekommt man es mit REXX hin, daß say nicht jedes mal eine neue Zeile anfängt sondern hintereinander schreibt? In Basic hänge ich an den PRINT-Befehl einfach ein Semikolon (PRINT Text$;) und schon bleibt der Cursor hinter dem letzten Zeichen; schreibt den Text also in eine Zeile. Wenn man ein Komma anhängt (PRINT Text$,) wird das ganze wie mit einem Tabulator ausgegeben; es werden also 10 Zeichen übersprungen bzw. ausgelassen bei der Ausgabe. Eine Funktion wie in Basic der Strichpunkt (;) wäre schon schön. Wie sähe denn solche Trickserei aus?
Erst Corsorposition retten, dann Variable schreiben, dann gerette Cursorposition um eins nach rechts, dann cursor positionieren?
Zunächst noch ein Hinweis zur Verwendung von Stem-Variablen (A. in deinem Fall).
In A.0 solltest Du die Anzahl der Einträge führen. Dann kannst Du A.0 als Indexobergrenze nutzen und vermeidest "hardcoding" im Programm.

Zu den Tricksereien.
Ich habe wohl übersehen das in deinem speziellen Beispiel statt 'SAY Text' besser 'CALL charout Text' zu verwenden ist.
Um das VIO-Fenster und speziell die Cursorposition unter Kontrolle zu bekommen sollte man sich mit ANSI-Control-Character auskennen und die API Rexxutil nutzen (Syscls, Syscurpos fallen mir da spontan ein).
Ich zähle mich nicht zu den ANSI-Code-Experten. Wolfie ist da, glaube ich, fit.
Eine interessante Code-Sequenz wäre hier wohl "zurück an den Zeilenanfang, eine Zeile hoch"
Benutzeravatar
LotharS
Beiträge: 970
Registriert: So 29. Dez 2013, 20:07
Wohnort: Düsseldorf
Kontaktdaten:

Beitrag von LotharS »

Da hatte ich doch mal was (ne Pünktchen-Fortschrittsgrafik)...

Wie wäre es hiermit:

Code: Alles auswählen

/* aatext.cmd                                                 */
/* Aufrufbeispiel: aatext Das ist ein Text           */
parse arg textzeile
call RxFuncAdd 'SysLoadFuncs','REXXUTIL','SysLoadFuncs'
call SysLoadFuncs

do i = 1 to length(textzeile)
	a1 = substr(textzeile,i,1)
	yy = charout(, a1)
	call SysSleep 0.5  /* oder irgendviele Sekunden... */
	end
say ' ' 
exit
Viel Spaß!
ajunra
Beiträge: 375
Registriert: Mo 23. Dez 2013, 06:40
Wohnort: Insel Rügen

Beitrag von ajunra »

Toll Lothar, damit kann ich ja (fast) was anfangen! Genau so sollte es funktionieren!
Das fast bezieht sich auf den Befehl charout. Irgendwie kann ich mit der Beschreibung in der online-Hilfe nichts anfangen.
Wie funktioniert der? Bei allen andern Zeilen aus Deinem Listing sehe ich durch (= verstehe die Syntax); bei charout allerdings schwarz. Wozu die variable yy?
Nur zum besseren Verständis/zur Bestätigung:
das 'end' nach der Pause sollte doch eigentlich nicht eingerückt sein, denn es gehört doch zum 'do i=1..', oder?
Schöne Grüße von Deutschlands größter Insel
ajunra
Tom

Beitrag von Tom »

Darf ich das REXX Reference SummaryHandbook von Dick Goran empfehlen empfehlen? Zu downloaden von edm2 punkt com
Benutzeravatar
LotharS
Beiträge: 970
Registriert: So 29. Dez 2013, 20:07
Wohnort: Düsseldorf
Kontaktdaten:

Beitrag von LotharS »

Dar Befehl CHAROUT gibt etwas aus...
Dieses "etwas" kann eine konstante Zeichenkette (eingeschlossen in ' oder ") oder numerisch sein, oder eine Variable (so wie im Beispiel) oder ein Ausdruck. Gefolgt von bis zu 3 Parametern: ziel, quelle, start. Beim Schreiben merkt sich der Befehl immer die nächste Position.
- "ziel" kann eine Ausgabedatei sein (z.B. "C:\tralala") oder leer (dann - wie hier - auf STDOUT dh. OS/2-Fenster)
Folgen weitere Parameter, dann muss erst ein Komma folgen (wie hier).
- "quelle" war meine Variable a1.
- "start" mit Komma vorweg = die Startposition, ab der geschrieben werden soll (1 = Dateianfang). Fehlt dieser Parameter, so schreibt er (wie hier) bei der aktuellen Position weiter. Bei Ausgabe auf einem sog. "Gerät" wie STDOUT ist dieser Parameter sowieso nicht erlaubt.
- ein Aufruf ohne quelle und start schließt nur die Ausgabedatei.

Zur Variable yy: die REXX-Funktionen lassen sich auf 2erlei Weise aufrufen: Entweder mit
- CALL <funktion> <Parameters> oder
- ergebnis = <funktion>(<Parameters>)
Im ersteren Fall landet das Ergebnis in einer Variable "result".
Im Falle Charout wäre das ergebnis = Anzahl der (ausnahmsweise) nicht mehr schreibbaren Zeichen, i.d.R. also = 0. Im meinem Beispiel sehe ich ja das Resultat, und mein "yy" steht nur formal da, hätte auch "rc" lauten können oder "n" oder sonstwie.

Das Einrücken von "end" und überhaupt ist in Rexx nur (sinnvolle!) Optik. Ich rücke ein "end" gerne mit ein, andere machen's gerne anders. Btw: Ich hätte sogar alles in eine lange Zeile packen dürfen, die Befehle durch Semikolon getrennt ....: bei einzelnen kleinen Befehlsgruppen manchmal nur platzsparend (z.B. der Art " i = 0; j = 0; k= 0 "), aber sonst stilistisch grober Unfug. :)

Hier noch eine Variante 2

Code: Alles auswählen

/* aatext.cmd      */
/* Aufruf: aatext  */
say 'Tippe einen Text ein, und ENTER'  
parse pull textzeile

call RxFuncAdd 'SysLoadFuncs','REXXUTIL','SysLoadFuncs'
call SysLoadFuncs

do i = 1 to length(textzeile)
 	a1 = substr(textzeile,i,1)
	call charout , a1
	call SysSleep 1
 	end
say ''

exit
Damit würden die Textzeilen niedlich untereinander stehen, erst wie eingetippt und darunter der "Sekundenzeiger" ;)
ajunra
Beiträge: 375
Registriert: Mo 23. Dez 2013, 06:40
Wohnort: Insel Rügen

Beitrag von ajunra »

Ah, Danke Lothar!
Jetzt glaube ich es kapiert zu haben; danke für Deine Ausführungen!
Mit Beispielen kapiert man es eben doch besser. Ich werde wohl kommende Woche weitermachen, das Wochenende ist schon ausgebucht. Aber eure Hilfe hat mich schon weiter gebracht.
Schöne Grüße von Deutschlands größter Insel
ajunra
Benutzeravatar
LotharS
Beiträge: 970
Registriert: So 29. Dez 2013, 20:07
Wohnort: Düsseldorf
Kontaktdaten:

Beitrag von LotharS »

ajunra » Fr 5. Jun 2015, 10:16 hat geschrieben: Mit Beispielen kapiert man es eben doch besser.
Abgesehen von der o.g. wahren Fundgrube EDM/2 für "alles": Mein Lehrbuch war damals "Das REXX-Buch für OS/2" von Heinz Wolek, auf deutsch, mit - jedenfalls für mich weiterhin - hilfreichen Beispielen und (zunehmend ;) ) verständlicher Sprachreferenz; nutze es immer noch gern und sieht entsprechend gebraucht aus 8-) Mag sein, dass es das Buch noch irgendwo gibt. In der Zwischenzeit waren bloß wenige spezielle RexxUtil-Funktionen hinzugekommen und/oder anderswo dokumentiert, nur so nebenbei.
Viel Freude mit Rexx, und immer her mit Fragen :!:
Benutzeravatar
ARoederer
Beiträge: 385
Registriert: Fr 27. Dez 2013, 17:25
Wohnort: Hamburg / Germany
Kontaktdaten:

Beitrag von ARoederer »

Moin ajunra
LotharS » Fr 5. Jun 2015, 15:47 hat geschrieben:Mein Lehrbuch war damals "Das REXX-Buch für OS/2" von Heinz Wolek
Wenn Du Interesse hast, schreib mir mal deine Adresse per PM.
Ich hab von dem Buch noch eine Ausgabe übrig.

Andreas
ajunra
Beiträge: 375
Registriert: Mo 23. Dez 2013, 06:40
Wohnort: Insel Rügen

Beitrag von ajunra »

Danke für das Angebot Andreas! Ich habe allerdings gestern meine gesammelten Werke durchgesehen und dieses Buch 'Das REXX-Buch für OS/2'(Erweiterte und aktualisierte Neuauflage mit Funktionen für Warp 4) auch gefunden - hab's also hier. Trotzdem Danke für das Angebot!

@LotharS: Du hast Recht. Das Buch scheint auch gut zu erklären! Danke für den Tip! Aber ich werde wohl bald trotzdem 'dämliche' Fragen stellen; ich kenne mich doch :oops:
Schöne Grüße von Deutschlands größter Insel
ajunra
Benutzeravatar
wilfried
Beiträge: 667
Registriert: Mo 23. Dez 2013, 18:26
Wohnort: Barsinghausen
Kontaktdaten:

Beitrag von wilfried »

ajunra » Mi 10. Jun 2015, 09:59 hat geschrieben: @LotharS: Du hast Recht. Das Buch scheint auch gut zu erklären! Danke für den Tip! Aber ich werde wohl bald trotzdem 'dämliche' Fragen stellen; ich kenne mich doch :oops:
Und dass ist auch gut so! Es wird hier sonst viel zu ruhig. ;)
ajunra
Beiträge: 375
Registriert: Mo 23. Dez 2013, 06:40
Wohnort: Insel Rügen

Beitrag von ajunra »

Das ganze oben (charout) hat mich mit seinen Parametern mal zu der Frage geführt: Wie spricht man eigentlich USB-Geräte (Schnittstellen) mit REXX an? STDOUT ist - solange nicht verbogen - der Bildschirm. Dann gibt es noch Drucker etc. Doch wie spricht man mit dem USB-Anschluss? Brauche ich da dann Treiber und/oder Bibliotheken von Wim Brul? In der schlauen Literatur fand ich bezüglich REXX<->USB leider nichts.

Ich habe im Moment gerade keine konkreten Ziele, aber interessant wäre das schon. Dann könnte man z.b. etwas für Experimentierplatinen programmieren... Beim C64 geht sowas ja über den User-Port. So sind da z.b. leicht 8-Kanal Relais-Karten realisierbar.
Schöne Grüße von Deutschlands größter Insel
ajunra
Benutzeravatar
wilfried
Beiträge: 667
Registriert: Mo 23. Dez 2013, 18:26
Wohnort: Barsinghausen
Kontaktdaten:

Beitrag von wilfried »

Um von REXX aus USB anzusprechen bedarf es eines sogenannten Functionpackage. Das ist eine spezielle DLL die Aufruf- und Rückgabedaten im Zeichenkettenformat verarbeiten bzw. liefern kann.
Wim hat ja etwas für den Zugriff auf USB gebaut, das muss man in eine REXX-verträgliche Hülle packen und dann auch noch wissen wie man damit umgeht. ;)
Tom

Beitrag von Tom »

LotharS » Fr 5. Jun 2015, 15:47

Abgesehen von der o.g. wahren Fundgrube EDM/2 für "alles": Mein Lehrbuch war damals "Das REXX-Buch für OS/2" von Heinz Wolek, auf deutsch, mit - jedenfalls für mich weiterhin - hilfreichen Beispielen und (zunehmend ;) ) verständlicher Sprachreferenz; nutze es immer noch gern und sieht entsprechend gebraucht aus 8-) Mag sein, dass es das Buch noch irgendwo gibt. In der Zwischenzeit waren bloß wenige spezielle RexxUtil-Funktionen hinzugekommen und/oder anderswo dokumentiert, nur so nebenbei.
Viel Freude mit Rexx, und immer her mit Fragen :!:
Das Buch "Das REXX-Buch für OS/2" von Heinz Wolek wird jetzt angeboten auf eBay (item 271929903837) (nein: ich bin nicht der Verkaufer!)
Antworten