ASC

Aus C64-Wiki
Zur Navigation springenZur Suche springen
ASC
Syntax: ASC(<Zeichenkette>)
Parameter
<Zeichenkette>: Zeichenkettenausdruck
Einordnung
Typ: Funktion numerisch
Kontext: Stringbearbeitung
Aufgabe: PETSCII-Code des ersten Zeichens eines Zeichenkette ermitteln
Abkürzung: aS
Token: $c6 (198)
Verwandte Befehle
CHR$, VAL

Anmerkung: Dieser Artikel beschreibt die BASIC-Funktion ASC unter BASIC V2 des Commodore 64.


Die BASIC-Funktion ASC() ermittelt den PETSCII-Code des ersten Zeichens der Zeichenkette (String) als Zahl von 0 bis 255.

Ist das Argument keine Zeichenkette, so erscheint die BASIC-Fehlermeldung ?TYPE MISMATCH ERROR. Fehlt das Argument oder sind zu viele angegeben, erscheint ?SYNTAX ERROR.

Wenn das zu prüfende Argument ein Nullstring ist (leere Zeichenkette), gibt BASIC immer die Fehlermeldung ?ILLEGAL QUANTITY ERROR aus (siehe auch Beispiele: Übliche Verwendung). Bei BASIC 7.0 wird dies nicht mehr als Fehler gesehen, sondern stattdessen 0 retourniert.

Für die Rückumwandlung, also ASCII-Code-Zahl in ein Zeichen, ist die BASIC-Funktion CHR$() zuständig.

Beispiele[Bearbeiten | Quelltext bearbeiten]

Einfache[Bearbeiten | Quelltext bearbeiten]

PRINT ASC("A")          Auf dem Bildschirm wird 65 ausgegeben.
PRINT ASC("ABC")        Auf dem Bildschirm wird ebenfalls 65 ausgegeben.
PRINT ASC("" + CHR$(0)) Auf den Bildschirm wird eine 0 ausgegeben.
PRINT ASC("")           "?ILLEGAL QUANTITY ERROR" wird ausgegeben (Erklärung siehe oben).

BASIC 7.0[Bearbeiten | Quelltext bearbeiten]

PRINT ASC("")           Kein Fehler mehr, zeigt den Wert 0 an!

Übliche Verwendung[Bearbeiten | Quelltext bearbeiten]

In einem Programm kann die ASC-Funktion in Bezug auf den Umgang mit eine Leer-String wie folgt effizient verwendet werden:

10 Z$=CHR$(0)
...
1000 A=ASC(A$+Z$)

Die Variablendefinition beschleunigt die Ausführung des Programms (da nicht ständig CHR$ und der Parameter ausgewertet werden muss). Allerdings sollte die Definition von Z$ möglichst am Beginn stehen, damit die Variable früh definiert und damit schnell aufgelöst und gefunden wird.
Andere Varianten wie

A=ASC(A$+CHR$(.))

oder

IF A$="" THEN A$=CHR$(.)
A=ASC(A$)

sind entweder unhandlich in der Verwendung oder brauchen mehr Platz, sind aber auf jeden Fall langsamer in der Ausführung.

Technisches Detail zum Interpreter: Die letzten beiden Varianten bewirken die Anhäufung von String-Müll (entweder 1 Byte bei jedem Aufruf oder nur wenn A$ leer ist) der entsprechend eher zum Auslösen einer Garbage-Collection führt. Bei der ersten Variante verhindert diese Anhäufung eine interne Optimierungsmethode der String-Verwaltung.

Sequenzielle Datei byteweise lesen[Bearbeiten | Quelltext bearbeiten]

 10 Z$=CHR$(0)
 100 OPEN 2,8,3,"FILENAME,S,R"
 110 FOR S=0 TO 1
 120 GET#2,A$
 130 A=ASC(A$+Z$)
 140 S=ABS(ST)
 150 PRINT A;
 160 NEXT S
 170 CLOSE 2
 ...

Das Verhalten von GET# muss besonders behandelt werden. Es liefert bei einem gelesenen CHR$(0) eine leere Zeichenkette! Daher:

  • Ist A$ leer, erhält man durch die Addition mit Z$ (entspricht CHR$(0)) die gewünschte Zeichenkette CHR$(0).
  • Ist A$ nicht leer, stört die Zeichenketten-Addition nicht, da ASC() nur das erste Zeichen verwendet.

Es empfiehlt sich CHR$(0) in eine Variable abzulegen, da damit das Programm schneller abgearbeitet wird und Platz spart.
Die FOR-NEXT-Schleife wird wegen des beträchtlichen Geschwindigkeitsvorteils verwendet. Sie bricht ab, sobald ST ungleich 0 ist (also bei einem Fehler oder beim Dateiende), weil damit die Schleifenvariable den Endwert der Schleife erreicht oder überschreitet, was somit die Schleife beendet.

Verwandte Themen[Bearbeiten | Quelltext bearbeiten]