Software > Coding
Gemeinschaftsprojekt?
m0n0:
Der nächste Schritt wird sein, in einer Endlosschleife alle Benutzereingaben abzufragen und wenn der Benutzer den Buchstaben Q eingibt dann beendet sich das Programm.
m0n0:
Ok, aufgrund der grossen nachfrage - hier ist ist step3. ;D
--- Code: ---#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <tos.h>
#include <vdi.h>
#include <screen.h>
#define VERSION "0.1 - (" __DATE__ ")"
/* Diese Variable vom typ short (16 Bit bei PureC) */
/* ist neu im Programm! */
/* ------------------------------------------------ */
/* Da sie ausserhalb von einer Funktion deklariert */
/* wird - ist sie berall in dieser Datei erreichbar*/
/* also in jeder Funktion. Variablen die innerhalb */
/* einer funktion deklariert werden, sind nur so */
/* lange "am leben" wie die funktion luft..., */
/* solche Variablen nennt man dann "Lokale" Variabl.*/
/* Aber dies hier ist eine "Globale" Variable */
/* Alle globalen Variablen werden mit 0 */
/* initialisiert - zumindest bei C */
/* Das heisst "short quit;" ist gleichbedeutend mit */
/* "short quit = 0;" */
/* Das gillt aber nur fr Globale Variablen!!! */
/* Lokale Variablen enthalten Speicher Schrott -bis */
/* ihnen das erste mal ein Wert zugewiesen wird. */
/* D.h. - Lokale Variable immer anfangs mit einem */
/* Startwert versehen! */
/* Wir benutzen diese Variable um das Programm */
/* von verschiedenen Stellen aus beenden zu koennen */
/* aber seht selbst... */
short quit;
/* ------------------------------------------------ */
/* mit dieser Funktion kann man einen text an einer */
/* bestimmten stelle am Bildschirm ausgeben. */
/* Die ersten beiden Parameter bestimmen die */
/* Postion (X = Spalte, Y=Zeile) */
/* der parameter inv bestimmt ob schwarz auf weiss */
/* oder weiss auf schwarz ausgegeben werden soll */
/* der letzte parameter beinhaltet eine */
/* Speicheradresse an der die auszugebenden */
/* buchstaben stehen */
void textxy(short x, short y, short inv, char * str)
{
/* wenn parameter inv (invertiert) ungleich 0 */
/* ist-dann wird der reverse mode eingeschaltet */
/* d.h. weiss auf schwarze ausgabe */
if( inv != 0 ) {
/* Makro das in screen.h definiert wurde: */
Rev_on();
}
/* Jetzt wird der cursor an die gewuenschte */
/* Stelle gesetzt, diese anweisung ist ebenfalls*/
/* in screen.h definiert */
Goto_pos( y, x );
/* Diese funktion kennen wir schon: */
/* wir merken: Cconws gibt immer an der moment. */
/* cursor-position den text aus. */
Cconws( str );
/* wenn inv ungleich 0 ist, dann wird der */
/* modus wieder auf normal gesetzt. */
if( inv != 0 ) {
Rev_off();
}
}
/* Neue Funktion "input()" */
/* ------------------------------------------------ */
/* Diese Funktion liest ein Zeichen und reagiert */
/* darauf... */
void input( void )
{
/* Zeichen in eine 32 Bit Variable einlesen: */
/* hierbei ist wichtig: */
/* sobald GEM geladen wurde, hat diese Funktion */
/* ein bisschen andere Rueckgabewerte */
/* fuer einige Tasten - z.B. Funktionstasten */
/* unter GEM bekommen wir immer einen ASCII */
/* Wert ... */
/* Will man also die Funktionstasten abfragen */
/* im autostart - dann muss das anders erfolgen */
/* als unter GEM... aber dazu mehr in den */
/* naechsten folgen. Jetzt wird erstmal nur ein */
/* Buchstabe eingelesen! */
long key = Cnecin();
/* momentan interessiert uns nur der Ascii wert */
/* der Taste.... */
/* Es gibt auch Tasten bei denen der ASCII Wert */
/* 0 ist.... da interessiert uns dann ein */
/* anderer Bereich der Zahl.... */
/* Hier wird jetzt das Ascii Byte des Tasten */
/* codes durch eine Binre Und verknpfung */
/* extrahiert... bzw. alles andere ausgeblendet */
/* Der Ascii wert befined sich am ersten byte */
/* der 4 byte variable ( 4 byte = 32 bit): */
char ascii = (key & 0xFF);
/* Darauf achten das die Buchstaben - anders */
/* als Zeichenketten - in einzelne anfhrungs- */
/* gesetzt sind!!! */
/* der buchstabe wird daraufhin vom compiler */
/* in den "(Atari)-Ascii" Wert gewandelt. */
/* anstatt 'Q' koennte man auch die Zahl */
/* 81 nehmen - der Ascii wert fuer Q. Aber so */
/* ist es besser zu lesen! */
/* Hier wird jetzt abgefragt ob der Buchstabe */
/* das Kommando zum beenden enthaelt... */
if( ascii == 'Q' || ascii == 'q' ){
quit = 1;
} else {
/* hier wird der wert der variablen ausgegeben */
/* nur fuer informationszwecke */
/* ich gehe nicht naeher darauf ein */
/* es ist nur fuer info zwecke gedacht */
/* wer mehr wissen will schaut in andere */
/* dokumente.... */
printf("ascii: %d - keycode: %lu\n", ascii, key );
}
}
/* Hauptprogramm, wird aufgerufen nach start des Programms: */
int main(void)
{
/* Anstatt Cconws rufen wir */
/* unsere eigene Textausgabe routine*/
/* auf! */
/* Spalte 2, Zeile 10, Invers, Text */
textxy( 3, 1, 1,"SimpleBoot Version " VERSION );
/* Hier haben wir ein neues Programm-konstrukt */
/* eine schleife! Diese wird solange wiederholt */
/* bis die bedingung innerhalb der klammern */
/* nicht mehr zutrifft */
/* konkret wird hier immer wieder ein Buchstabe */
/* eingelesen - es sei denn die Variable quit */
/* enthaelt den Wert 1 - dann wird nicht weiter */
/* gemacht... */
while( quit != 1 ) {
input();
}
/* da die funktion main() den rueckgabetyp "int"*/
/* (je nach compiler einstellung 16 oder */
/* 32 bit zahl) hat, muss ein entsprechender */
/* wert zurueckgegeben werden - 0 bedeutet: kein*/
/* fehler. */
return( 0 );
}
[code]
--- Ende Code ---
[/code]
Arthur:
Die ahcc.prj im STEP3.ZIP.PDF Anhang mag funktionieren aber für den AHCCST muß in der ahcc.prj statt der AHCCSTD.LIB die AHCCSTDI.LIB benutzt werden da erstere dort nicht vorhanden ist und sich der Linker sonst beschwert.
m0n0:
Ich teste vorher alle mit der AHCC020 Version.
m0n0:
Ok, jetzt gibt es anstatt einer neuen version eine Haus-Aufgabe ;)
Schreibt das Programm so um - das bei Taste 'A' eine Meldung auf dem Bildschirm erscheint ... z.b.: "Taste A gedrueckt.".
Dafür rufe ich nochmal das if-else if-else konstrukt ins Gedächtnis:
--- Zitat ---if( key == 'Q' ){
// beenden
}
else if( key == 'A' ) {
// ausgabe machen
}
else {
// nix...
}
--- Ende Zitat ---
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln