ndr-nkc.de ndr-nbc.de
  
Startseite
News
 
NDR-NKC
Geräte Z80
Geräte 68000
Geräte 8088
 
NKC Emulator
 
Z80 Section
Baugruppen
ROM's
Software
68000 Section
Baugruppen
ROM's
PASCAL/S
Software
CP/M 68K
8088 Section
Baugruppen
Downloads
 
Bussysteme
Stromversorgung
Input / Output
Grafikkarten
Speicherkarten
Massenspeicher
Weitere Baugruppen
 
Projekte
 
Dokumentation
Datenblätter
Glossar
Portraits
Links

Impressum

 

Auswertung von Kommandozeilen-Parametern

Unabhängig davon, ob CBASIC zur Umsetzung kleiner Tools oder größerer Programme genutzt wird, ist es sinnvoll Parameter direkt beim Aufruf festzulegen anstatt sie interaktiv abzufragen. In diesem Beitrag wird ein allgemein verwendbarer Weg beschrieben, wie mehrere auch optionale Parameter beim Aufruf eines Programms analysiert werden können.

Weitere Beiträge

Vor- und Nachteile des CBASIC Compilers
Sprachumfang des CBASIC-Compilers
Definieren eigner Funktionen und Prozeduren
Arbeiten mit Dateien

Erkennung von Kommandozeilen-Parametern

Auf die beim Aufruf des Programms zusätzlich angegebenen Parameter kann über die CBASIC Funktion COMMAND$ zugegriffen werden. Der erste Schritt besteht darin, die eventuell angegebenen Parameter zu separieren. Im folgenden Beispiel müssen mehrere Parameter jeweils durch ein Leerzeichen getrennt werden.

REM Erkennung von Kommandozeilenparametern

      pcount% = 0 : REM Anzahl erkannter Parameter
      pmin% = 2   : REM Minimale Anzahl Parameter
      pmax% = 5   : REM Maximale Anzahl Parameter
      dim p$(pmax%) : REM Speicher fuer Parameter  

      lchar$ = " "
      for p% = 1 to len(COMMAND$)  
         char$ = mid$(COMMAND$, p%, 1)       
         if char$ <> " " and lchar$ = " " then pcount% = pcount% + 1
         if pcount% > pmax% then pcount% = pmax% : goto 100
         if char$ <> " " then p$(pcount%) = p$(pcount%) + char$
         lchar$ = char$
      next p%

Auswertung von Kommandozeilen-Parametern

Nachdem die angegebenen Parameter separiert und in einem Array gesammelt sind, kann die Auswertung beginnen. An dieser Stelle wird nur ein rudimentärer Test umgesetzt. Bei vielen optionalen Parametern kann die Auswertung deutlich komplizierter ausfallen.

100   REM Beispielauswertung der Parameterliste

      infile$ = ""
      outfile$ = ""
      for p% = 1 to pcount%
         if p$(p%) = "-I" and p% < pcount% then infile$ = p$(p%+1)  
         if p$(p%) = "-O" and p% < pcount% then outfile$ = p$(p%+1)  
      next p%
      if infile$ <> "" and outfile$ <> "" then goto 200               
      print "Aufruf: PARAMS -I infile -O outfile" : goto 9999

Jetzt kann der reguläre Programmcode beginnen.

REM Weiterer Programmcode

200   print "INFILE  = " + infile$
      print "OUTFILE = " + outfile$

9999  end

Ein einfacheres Beispiel

Bei wenigen nicht optionalen Parametern kann die Auswertung der Kommandozeile und die Erkennung von Fehlern deutlich einfacher ausfallen. Im folgenden Beispiel werden als Parameter 2 Zahlen erwartet um einen Bereich anzugeben. Dabei muss die zweite Zahl größer als die erste sein.

Die Parameterauswertung beschränkt sich auf die ersten 4 Zeilen, der restliche Code dient zur Ausgabe aller Primzahlen in dem durch die beiden Parameter angegebenen Zahlenbereich.

REM Programm zum Berechnen aller Primzahlen im angegebenen Bereich
      split% = match(" ", COMMAND$,1)
      if split% = 0 then goto 9998
      aktpz = val(left$(COMMAND$,split%))
      maxpz = val(right$(COMMAND$,len(COMMAND$)-split%))           

      if aktpz < 0 then goto 9998 
      if maxpz < aktpz then goto 9998
      if aktpz/2 = int(aktpz/2) then aktpz = aktpz + 1
      cnt = 0  
      if aktpz < 3 then print "2 "; : cnt = 1    

100   rem Naechste Primzahl testen
      aktpz = aktpz + 2
      if aktpz > maxpz then goto 400
      aktdiv = 1

200   rem Naechten Teiler testen
      aktdiv = aktdiv + 2
      if aktdiv * aktdiv > aktpz then goto 300
      if aktpz/aktdiv = int(aktpz/aktdiv) then goto 100
      goto 200

300   rem Primzahl gefunden
      print str$(aktpz);" ";
      cnt = cnt + 1    
      goto 100

400   rem Ausgabe Anzahl
      print : print cnt; "primes found."   
      goto 9999

9998  rem Fehlerhafte Eingabe
      print "Usage: PRIMES start end (positive values and end > start)"

9999  end