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

 

Definieren eigener Funktionen und Prozeduren

In diesem Beitrag wird die Definition eigener Funktionen und Methoden erläutert. CBASIC erlaubt das Definieren einzeliger Funktionen oder mehrzeiliger Funktionen und Prozeduren. Wenn eigene Funktionen mit DEF oder DEF FEND deklariert werden, müssen die Definitionen im Quelltext vor der ersten Verwendung umgesetzt werden.

Häufig genutzte Funktionen können in einer separaten Datei abgelegt werden und am Anfang des eigentlichen Programms mit der Compilerdirektive %INCLUDE eingebunden werden. Die Include-Datei muss nicht getrennt übersetzt werden, dieser Schritt wird automatisch bei der Kompilierung des Hauptprogramms ausgeführt.

Grundsätzlich sollte man versuchen, ein Problem mit den Bordmitteln von CBASIC zu lösen. Funktionen, die mit DEF oder DEF FEND umgesetzt werden sind deutlich langsamer als integrierte Funktionen und Methoden.

Weitere Beiträge

Vor- und Nachteile des CBASIC Compilers
Sprachumfang des CBASIC-Compilers
Auswertung von Kommandozeilenparametern
Arbeiten mit Dateien

MATH.INC - mathematische Funktionen

Zur Demonstration habe ich einige nützliche Mathematische Funktionen zusammengestellt, die so in CBASIC nicht direkt verfügbar sind. Der folgende Quelltext wird in der Datei MATH.INC abgelegt.

REM Konstanten

MATH.PI = 3.141592653589793    
MATH.E  = 2.718281828459045    

REM Einzeilige Funktionen

DEF MATH.DEG(X) = X * (180/MATH.PI)
DEF MATH.RAD(X) = X * (MATH.PI/180)

DEF MATH.LOG10(X) = LOG(X)/LOG(10)         
DEF MATH.SINH(X) = (EXP(X)-EXP(-X))/2        
DEF MATH.COSH(X) = (EXP(X)+EXP(-X))/2        
DEF MATH.TANH(X) = (EXP(X)-EXP(-X))/(EXP(X)+EXP(-X))        

REM Mehrzeilige Funktionen

DEF MATH.MAX(A,B)   
  IF A>B THEN MATH.MAX=A ELSE MATH.MAX=B
FEND

DEF MATH.MIN(A,B)
  IF A>B THEN MATH.MIN=B ELSE MATH.MIN=A
FEND

DEF MATH.EVEN(X)
  IF X/2=INT(X/2) THEN MATH.EVEN=-1 ELSE MATH.EVEN=0
FEND

DEF MATH.ODD(X)
  IF X/2=INT(X/2) THEN MATH.ODD=0 ELSE MATH.ODD=-1
FEND

DEF MATH.ROUND(X,N)
  RND.X2 = X * 10^N
  IF X>=0 THEN RND.X2=INT(RND.X2+0.5) ELSE RND.X2=-INT(-RND.X2+0.5)
  MATH.ROUND = RND.X2 / 10^N
FEND

DEF MATH.FAK(X)
  FAK.TMP = 1 
  FOR FAK.CNT=2 TO X : FAK.TMP=FAK.TMP*FAK.CNT : NEXT FAK.CNT
  MATH.FAK = FAK.TMP
FEND

Verwenden der Funktionen

Um die definierten Funktionen in eigenen Programmen verwenden zu können, muss die Datei MATH.INC in den Quelltext importiert werden. Das geschieht am besten in der ersten Zeile des Programms.

%IMPORT MATH.INC
PRINT MATH.MAX(100,200)
PRINT MATH.FAK(5)


Weitere nützliche Funktionen

Integer als Hexadezimalzahl ausgeben

Wandelt eine Integer-Zahl in einen String mit der hexadezimalen Darstellung um. Es kann eine Mindestanzahl an Zeichen für den sedezimalen Wert angegeben werden. Wie für CBASIC üblich wird der Buchstabe "H" angehängt und bei Bedarf eine führende "0" hinzugefügt.

DEF HEX$(value%,count%)
    hexdig$ = "0123456789ABCDEF" : htemp$ = ""
    REM Wert in Hexadezimal wandeln
    WHILE value% > 0
       htemp$ = MID$(hexdig$, value%-16*INT(value%/16)+1, 1) + htemp$
       value% = INT(value%/16)
    WEND
    REM Nullen bis zur gewuenschten Stellenzahl auffuellen  
    WHILE LEN(htemp$) < count% : htemp$ = "0" + htemp$ : WEND
    REM Falls erste Stelle A-F dann zusaetzliche 0
    IF LEFT$(htemp$,1) >= "A" THEN htemp$ = "0" + htemp$
    REM Hexadezimakennnung anhaengen und Rueckgabe
    HEX$ = htemp$+"H"
FEND

String in Kleinbuchstaben wandeln

Im Gegensatz zu der Funktion UCASE$ bietet CBASIC nicht das Gegenstück dieser Funktion. Hier eine Lösung

DEF LCASE$(orig$)
    lower$ = ""
    FOR pos%=1 TO LEN(orig$)
        ch$ = MID$(orig$, pos%, 1)
        IF ch$ >= "A" AND ch$ <= "Z" 
            THEN lower$ = lower$ + CHR$(ASC(ch$)+32) 
            ELSE lower$ = lower$ + ch$
    NEXT pos%
    LCASE$ = lower$
FEND