Autor Thema: Warning: empty character constant ?  (Gelesen 6551 mal)

YoshiX650

  • Gast
Gespeichert
« am: 13. December 2013, 08:47 »
Guten Morgen,
ich lese grade von osdever.net eine Anleitung zum erstellen eines mini-mini-mini-... Betriebssystem.
Leider kriege ich eine Fehlermeldung wenn ich das ganze compilen will.
Fehler:http://goo.gl/dZggMt
Was kann ich tuen?

LG

PS: Mein Compiler ist GCC und mein System ist ein Mac

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 13. December 2013, 09:11 »
Hi,

er will dir sagen, dass du ' ' (mit Leerzeichen) statt '' schreiben sollst. Oder gleich videomem[i] = 0x0700;, da sowohl Leerzeichen wie auch '\0' nicht sichtbar sind.
Dieser Text wird unter jedem Beitrag angezeigt.

YoshiX650

  • Gast
Gespeichert
« Antwort #2 am: 13. December 2013, 10:47 »
Okay,
kann es sein das, das Tutorial etwas kaputt ist?
Hab beim compilen des Kernels gleich wieder ein Fehler.

streetrunner

  • Beiträge: 67
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 13. December 2013, 11:22 »
Das Tutorial ist nicht zum abschreiben gedacht (man sollte eher sagen nicht zum kopieren). Ein wenig Eigenleistung ist schon erforderlich, aber wirklich schwerwiegende Fehler hab ich bis jetzt nicht entdeckt. Was nicht heißen soll dass es keine geben könnte.

Zitat
Hab beim compilen des Kernels gleich wieder ein Fehler.
Wenn du uns verrätst welchen Fehler du hast findet sich bestimmt einer der ihn ausbessert.  :-)

YoshiX650

  • Gast
Gespeichert
« Antwort #4 am: 13. December 2013, 11:50 »
Der Fehler: http://goo.gl/7h4DQV

Ich schreibe übrings alles ab.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 13. December 2013, 13:55 »
Du sollst das Tutorial weder kopieren noch unverstanden abschreiben. :-)

Es ist uebrigens besser, statt einem Foto der Fehlermeldung einfach den Text der Fehlermeldung hier reinzukopieren (z.B. in Code-Tags) und am besten noch gleich den betreffenden Code dazu.

Beide Compilerausgaben sind keine Fehler, sondern nur Warnungen. Im zweiten Fall deklarierst du eine Funktion mit einem Rueckgabewert, hast aber kein return in der Funktion drin - im ersten Fall handelt es sich um den Hinweis, dass ein Stringliteral in C++ nicht mehr automatisch in einen normalen C-String umgewandelt werden sollte. Ueberhaupt ist C++ im Kernel immer so eine Sache: Wenige Dinge funktionieren, viele Features brauchen aber eine Laufzeitunterstuetzung (z.B. funktionierende Speicherverwaltung, Multithreading), und manche Eigenschaften sind in einem Kernel nicht wirklich nutzbar.

Wenn du dich mit den Details nicht auskennst, ist es vermutlich erstmal einfacher, bei C zu bleiben.

Gruss,
Svenska

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 13. December 2013, 14:19 »
Die Bezeichnung Stringliteral ist hier einwenig irreführend. Mein g++ spricht von string constant. Das Problem ist das ein "String wie dieser" konstant ist, und der korrekte Type const char* ist.

Folgender code segfaultet z.B. weil "abc" in einer read-only section liegt. (g++ meckert, gcc nicht)
int main() {
  char* a = "abc"
  a[0] = 'b';
  return 0;
}
« Letzte Änderung: 13. December 2013, 14:21 von MNemo »
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

streetrunner

  • Beiträge: 67
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 13. December 2013, 23:24 »
Das würde ich aber unter Compiler-Fehler verbuchen, da du in deinem Code ja extra NUR char* als Typ angegeben hat und der Compiler merken sollte dass du deinen String beschreibst (welcher ja mit eignedlich nichts anderes als ein array ist)

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 13. December 2013, 23:51 »
Überrascht mich auch etwas, aber das knallt tatsächlich. :?
Ersetzt man *a durch a[], funktioniert es.
Schreibt man const davor, gibt es in beiden Fällen einen Compilerfehler (logisch).

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 15. December 2013, 13:45 »
char[] ist ja auch was anders als char*. Ersteres erzeugt ein neues Array, das nur mit dem Literal initialisiert wird, während letzteres ein Pointer direkt auf das Literal ist.

Und zu Stringliteralen steht in C11, 6.4.5, Absatz 7:
Zitat
It is unspecified whether these arrays are distinct provided their elements have the
appropriate values. If the program attempts to modify such an array, the behavior is
undefined.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen