★ APPLICATIONS ★ PROGRAMMATION ★ VARDUMP für 464 ★ |
Vardump (CPC Amstrad International) | Applications Programmation |
Haben Sie auch schon einmal fremde Programme erweitert oder für Ihre speziellen Anwendungen optimiert und danach festgestellt, daß "nichts mehr läuft"? Das Programm "Vardump" ist in diesen Fällen ein leistungsfähiges Hilfsmittel. Es ermittelt alle in einem Basicprogramm enthaltenen Variablen und gibt sie tabellarisch, zusammen mit den Programmzeilennummern, in denen sie benutzt werden, wahlweise auf einem Drucker oder auf dem Bildschirm aus. Auch bei der Fehlersuche in selbstgeschriebenen Basicprogrammen werden Sie Vardump bald nicht mehr missen wollen, denn z.B. einen Schreibfehler in einem Variablennamen kann der Basic-Interpreter grundsätzlich nicht erkennen. Auch falsch geschriebene Basic-Kommandos interpretiert der CPC meist als Variable und bringt dann keine Fehlermeldung. Mit Vardump erkennen Sie solche Fehler sofort. Außerdem liefert Ihnen Vardump eine wertvolle Ergänzung für Ihre Programmdokumentation. Kenner der Schneider-Programmszenc werden jetzt sagen: "So etwas Ähnliches gibt es doch schon". Das stimmt zwar, aber die bereits veröffentlichten Programme leisten wirklich nur Ähnliches. Diese Programme laufen entweder wesentlich langsamer ab, als das hier vorgestellte Programm, oder sie verarbeiten die Typdeklarationsbe-fehle nicht, was natürlich zu völlig unbefriedigenden Ergebnissen führt. Auch hinsichtlich der Ausgabemöglichkeiten ist das vorliegende Programm komfortabler und flexibler. Um mit Vardump zu arbeiten, müssen Sie es zunächst mittels MERGE "VARDUMP" zu dem zu untersuchenden Programm laden, und dann mit RUN 60000 starten. Vardump erstellt zuerst die Bildschirmmaske und definiert fünf Windows. Danach werden Sie von Vardump nach dem zu bearbeitenden Programmzeilenbereich gefragt. Sie können die Fragen "von Programmzeile?" und "bis Programmzeile?" auch mit ENTER quittieren. Dann bearbeitet Vardump das Programm ab der ersten Programmzeile und stoppt, wenn es auf Zeile 60000 (erste Zeile von Vardump) stößt. Sie können aber auch beliebige Zeilennummern eingeben, auch solche größer 60000, so daß Sie auch eigene Programme in Zeilennummernbereiche um 60000 untersuchen können, nachdem Sie vorher Vardump mittels RENUM in einen anderen Zeilennummernbereich transformiert haben. Danach bestimmt Vardump die Zahl zz der zu untersuchenden Programmzeilen und dimensioniert dann entsprechend dieser Zahl ein Variablennamenarray var-nam$(varz), ein zweidimensionales Zeilennummernarray znr(varz,x), wobei x von der Zahl zz abhängt, und ein Hilfsarray refl(varz) für maximal 70 Variable (varz=70) in Zeile 60280. Nach Ausgabe von Programmzeilenzahl und Programmlänge in Bytes beginnt Vardump in Zeile 60350 Ihr Basicprogramm zeilenweise nach Variablennamen zu durchsuchen. Das Unterprogramm ab Zeile 60970 ermittelt Zeilennummer (znr) und Programmzeilenlänge (zlaenge) der aktuell untersuchten Zeile. Diese Zeile wird dann im Unterprogramm "Programmzeile bearbeiten" (ab Zeile 60590) nach Token für Variable durchsucht. Dies sind &02, &03 und &04 für Variable mit den Typkennzeichen %, S und !, also Integer-, String- und Realvariable, sowie &0B, &0C und &0D für Integer-, String- und Realvariable ohne Typkennzeichen. Kommentartexte (token=&C0 bzw. &C5) überspringt Vardump. Dadurch steigert es seine Arbeitsgeschwindigkeit bei reichlich kommentierten Programmen erheblich. Um eine eindeutige Typzuweisung bei Variablen ohne Typkennzeichen vornehmen zu können, durchsucht Vardump den Programmcode auch nach Token für DEFINT-, DEFSTR- und DEFREAL-Befehle(Token=&8E bzw. &8F bzw. &90) und merkt sich die Typzuweisungen, indem es in der Variable vartypS für jeden der 26 Buchstaben des Alphabets die entsprechenden Typkennzeichen speichert. Dies ist erforderlich, weil der Basic-Interpreter des CPC bei der Programmzeileneingabe zunächst alle Variablen ohne Typkennzeichen als REAL-Variable ansieht. Erst beim erstmaligen Programmdurchlauf wandelt der Interpreter die Token der Variablen endgültig, entsprechend der Typzuweisungen, in den DEFINT-, DEFSTR- und DEF-REAL-Instruktionen um. Hier sei noch angemerkt, daß sich dadurch die Möglichkeit bietet, in einem Programm solche Passagen herauszufinden, die beim Programmablauf nie durchlaufen werden. Meist handelt es sich in diesem Fall um überflüssige Abfragen oder es liegt ein logischer Fehler im Programmaufbau vor. Vardump hat immer dann einen Variablennamen gefunden, wenn es auf ein Token für ein Typkennzeichen stößt. Es merkt sich den Variablentyp und springt zum Unterprogramm "Variablennamen dekodieren" ab Zeile 61030. Um dessen Arbeitsweise zu verstehen, muß man die Interpretercodierung für Variable kennen. Das erste Byte einer Variablen im Programm legt deren Typ fest: Danach folgen zwei Bytes, die eine relative 16-Bit-Adresse des Speicherplatzes der Variablen im RAM, bezogen auf den Start des Variablenspeichers darstellen. Diese Bytes sind für Vardump ohne Bedeutung und werden übersprungen. Anschließend folgen die ASCII-Codes für die Buchstaben des Variablennamens mit der Besonderheit, daß dem ASCII-Code des letzten Buchstabens der Wert 128 hinzuaddiert ist. An diesem Merkmal erkennt Vardump das Ende des Variablennamens. Jede gefundene Variable wird von Vardump anschließend im Unterprogramm "Variable identifizieren" (ab Zeile 61280) mit den bereits gefundenen Variablen verglichen. Wenn der Variablenname zum ersten Mal auftritt, wird er im Array varnam$(n) gespeichert. Vorher wird er aber auf maximal 12 Buchstaben begrenzt. Wenn er länger war, wird dies durch ein angehängtes "*" kenntlich gemacht. Jeder neue Variablenname und die Anzahl der im Array varnam$(n) gespeicherten Variablennamen werden laufend auf dem Bildschirm ausgegeben. Danach wird die Zeilennummer, in der die Variable gefunden wurde, in dem Array znr(n,x) gespeichert, wenn sie in derselben Programmzeile nicht schon einmal gefunden wurde. Um Speicherplatz zu sparen, ist dieses Array vom Integertyp. Da die Zeilennummern auch außerhalb des durch Integerzahlen darstellbaren Zahlenbereichs liegen können, wird vorher die Zahl 32768 subtrahiert. Diese Zahl wird später bei der Ausgabe wieder hinzuaddiert. Wenn eine Variable in mehr als x Zeilen vorkommt, wäre das Zeilennummernarray znr(varz,x) zu klein dimensioniert, und der Programmablauf würde durch eine Fehlermeldung unterbrochen. Dies vermeidet Vardump, indem es bei vollem Zeilennummernspeicher alle weiteren Zeilennummern ignoriert. Um dies anzuzeigen, wird die letzte speicherbare Zeilennummer gleich der ersten Zeilennummer von Vardump gesetzt. Auf diese Weise durchsucht Vardump das Basicprogramm und bricht erst ab. wenn der bei Programmstart eingegebene Zeilennummernbereich abgearbeitet ist, oder wenn die letzte Basiczeile bearbeitet wurde. Die aktuell bearbeitete Programmzeile wird laufend auf dem Bildschirm ausgegeben. Außerdem zeigt eine eingebaute Stoppuhr die seit dem Programmstart verstrichene Zeit. Bevor das Ausgabemcnuc angeboten wird, werden die Variablennamen alphabetisch sortiert. Um Rechenzeit zu sparen, wird das Zeilennummernarray nicht mitsortiert, sondern lediglich das Hilfsarray refl(n). das nach dem Sortiervorgang anzeigt in welcher Zeile des Zeilennummern-arrays die Zeilennummern, in denen der in varnamS(n) gespeicherte Variablenname vorkommt, zu finden sind. Das Ausgabemenue enthält die Menuepunkte "Druckerausgabe", "Bildschirmausgabe", "Start" und "Ende". Bei "Start" fragt das Programm wieder nach dem zu untersuchenden Zeilennummernbereich und beginnt erneut mit der Variablensuche. Mit "Ende" kann das Programm beendet werden. Nach zweimaligem Drücken der ESC-Taste verzweigt das Programm immer zum Ausgabemenue. Token Variablentyp
TM, CPCAI 8609
|