POINTER.KRS¢*************************************¢* *¢* *¢* >>> P O I N T E R <<< *¢* *¢* *¢* (c) 1987 by Action! User Group *¢* *¢*************************************¢¢¢¢Der Pointer ist wiederum ein neuer ¢Variablentyp. Mit ihm ist es moeglich,¢auf andere Varaiablen,also Speicher-¢plaetze zu 'zeigen' und zu veraendern.¢Die POINTER werden ebenfalls wie Var-¢iablen definiert, nur mit dem Zusatz¢POINTER. Es gibt sie auch als ver-¢schiedenen Arten:¢z.B.:¢¢BYTE POINTER ZEIGER¢CARD POINTER ZEIGER¢INT POINTER ZEIGER¢¢oder man kann die POINTER auch auf¢besimmte Addressen setzen:¢¢CARD POINTER = 88 ¢¢Doch dazu spaeter mehr.¢¢Jetzt wieder ein Beispiel:¢¢BYTE POINTER COLOR¢¢PROC MK_DEMO9()¢¢ COLOR=710 ; DEN POINTER AUF ADD-¢ ; RESSE 710 SETZEN¢¢ COLOR^=0 ; ADDRESSE, AUF DIE DER¢ ; POINTER ZEIGT(710) AUF¢ ; 0 SETZTEN¢¢ PRINT("POINTER ZEIGT AUF ADR ")¢ PRINTCE(COLOR)¢¢ PRINT("ADR AUF DIE POINTER ZEIGT IST ")¢ PRINTBE(COLOR^)¢ ¢ COLOR==-1 ; POINTER AUF EINE ADD-¢ ; RESSE NIEDRIGER SETZEN¢ ; (709)¢ ¢ COLOR^=15 ; UND 709 AUF 15 SETZEN¢¢ PRINT("POINTER ZEIGT AUF ADR ")¢ PRINTCE(COLOR)¢¢ PRINT("ADR AUF DIE POINTER ZEIGT IST ")¢ PRINTBE(COLOR^)¢¢RETURN¢¢¢Aus dem obigen Beispiel sehen wir,dass¢Zur Veraenderung der Speicherzelle,¢auf die ein POINTER zeigt, das '^' ¢Zeichen notwendig ist.¢Aus dem Beispiel sollte auch ersicht-¢lich werden, wie die Pointer ver- ¢aendert werden koennen.¢¢Die POINTER haben meistens die Auf-¢gabe, Speicherzellen, auf die sie¢zeigen, zu veraendern. In Basic ge-¢schieht dies mit dem 'POKE' Befehl.¢Obwohl es in Action! auch eine 'POKE'¢Prozedur gibt, ist immer eleganter¢mit POINTERN zu arbeiten, da diese¢gegenueber dem Aufruf einer 'POKE'¢Prozedur schneller arbeiten.¢¢Die BYTE POINTER koennen immer nur¢EIN Byte veraendern, auf das sie ¢zeigen. Die BYTE POINTER selber aber¢sind natuerlich in ZWEI BYTE abgelegt,¢um auf die Addressen von 0 bis $FFFF¢zeigen zu koennen.¢¢Nun noch ein Beispiel fuer CARD¢POINTER¢¢CARD POINTER SCREEN=88¢¢PROC MK_DEMO10()¢BYTE POINTER SCREENSTART¢ ¢PRINT("SCREEN ZEIGT AUF ADR. ")¢PRINTCE(SCREEN^)¢¢SCREENSTART=SCREEN^+40*10¢ ¢SCREENSTART^='a¢¢RETURN¢¢Im Beispiel wird der CARD POINTER ¢auf Addresse 88/89 gelegt. In ¢MK_DEMO10() wird nach der Ausgabe¢der lokale POINTER SCREENSTART auf¢die Addresse gelegt, auf die SCREEN¢zeigt(in diesem Fall auf die Start-¢addresse des Bildschirms, die ja¢in 88/89 festgehalten wird.¢Aber dazu wird noch der Wert '40*10'¢hinzuaddiert, um das folgende 'a' in¢die 10. Zeile zu setzen( eine Zeile¢in GRAPHICS 0 benoetigt 40 Byte)¢¢-------------------------------------¢¢Nun kommt aber endlich die Verwendung¢der POINTER fuer Parameter-Zeichen-¢ketten:¢Der Arrayname als Variablenname zeigt¢immer auf das Element #0. Die ¢einzelnen Elemente kann man dann immer¢dazuaddieren. Wenn wir das wissen, so¢ist es auch einfach zu verstehen, dass¢wir nicht alle Elemente des Arrays als¢Parameter uebergeben muessen, sondern¢eigentlich nur dessen Startaddresse.¢Un dafuer bieten sich dann die POINTER¢ganz gut an... Doch erstmal wieder ein¢Beispiel:¢ ¢BYTE ARRAY FILE(30)¢¢PROC READFILE(BYTE POINTER DATEI) ¢BYTE A¢ CLOSE(2)¢ OPEN(2,DATEI,4,0)¢ DO¢ A=GETD(2)¢ PUT(A)¢ UNTIL EOF(2)=136¢ OD¢RETURN¢¢PROC MK_DEMO11()¢ PUT(125)¢ PRINTE("GEBE FILESPEC EIN")¢ INPUTMD(0,FILE,20)¢ READFILE(FILE)¢RETURN¢¢¢Dieses Programm fragt zunaechst nach ¢dem FILESPEC(also mit Geraetenamen und¢so...), dann ruft es die PROC READFILE¢mit dem FILESPEC als Parameter auf.¢In READFILE wird das File dann Byte-¢weise gelesen und auf dem Bildschirm¢mit 'PUT' ausgegeben, bis die EOF¢Variable auf 136 ist (End of File)¢'EOF' ist uebrigens eine eigene Action!¢Variable. In Klammern dahinter muss ¢nur die Kanalnummer stehen, die ab-¢gefragt werden soll. ¢¢Der Kurs geht weiter mit:¢¢¢ BEF2.KRS¢¢dem 2. Teil der 'eingebauten' PROCs¢¢