Autor Thema: Compilerproblem  (Gelesen 12318 mal)

kevin

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

Cool-Andy

  • Gast
Gespeichert
« Antwort #21 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.
« Letzte Änderung: 11. October 2009, 20:02 von Cool-Andy »

kevin

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

Cool-Andy

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

kevin

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

Cool-Andy

  • Gast
Gespeichert
« Antwort #25 am: 12. October 2009, 16:41 »
ja, danke, das wäre wirklich sehr nett.  :-D

Cool-Andy

  • Gast
Gespeichert
« Antwort #26 am: 14. October 2009, 06:34 »
wie sieht`s denn aus, kannst du den code bald posten?

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
« Antwort #27 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. :)

Cool-Andy

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

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
« Antwort #29 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... :)

Cool-Andy

  • Gast
Gespeichert
« Antwort #30 am: 14. October 2009, 09:11 »
Wie schon gesagt, ich bin Anfänger der blutigsten Art :-D und lerne gern, also nur zu!

kevin

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

Cool-Andy

  • Gast
Gespeichert
« Antwort #32 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
« Letzte Änderung: 14. October 2009, 10:45 von Cool-Andy »

DerHartmut

  • Beiträge: 236
    • Profil anzeigen
    • Mein Blog
Gespeichert
« Antwort #33 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.
$_="krJhruaesrltre c a cnp,ohet";$_.=$1,print$2while s/(..)(.)//;
Nutze die Macht, nutze Perl ;-)

kevin

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

Cool-Andy

  • Gast
Gespeichert
« Antwort #35 am: 14. October 2009, 11:50 »
ah, Denkfehler von mir (bin Windowsnutzer) werds glei mal ausprobieren.

ChristianF

  • Beiträge: 296
    • Profil anzeigen
    • DeutschOS - Betriebssystem Projekt
Gespeichert
« Antwort #36 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

kevin

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

Cool-Andy

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

kevin

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

 

Einloggen