'***************************************************************************** ' PEEKPOK2.BAS = QBasic-Programm mit direktem Speicherzugriff auf Strings ' ======================================================================== ' Dies Programm demonstriert den direkten Speicherzugriff auf Strings ber ' PEEK und POKE: ' Ein Textstring text$ wird abgespeichert und mittels PEEK wieder per direk- ' tem Speicherzugriff gelesen. Der String wird ver„ndert, indem das erste ' Zeichen um '1' erh”ht wird (aus "A" wird "B"). Dann wird der String mittels ' POKE wieder abgespeichert ber direkten Speicherzugriff. Der ver„nderte ' String wird auf dem Bildschirm angezeigt. ' ' Ein derartiger Schreib-/Lesezugriff wird fr zwei Arten von Strings durch- ' gefhrt: ' ' Statische String (feste L„nge; deklariert mit ..AS STRING * ' ------------------------------------------------------------------- ' Hierbei ergibt die PEEK Funktion direkt die Offset-Adresse des String. ' ' Dynamischer String (variabler L„nge) ' ------------------------------------- ' Hierbei erfolgt der Zugriff auf Strings immer auf dem Umweg ber einen 4 ' Byte langen String-Deskriptor : ' Wird die PEEK-Funktion auf einen dynamischen String angewendet, so erh„lt ' man nicht die Adresse des Strings, sondern die Adresse des String-Deskrip- ' tors, dessen erste 2 Bytes die String-L„nge und dessen letzte 2 Bytes ' die eigentliche Offset-Adresse des Strings enthalten. Der String-Deskriptor ' und der String selbst befinden sich immer in demselben Segment. ' ' ' \ (c) Thomas Antoni, 10.10.99 ' \ /\ Mailto:thomas@antonis.de ' ( ) http://www.antonis.de ' .( o ). ' ----==== Hottest QBasic Stuff on Earth !!! ====---- ' '***************************************************************************** '----------- statischer String (Direktzugriff) ------------------------- CLS PRINT "Statischer String : "; DIM txt AS STRING * 13 txt$ = "A-Schweinchen" 'Textstring abspeichern segm& = VARSEG(txt$) 'Segmentadresse von text$ ermitteln offs& = VARPTR(txt$) 'Offsetadresse von text$ ermitteln DEF SEG = segm& 'aktuelles Segment := Segment, in dem sich sowohl der 'String als auch der String-Deskriptor befindet ersteszeichen% = PEEK(offs&) + 1 '1.Zeichen d.Strings lesen u. 'inkrementieren (aus "A" wird "B") POKE offs&, ersteszeichen% PRINT txt$ SLEEP '----------- dynamischer String (Zugriff ber Deskriptor) ---------------- PRINT "Dynamischer String: "; text$ = "A-H”rnchen" 'Textstring abspeichern segm& = VARSEG(text$) 'Segmentadresse des Deskriptors von text$ ermitteln offs& = VARPTR(text$) 'Offsetadresse des Deskriptors von text$ ermitteln DEF SEG = segm& 'aktuelles Segment := Segment, in dem sich sowohl der 'String als auch der String-Deskriptor befindet stringadr& = CLNG(PEEK(offs& + 3)) * 256 + PEEK(offs& + 2) 'Hi- und Lo-Byte der eigentlichen Stringadresse aus 'Byte 3 und 4 des String-Deskriptors lesen; CLNG kon- 'vertiert INTEGER zu LONG ersteszeichen% = PEEK(stringadr&) + 1 '1.Zeichen d.Strings lesen u. 'inkrementieren (aus "A" wird "B") POKE stringadr&, ersteszeichen% 'ge„ndertes 1.Zeichen zurckspeichern PRINT text$ SLEEP END