Autor Thema: Compiler entfernt linefeeds  (Gelesen 5396 mal)

AcidIO

  • Beiträge: 11
    • Profil anzeigen
Gespeichert
« am: 05. August 2009, 15:34 »
Wenn ich in meinem Code meine printf Funktion aufrufe entfernt gcc bei mir alle '\n' am Ende eines Strings.
Wenn ich statt printf meine puts Funktion aufrufe, oder das '\n' mitten inner halb eines Wortes schreibe(zum Beispiel: printf("Erf\nolgreich(Code %x)",0);) funktioniert alles problemlos.
Das Problem habe ich sowohl unter Windows als auch unter Linux.

Hier mal ein bisschen Code als Beispiel(Auszug aus meinem Tastaturtreiber, in dem das Problem auftritt):

void TestController()
{
printf("Teste Tastatur-Anschluss...");
// den befehl zum testen senden
writeCmd(0xAB);
// den rückgabewert holen
UINT8 err_code = readData();
// rückgabe überprüfen
switch(err_code)
{
case 0x00:
printf("Erfolgreich.\n");
break;
case 0x01:
printf("Fehler(Clock low).\n");
break;
case 0x02:
printf("Fehler(Clock high).\n");
break;
case 0x03:
printf("Fehler(Data low).\n");
break;
case 0x04:
printf("Fehler(Data high).\n");
break;
case 0xFF:
printf("Fehler(Komplettausfall).\n");
break;
default:
printf("Unbekannter Status(%x).\n", err_code);
break;
}
}

Wenn ich mir jetzt mit objdump oder einem Hexeditor das objectfile anschaue, kommt das Folgende:

Contents of section .rodata:
 0000 54657374 65205461 73746174 75722d41  Teste Tastatur-A
 0010 6e736368 6c757373 2e002e20 00457266  nschluss... .Erf
 0020 6f6c6772 65696368 2e004665 686c6572  olgreich..Fehler
 0030 28436c6f 636b206c 6f77292e 00466568  (Clock low)..Feh
 0040 6c657228 436c6f63 6b206869 6768292e  ler(Clock high).
 0050 00466568 6c657228 44617461 206c6f77  .Fehler(Data low
 0060 292e0046 65686c65 72284461 74612068  )..Fehler(Data h
 0070 69676829 2e004665 686c6572 284b6f6d  igh)..Fehler(Kom
 0080 706c6574 74617573 66616c6c 292e0055  plettausfall)..U
 0090 6e62656b 616e6e74 65722053 74617475  nbekannter Statu
 00a0 73282578 292e0a00 54657374 65205461  s(%x)...Teste Ta
 00b0 73746174 75722e2e 2e20004f 4b2e0046  statur... .OK..F
 00c0 65686c65 72282578 292e0a00 4b6f6e66  ehler(%x)...Konf
 00d0 69677572 69657265 20546173 74617475  iguriere Tastatu
 00e0 722e2e2e 2000

Ich habe auch schon alle moglichen Compileroptionen durchprobiert, die damit was zu tun haben könnten(Optimierungen, etc..) doch das hat auch nichts gebracht.

Vlt. weiß ja einer von euch woran das liegen könnte...
Wer nichts wagt kann nichts verlieren...

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 05. August 2009, 15:40 »
Der GCC optimiert ein printf("foo\n") zu einem puts("foo"), weil ein standardkonformes puts automatisch ein \n ausgibt.

Ich schätze da gibts es mindestens folgende Möglichkeiten:
- printf nicht printf nennen
- oder standardkonformes puts implementieren
- oder angeblich soll da -fno-builtin oder -fno-builtin-printf helfen.

-> http://www.ciselant.de/projects/gcc_printf/gcc_printf.html
Dieser Text wird unter jedem Beitrag angezeigt.

AcidIO

  • Beiträge: 11
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 05. August 2009, 15:47 »
Ahh...

Danke für den Hinweis, mein puts war nicht Standartkonform(es hat kein '\n' am Ende mitausgegeben).

Jetzt geht alles, thx.
Wer nichts wagt kann nichts verlieren...

 

Einloggen