Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: Cool-Andy am 10. October 2009, 08:42

Titel: Compilerproblem
Beitrag von: Cool-Andy am 10. October 2009, 08:42
Hi,
tut mir leid, dass ich schon wieder posten muss, aber ich bin grad echt am verzweifeln.
Naja aus meinem im vorherigen Thema gefragten Tastendruck wurde ein Tastaturtreiber :wink:.
Ich frage den KBC über 0x60 ab, speichere den Scancode in einer Variablen und schreibe mittels "if" und "else if" das ganze in eine globale Variable.
Nun wollte ich aber mit dem Schreiben abwarten, bis Enter gedrückt wurde.
Um die Zeichen zu speichern, dachte ich könnte ich in so etwas: "char *text" schreiben, um die Position zu erhöhen wird "z" (Int) bei jedem Durchlauf um 1 erhöht.
Mein Code:

int scancode;
int z=0;

classstart:
z++;

// ... hier Scancode ermitteln

if (scancode == 0x02)
{
    string [z] = "1";
}
else if (scancode == 0x03)
{
   string [z] = "2";
}
// ...
else if (scancode == 0x1c)     // Enter
{
   string[z] = "\n";
   goto classend;
}
//...

goto classstart;

classend:
scancode = 0;
}

gcc meckert jetzt immer so was: warning: assigment makes integer from pointer without a cast.

Ich bin echt ratlos.
Kann mir bitte jemand helfen!?
Danke schon mal im Vorraus.
Titel: Re: Compilerproblem
Beitrag von: Tobiking am 10. October 2009, 09:51
Was in " steht ist nen String (und wird mit \0 abgeschlossen), was du an string[z] zuweisen willst dürfte ein einzelnes Zeichen sein. Das wird in ' geschrieben. Also z.B. '1' und '\n'.
Titel: Re: Compilerproblem
Beitrag von: chris12 am 10. October 2009, 18:26
ich würde das so in der art machen
char string[80]; //ein string mit 80 zeichen
int scancode;
static unsigned char scantable[] = { ' ', ' ', '1', '2', '3' }; // eine, natürlich unvollständige, scancodetable

while(scancode != 0x1C)
{
    *string = scantable[scancode];
    string++;
}
string++;
*string = '\0'; // den string abschließen


das ist nur ein vorschlag ich übernehme keine verantwortung ob der code so laufähig wäre, aber auf dauer sind if/else keine lösung
Titel: Re: Compilerproblem
Beitrag von: Cool-Andy am 10. October 2009, 18:44
Danke erstmal für die Antworten,
aber was das hier static unsigned char scantable[] = { ' ', ' ', '1', '2', '3' }; bewirkt verteh ich nicht.
Kann mir das bitte jemand erklären?
Titel: Re: Compilerproblem
Beitrag von: kevin am 10. October 2009, 19:02
ich würde das so in der art machen
Und perfekt ist der Buffer Overflow. Ein bisschen Sorgfalt beim Programmieren wäre manchmal ganz nett.

aber was das hier static unsigned char scantable[] = { ' ', ' ', '1', '2', '3' }; bewirkt verteh ich nicht.
Kann mir das bitte jemand erklären?
Es legt ein char-Array an, das mit den entsprechenden Zeichen initialisiert wird. Also scantable[0] = ' ', scantable[2] = '1' usw. Die Idee ist, dass du da einfach jeweils das richtige Zeichen für den Scancode einträgst.
Titel: Re: Compilerproblem
Beitrag von: Cool-Andy am 10. October 2009, 20:24
Aaah, mir geht ein Lichtlein auf!
Danke, werd ich gleich mal ausprobieren  :lol:
Titel: Re: Compilerproblem
Beitrag von: chris12 am 10. October 2009, 21:55
nagut dann nochmal überarbeitet:
int z = 0;
char string[80]; //ein string mit 80 zeichen
int scancode;
static unsigned char scantable[] = { ' ', ' ', '1', '2', '3' }; // eine, natürlich unvollständige, scancodetable

while(scancode != 0x1C && z <= 79)
{
    string[z] = scantable[scancode];
    z++;
}
z++;
string[z] = '\0'; // den string abschließen

Titel: Re: Compilerproblem
Beitrag von: Jidder am 10. October 2009, 22:02
string[z] statt *string, und kein string++
Titel: Re: Compilerproblem
Beitrag von: XanClic am 10. October 2009, 22:08
Ich wäre ja für
int z;
char string[80];
volatile int scancode;
static unsigned char scantable[256];

scantable[0x02] = '2';
scantable[0x03] = '3';
scantable[0x1C] = '\n';
//Zu vervollständigen...

for (z = 0; z < 79; z++)
{
    string[z] = scantable[scancode];
    if (string[z] == '\n')
    {
        z++;
        break;
    }
}
//z ist hier höchstens 79. Die 0 passt also auch noch rein.
string[z] = '\0';
Titel: Re: Compilerproblem
Beitrag von: kevin am 10. October 2009, 22:12
Ich wäre für sizeof(string) - 1 statt der hartkodierten 79. Und die Tabelle kann man auch schöner initialisieren:

static unsigned char scantable[256] = {
    [0x02] = '2',
    [0x03] = '3',
    [0x1C] = '\n',
};
Titel: Re: Compilerproblem
Beitrag von: Cool-Andy am 10. October 2009, 23:42
Danke nochmal für die Antworten.
Aber es klappt net. Erklärt mich für dumm!  :?
Habs jetzt mal mit der for-Schleife und der while-Schleife ausprobiert: krieg beides mal kein Zeichen.
Hättet ihr mal ein konkretes Beispiel?
Danke!
Titel: Re: Compilerproblem
Beitrag von: Cool-Andy am 11. October 2009, 08:41
Ich häng mal noch meinen aktuellen Code an:

void scanf () // Aufruf durch "scanf();"
{
volatile int scancode;
int z;
int i;
char string[80];

static unsigned scantable[1024] = { // Scancodetabelle
[0x02] = '1',
[0x03] = '2',
[0x04] = '3',
[0x05] = '4',
[0x06] = '5',
[0x07] = '6',
[0x08] = '7',
[0x09] = '8',
[0x0a] = '9',
[0x0b] = '0',
[0x0c] = '?',
[0x0d] = '`',
[0x0e] = '^',
[0x0f] = '^',
[0x10] = 'q',
[0x11] = 'w',
[0x12] = 'e',
[0x13] = 'r',
[0x14] = 't',
[0x15] = 'z',
[0x16] = 'u',
[0x17] = 'i',
[0x18] = 'o',
[0x19] = 'p',
[0x1a] = '^',
[0x1b] = '*',
[0x1c] = '\n', // Enter
[0x1d] = '^',
[0x1e] = 'a',
[0x1f] = 's',
[0x20] = 'd',
[0x21] = 'f',
[0x22] = 'g',
[0x23] = 'h',
[0x24] = 'j',
[0x25] = 'k',
[0x26] = 'l',
[0x27] = '^',
[0x28] = '^',
[0x29] = '<',
[0x2a] = '^',
[0x2b] = '#',
[0x2c] = 'y',
[0x2d] = 'x',
[0x2e] = 'c',
[0x2f] = 'v',
[0x30] = 'b',
[0x31] = 'n',
[0x32] = 'm',
[0x33] = ',',
[0x34] = '.',
[0x35] = '_',
[0x36] = '^',
[0x37] = '^',
[0x38] = '^',
[0x39] = ' ',
[0x3a] = '^',
[0x3b] = '^',
[0x3c] = '^',
[0x3d] = '^',
[0x3e] = '^',
[0x3f] = '^',
[0x40] = '^',
[0x41] = '^',
[0x42] = '^',
[0x43] = '^',
[0x44] = '^',
[0x45] = '^',
[0x46] = '^',
[0x47] = '^',
[0x48] = '^',
[0x49] = '^',
[0x4a] = '-',
[0x4b] = '^',
[0x4c] = '^',
[0x4d] = '^',
[0x4e] = '+',
[0x4f] = '^',
[0x50] = '^',
[0x51] = '^',
[0x52] = '^',
[0x53] = '^',
[0x54] = '^',
[0xd9] = '^',
[0xda] = '^',
};


for (z=0; z<79; z++)
{
// Solange warten, wie der Input Buffer leer ist
while ((inb(0x64) & 1) == 0) {}

// Scancode auslesen (dadurch wird die Taste aus dem Input Buffer entfernt)
scancode = inb(0x60);

string[z] = scantable[scancode];

if(string[z] == '\n')
{
z++;
break;
}
}

string[z] = '\0'; // String abschließen

i = 1;
while(string[i] != '\0') // Byteweises kopieren (string --> string)
{
key[i] = string[i]; // key --> globale "char*"-Variable
i++;
}
}
Titel: Re: Compilerproblem
Beitrag von: Jidder am 11. October 2009, 12:29
Hi,

Die Kopier-Schleife muss mit i = 0 starten, nicht 1.

Ansonsten: Was sollte deiner Meinung nach passieren? Gibst du key aus? Was passiert tatsächlich?
Titel: Re: Compilerproblem
Beitrag von: kevin am 11. October 2009, 12:55
Und das abschließende Nullbyte mitzukopieren, wäre auch eine Idee, sonst wird key unter Umständen etwas zu lang. ;)
Titel: Re: Compilerproblem
Beitrag von: Cool-Andy am 11. October 2009, 17:15
Ok, hab das mal jetzt so gelöst:
//...
for (z=0; z<79; z++)
{
// Solange warten, wie der Input Buffer leer ist
while ((inb(0x64) & 1) == 0) {}

// Scancode auslesen (dadurch wird die Taste aus dem Input Buffer entfernt)
scancode = inb(0x60);

string[z] = scantable[scancode];

if(string[z] == '\n')
{
z++;
break;
}
scancode = 0;
}

string[z] = '\0'; // String abschließen

for(i=0;i<80;i++) // Byteweises kopieren (key --> string)
{
key[i] = string[i]; // key --> globale "char*"-Variable
}
//...

und im main-file:
//...
loop:
scanf();
printf(key);
goto loop;
//...

Leider wird immer nur das erste Zeichen eingelsen und angezeigt.
Danach ist mein Kernel wie "gelähmt".
Oh je, ob ich das nochmal hinkrieg!?  :|
Titel: Re: Compilerproblem
Beitrag von: chris12 am 11. October 2009, 17:51
ich weiß nicht genau ob das möglich ist, aber ich denke mal ja ...
return doch einfach den eingelesenen string.
also statt
for(i=0;i<80;i++) // Byteweises kopieren (key --> string)
{
key[i] = string[i]; // key --> globale "char*"-Variable
}
einfach
return string;
Titel: Re: Compilerproblem
Beitrag von: kevin am 11. October 2009, 18:13
Der String liegt auf dem Stack, der ist nicht mehr gültig, nachdem die Funktion beendet ist.
Titel: Re: Compilerproblem
Beitrag von: Cool-Andy am 11. October 2009, 18:20
Und was heißt das jetzt konkret?
Titel: Re: Compilerproblem
Beitrag von: kevin am 11. October 2009, 18:32
Dass du das lassen sollst wie es ist. ;)

Kannst du mal den aktuellen kompletten Code irgendwo hochladen? Mir fehlt gerade der Überblick, wie die einzelnen Codefragmente am Ende tatsächlich benutzt werden.
Titel: Re: Compilerproblem
Beitrag von: Cool-Andy am 11. October 2009, 18:44
Kannst du mal den aktuellen kompletten Code irgendwo hochladen? Mir fehlt gerade der Überblick, wie die einzelnen Codefragmente am Ende tatsächlich benutzt werden.
OK.

main.c:

#include "video.h"
#include "kb.h"
#include "global.h"

void kernel()
{

    // Bildschirm leeren und eine Meldung anzeigen
    cls();
    cls();
    printf ("ready\n");

    loop:
    scanf();
    printf(key);
    goto loop;

    // Endlosschleife
    while (1);
}
kb.c:
//...
void scanf () // Aufruf durch "scanf();"
{
volatile int scancode;
int z;
int i;
char string[80];

static unsigned scantable[256] = { // Scancodetabelle
[0x02] = '1',
[0x03] = '2',
[0x04] = '3',
[0x05] = '4',
[0x06] = '5',
[0x07] = '6',
[0x08] = '7',
[0x09] = '8',
[0x0a] = '9',
[0x0b] = '0',
[0x0c] = '?',
[0x0d] = '`',
[0x0e] = '^',
[0x0f] = '^',
[0x10] = 'q',
[0x11] = 'w',
[0x12] = 'e',
[0x13] = 'r',
[0x14] = 't',
[0x15] = 'z',
[0x16] = 'u',
[0x17] = 'i',
[0x18] = 'o',
[0x19] = 'p',
[0x1a] = '^',
[0x1b] = '*',
[0x1c] = '\n', // Enter
[0x1d] = '^',
[0x1e] = 'a',
[0x1f] = 's',
[0x20] = 'd',
[0x21] = 'f',
[0x22] = 'g',
[0x23] = 'h',
[0x24] = 'j',
[0x25] = 'k',
[0x26] = 'l',
[0x27] = '^',
[0x28] = '^',
[0x29] = '<',
[0x2a] = '^',
[0x2b] = '#',
[0x2c] = 'y',
[0x2d] = 'x',
[0x2e] = 'c',
[0x2f] = 'v',
[0x30] = 'b',
[0x31] = 'n',
[0x32] = 'm',
[0x33] = ',',
[0x34] = '.',
[0x35] = '_',
[0x36] = '^',
[0x37] = '^',
[0x38] = '^',
[0x39] = ' ',
[0x3a] = '^',
[0x3b] = '^',
[0x3c] = '^',
[0x3d] = '^',
[0x3e] = '^',
[0x3f] = '^',
[0x40] = '^',
[0x41] = '^',
[0x42] = '^',
[0x43] = '^',
[0x44] = '^',
[0x45] = '^',
[0x46] = '^',
[0x47] = '^',
[0x48] = '^',
[0x49] = '^',
[0x4a] = '-',
[0x4b] = '^',
[0x4c] = '^',
[0x4d] = '^',
[0x4e] = '+',
[0x4f] = '^',
[0x50] = '^',
[0x51] = '^',
[0x52] = '^',
[0x53] = '^',
[0x54] = '^',
[0xd9] = '^',
[0xda] = '^',
};


for (z=0; z<79; z++)
{
// Solange warten, wie der Input Buffer leer ist
while ((inb(0x64) & 1) == 0) {}

// Scancode auslesen (dadurch wird die Taste aus dem Input Buffer entfernt)
scancode = inb(0x60);

string[z] = scantable[scancode];

if(string[z] == '\n')
{
z++;
break;
}
}

string[z] = '\0'; // String abschließen

i = 1;
for (i=0; i<80; i++) // Byteweises kopieren (key --> string)
{
key[i] = string[i]; // key --> globale "char*"-Variable
}
}
Titel: Re: Compilerproblem
Beitrag von: kevin am 11. October 2009, 19:46
Ich meinte eigentlich wirklich den kompletten Code, als .zip oder so irgendwo hochladen, damit ich den auch selber kompilieren und mir den Fehler anschauen kann. Und natürlich, falls der Fehler doch woanders liegt: Bist du dir denn z.B. komplett sicher, dass es nicht an deinem printf liegt? Hast du mal geschaut, an welcher Stelle dein Kernel hängt? (In qemu z.B. mit info registers im Monitor anschauen, wo eip steht)
Titel: Re: Compilerproblem
Beitrag von: Cool-Andy am 11. October 2009, 19:55
Hier is der komplette Code (ich hoffe der Link funzt): http://www.12see.de/userdaten/000200/71/download/os.zip

Als Bootloader benutz ich Grub.
Titel: Re: Compilerproblem
Beitrag von: kevin am 11. October 2009, 20:47
Zum einen kannst du das mit key so nicht machen. Zum einen deklarierst du die Variable in einer Headerdatei und dort deklariert man nie Variablen. Das heißt, du hast am Ende in jeder .c-Datei, die diesen Header einbindet, eine Deklaration dieser Variablen. Das klappt nur, weil der Linker dir die Doppelten wieder zusammensucht... Richtig wäre es, die Variable als extern char key[]; in der Headerdatei zu deklarieren und z.B. in der kb.c nochmal die eigentliche Definition char key[80]; hinzuschreiben.

Das andere, was an deiner Deklaration böse war, ist, dass du einen Pointer deklariert und ihn auch benutzt hast, aber ihn nie initialisiert hast. Das heißt, er hat halt zufällig auf irgendwelchen Speicher gezeigt. Keine gute Idee.

Was aber die entscheidende Sache ist, ist dass du die Breakcodes nicht berücksichtigst, die beim Loslassen einer Taste erzeugt werden. An diesen Stellen ist die Scancodetabelle leer und deswegen wird eine 0 in den String geschrieben. Womit er dann beendet wäre, welche Tasten auch immer hinterher noch kommen mögen. Ich hab noch das hier rein, damit hat es dann funktioniert:
        if (scancode & 0x80) {
            z--;
            continue;
        }
Titel: Re: Compilerproblem
Beitrag von: Cool-Andy am 12. October 2009, 06:27
Danke für deine Mühe,
habs grade ausprobiert, mir sind aber ein paar Dinge noch unklar.
Könntest du vielleicht die veränderten Datein irgendwie uploaden oder als Code posten?

Wäre dir wirklich sehr dankbar.
Titel: Re: Compilerproblem
Beitrag von: kevin am 12. October 2009, 09:46
Hm, ich glaube, ich hatte das in /tmp gemacht... ;)

Ich kann die paar Änderungen heute abend nochmal machen und dann den Patch reinkopieren. Sind ja nur ein paar Zeilen.
Titel: Re: Compilerproblem
Beitrag von: Cool-Andy am 12. October 2009, 16:41
ja, danke, das wäre wirklich sehr nett.  :-D
Titel: Re: Compilerproblem
Beitrag von: Cool-Andy am 14. October 2009, 06:34
wie sieht`s denn aus, kannst du den code bald posten?
Titel: Re: Compilerproblem
Beitrag von: ChristianF am 14. October 2009, 08:41
Der Code von scanf sieht nicht unbedingt sehr schön aus...
Wäre es nicht sinnvoller, die Funktion wie im Standard deklariert zu schreiben?
int  scanf ( const char * format, ... );

Den "String" format könnte man mit den Builtin-Funktionen aufdröseln. Ich kann ja mal eine einfache Version als Anregung basteln, falls bedarf besteht. :)
Titel: Re: Compilerproblem
Beitrag von: Cool-Andy am 14. October 2009, 08:46
Der Code von scanf sieht nicht unbedingt sehr schön aus...
Geb ich dir recht, aber mein ganzes OS soll eigentlich nur dazu dienen, das ganze Zeugs zu lernen.  :wink:

Ich kann ja mal eine einfache Version als Anregung basteln, falls bedarf besteht.
Ja gerne, nur her damit und vielen Dank für deine/eure Mühe.
Titel: Re: Compilerproblem
Beitrag von: ChristianF am 14. October 2009, 09:05
Gut.
Ich werde mich heute Nachmittag daran machen.
Dafür werde ich dann auch teile deines Codes umstricken, was ich denke, dass sinnvoller ist...
 
Was mir aber schon aufgefallen ist, ist dass die Scancode- bzw. ASCII-Tabelle nur lokal in der Funktion vorhanden ist. Ich würde so etwas global machen... :)
Titel: Re: Compilerproblem
Beitrag von: Cool-Andy am 14. October 2009, 09:11
Wie schon gesagt, ich bin Anfänger der blutigsten Art :-D und lerne gern, also nur zu!
Titel: Re: Compilerproblem
Beitrag von: kevin am 14. October 2009, 10:15
wie sieht`s denn aus, kannst du den code bald posten?
Ups, vergessen... Hier ist der Patch:
diff --git a/global.h b/global.h
index 6b5e026..d744792 100644
--- a/global.h
+++ b/global.h
@@ -4,7 +4,7 @@
 #define _GLOBAL_H_

 /// Aktuell entgegengenommene Taste
-char *key;
+extern char key[];


-#endif // ifndef _GLOBAL_H_
\ No newline at end of file
+#endif // ifndef _GLOBAL_H_
diff --git a/kb.c b/kb.c
index 816599c..e77d446 100644
--- a/kb.c
+++ b/kb.c
@@ -3,6 +3,8 @@
 #include "kb.h"
 #include "global.h"

+char key[80];
+
 static inline unsigned char inb(unsigned short port)
 {
    unsigned char val;
@@ -113,6 +115,11 @@ void scanf ()          // Aufruf durch "scanf();"

        // Scancode auslesen (dadurch wird die Taste aus dem Input Buffer entfernt)
        scancode = inb(0x60);
+
+        if (scancode & 0x80) {
+            z--;
+            continue;
+        }

        string[z] = scantable[scancode];

@ChristianF: scanf ist hochgradig nichttrivial, aber versuch's mal. Ich suche dann auch Fehler. ;)
Titel: Re: Compilerproblem
Beitrag von: Cool-Andy am 14. October 2009, 10:40
hähhhh?  :? :? :?
hab jetzt mal den code den ich als C-Code identifiziert habe (was soll --- und +++) agetippt und durch den compiler gejagt. Bis jetzt klappt alles, aber es funzt nett?
Ich stell den Code gleich nochmal online, aber bei mir läufts net.

EDIT: hier ist der Link: http://www.12see.de/userdaten/000200/71/download/updated.zip
Titel: Re: Compilerproblem
Beitrag von: DerHartmut am 14. October 2009, 11:25
Das ist ein Patch, den dir taljeth gegeben hat.

- Sind die zu ersetzenden Zeilen
+ Die neuen Zeilen

Per diff und patch kannst du den Patch auf deine Dateien anwenden.
Titel: Re: Compilerproblem
Beitrag von: kevin am 14. October 2009, 11:27
Das ist ein Patch, Zeilen mit - müssen gelöscht werden, Zeilen mit + kommen neu rein, Codezeilen ohne was vorne dran dienen deiner Orientierung, wo sich der entsprechende Code befindet. Du hast nicht wirklich gemacht, was dieser Patch sagt.

Wie kommst du auf die Idee, es könnte funktionieren, wenn du in scanf() eine lokale Variable key definierst und in main() eine andere lokale Variable key?
Titel: Re: Compilerproblem
Beitrag von: Cool-Andy am 14. October 2009, 11:50
ah, Denkfehler von mir (bin Windowsnutzer) werds glei mal ausprobieren.
Titel: Re: Compilerproblem
Beitrag von: ChristianF am 14. October 2009, 11:51
@ChristianF: scanf ist hochgradig nichttrivial, aber versuch's mal. Ich suche dann auch Fehler. ;)
Nun ja, man kann ja fürs erste nur Ganzzahlen und einzelne chars, sowie strings einlesen. Das ganze dann aber ohne den Krempel voran also nur "%d" und nicht "%010d" oder so.  :-D
Titel: Re: Compilerproblem
Beitrag von: kevin am 14. October 2009, 12:05
Dann ist es aber kein richtiges scanf. Aber viel mehr braucht es auch nicht, damit es wirklich spaßig wird, %i oder %x reichen schon. ;)
Titel: Re: Compilerproblem
Beitrag von: Cool-Andy am 14. October 2009, 16:04
Dann ist es aber kein richtiges scanf. Aber viel mehr braucht es auch nicht, damit es wirklich spaßig wird, %i oder %x reichen schon. ;)
Über sowas mach ich mir später gedanken (sollte Es mal laufen). Folgendes: Hab`s gepatcht (code für "kb.c" steht unten) aber: es läuft immer noch nicht. Solangsam zweifel ich, ob es nicht an mir liegt.

kb.c:
char key[80];

static inline unsigned char inb(unsigned short port)
{
unsigned char val;
__asm__ __volatile__("inb %1, %0" : "=a" (val) : "Nd" (port));
return val;
}

void scanf () // Aufruf durch "scanf();"
{
volatile int scancode;
int z;
int i;
char string[80];

static unsigned scantable[1024] = { // Scancodetabelle
[0x02] = '1',
[0x03] = '2',
[0x04] = '3',
[0x05] = '4',
[0x06] = '5',
[0x07] = '6',
[0x08] = '7',
[0x09] = '8',
[0x0a] = '9',
[0x0b] = '0',
[0x0c] = '?',
[0x0d] = '`',
[0x0e] = '^',
[0x0f] = '^',
[0x10] = 'q',
[0x11] = 'w',
[0x12] = 'e',
[0x13] = 'r',
[0x14] = 't',
[0x15] = 'z',
[0x16] = 'u',
[0x17] = 'i',
[0x18] = 'o',
[0x19] = 'p',
[0x1a] = '^',
[0x1b] = '*',
[0x1c] = '\n', // Enter
[0x1d] = '^',
[0x1e] = 'a',
[0x1f] = 's',
[0x20] = 'd',
[0x21] = 'f',
[0x22] = 'g',
[0x23] = 'h',
[0x24] = 'j',
[0x25] = 'k',
[0x26] = 'l',
[0x27] = '^',
[0x28] = '^',
[0x29] = '<',
[0x2a] = '^',
[0x2b] = '#',
[0x2c] = 'y',
[0x2d] = 'x',
[0x2e] = 'c',
[0x2f] = 'v',
[0x30] = 'b',
[0x31] = 'n',
[0x32] = 'm',
[0x33] = ',',
[0x34] = '.',
[0x35] = '_',
[0x36] = '^',
[0x37] = '^',
[0x38] = '^',
[0x39] = ' ',
[0x3a] = '^',
[0x3b] = '^',
[0x3c] = '^',
[0x3d] = '^',
[0x3e] = '^',
[0x3f] = '^',
[0x40] = '^',
[0x41] = '^',
[0x42] = '^',
[0x43] = '^',
[0x44] = '^',
[0x45] = '^',
[0x46] = '^',
[0x47] = '^',
[0x48] = '^',
[0x49] = '^',
[0x4a] = '-',
[0x4b] = '^',
[0x4c] = '^',
[0x4d] = '^',
[0x4e] = '+',
[0x4f] = '^',
[0x50] = '^',
[0x51] = '^',
[0x52] = '^',
[0x53] = '^',
[0x54] = '^',
[0xd9] = '^',
[0xda] = '^',
};


for (z=0; z<79; z++)
{
// Solange warten, wie der Input Buffer leer ist
while ((inb(0x64) & 1) == 0) {}

// Scancode auslesen (dadurch wird die Taste aus dem Input Buffer entfernt)
scancode = inb(0x60);

if (scancode & 0x80)
{
z--;
continue;
}

if(string[z] == '\n')
{
z++;
break;
}

string[z] = scantable[scancode];
}

string[z] = '\0'; // String abschließen

i = 1;
for (i=0; i<80; i++) // Byteweises kopieren (key --> string)
{
key[i] = string[i]; // key --> globale "char*"-Variable
}
}


und global.h:
// --- Globale Variablen ---

#ifndef _GLOBAL_H_
#define _GLOBAL_H_

/// Aktuell entgegengenommene Taste
extern char key[];

#endif // ifndef _GLOBAL_H_


Hab ich mich im Code vertippt oder was ist da los?  :?
Titel: Re: Compilerproblem
Beitrag von: kevin am 14. October 2009, 16:44
Ich seh hier keinen offensichtlichen Fehler. Wie sieht es in der main.c aus, hast du dort auch die lokale Definition von key entfernt?
Titel: Re: Compilerproblem
Beitrag von: Cool-Andy am 14. October 2009, 16:47
main.c:
/* --- KERNEL --- */

#include "video.h"
#include "kb.h"
#include "global.h"

void kernel()
{
    cls();
    cls();
printf("Welcome\n");
printf("root> ");

loop:
scanf();
printf(key);
goto loop;
}
Titel: Re: Compilerproblem
Beitrag von: Cool-Andy am 15. October 2009, 06:39
Juhu, ich hab die Lösung gefunden:

for (z=0; z<79; z++)
{
// Solange warten, wie der Input Buffer leer ist
while ((inb(0x64) & 1) == 0) {}

// Scancode auslesen (dadurch wird die Taste aus dem Input Buffer entfernt)
scancode = inb(0x60);

if (scancode & 0x80)
{
z--;
continue;
}

if(string[z] == '\n')         // <-- fragt Enter ab
{
z++;
break;
}

string[z] = scantable[scancode];  // <- Enter wird aber erst hier eingetragen
}

Die Lösung:

for (z=0; z<79; z++)
{
// Solange warten, wie der Input Buffer leer ist
while ((inb(0x64) & 1) == 0) {}

// Scancode auslesen (dadurch wird die Taste aus dem Input Buffer entfernt)
scancode = inb(0x60);

if (scancode & 0x80)
{
z--;
continue;
}

if(string[z] == 0x1c)  //<-- Enter abfragen
{
z++;
break;
}

string[z] = scantable[scancode];
}
Titel: Re: Compilerproblem
Beitrag von: Cool-Andy am 15. October 2009, 06:41

Vielen Dank, an alle die, die mir geholfen haben.  :-D
Titel: Re: Compilerproblem
Beitrag von: XanClic am 15. October 2009, 18:32
Das sieht aber so ehrlich gesagt nicht ganz richtig aus, da du string[z] ja noch gar nicht gesetzt hast.
Ich würde es also folgendermaßen machen:
for (z=0; z<79; z++)
{
    // Solange warten, wie der Input Buffer leer ist
    while ((inb(0x64) & 1) == 0) {}

    // Scancode auslesen (dadurch wird die Taste aus dem Input Buffer entfernt)
    scancode = inb(0x60);

    if (scancode & 0x80)
    {
        z--;
        continue;
    }

    string[z] = scantable[scancode];

    if(string[z] == '\n')  //<-- Enter abfragen
    {
        z++;
        break;
    }
}