Autor Thema: Compilerproblem  (Gelesen 12264 mal)

Cool-Andy

  • Gast
Gespeichert
« 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.

Tobiking

  • Beiträge: 24
    • Profil anzeigen
Gespeichert
« Antwort #1 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'.

chris12

  • Beiträge: 134
    • Profil anzeigen
Gespeichert
« Antwort #2 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
« Letzte Änderung: 10. October 2009, 18:35 von chris12 »
OS? Pah! Zuerst die CPU, dann die Plattform und _dann_ das OS!

Cool-Andy

  • Gast
Gespeichert
« Antwort #3 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?

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #4 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.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Cool-Andy

  • Gast
Gespeichert
« Antwort #5 am: 10. October 2009, 20:24 »
Aaah, mir geht ein Lichtlein auf!
Danke, werd ich gleich mal ausprobieren  :lol:

chris12

  • Beiträge: 134
    • Profil anzeigen
Gespeichert
« Antwort #6 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

« Letzte Änderung: 10. October 2009, 22:06 von chris12 »
OS? Pah! Zuerst die CPU, dann die Plattform und _dann_ das OS!

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 10. October 2009, 22:02 »
string[z] statt *string, und kein string++
Dieser Text wird unter jedem Beitrag angezeigt.

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #8 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';

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #9 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',
};
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Cool-Andy

  • Gast
Gespeichert
« Antwort #10 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!

Cool-Andy

  • Gast
Gespeichert
« Antwort #11 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++;
}
}

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #12 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?
Dieser Text wird unter jedem Beitrag angezeigt.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #13 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. ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Cool-Andy

  • Gast
Gespeichert
« Antwort #14 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!?  :|

chris12

  • Beiträge: 134
    • Profil anzeigen
Gespeichert
« Antwort #15 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;
OS? Pah! Zuerst die CPU, dann die Plattform und _dann_ das OS!

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 11. October 2009, 18:13 »
Der String liegt auf dem Stack, der ist nicht mehr gültig, nachdem die Funktion beendet ist.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Cool-Andy

  • Gast
Gespeichert
« Antwort #17 am: 11. October 2009, 18:20 »
Und was heißt das jetzt konkret?

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #18 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.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Cool-Andy

  • Gast
Gespeichert
« Antwort #19 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
}
}
« Letzte Änderung: 11. October 2009, 18:46 von Cool-Andy »

 

Einloggen