Forum: Compiler & IDEs Keine Formatierung mit printf() auf C167


von Andy (Gast)


Lesenswert?

Hallo,

 ich versuche mittels printf() eine Ausgabe zu drucken. Dies 
funktioniert auch, allerdings funktioniert die Formatierung nicht 
richtig.
Beispiele:
printf("huhu\n") -> huhu
printf("test %d", 5) -> test 3568
Ich verwende den Tasking compiler auf einem C167 Prozessor, Modell 
small.
Laut Doku unterstützt das small Modell keine Formatierung, also habe ich 
noch die Library fmtiosm.lib dazugelinkt. Das hat nicht nicht geholfen.
Hab auch noch beim Compiler die Option "-libfmtiom" gesetzt, brachte 
aber auch keine Verbesserung.
1
...
2
Compiling cc166 -c -libfmtiom -c -v -WaEX -s -A1 -x -w68 -w91 -w27 -DSERIAL_DEBUG -DCMX -DTASKING -DCAN_MSG_LS_IN1 -DPreFront -DHW_V2 -DC166 -D_16BIT -I. -IC:/ND/ILX/Raph52/Share\LangC\oxf  -IC:/ND/ILX/Raph52/Share\LangC  -IC:/ND/ILX/Raph52/Share\LangC\osconfig\cmx -IC:/ND/ILX/Raph52/Share\maketmpl -Ic:\nd\cmx\tsk-c166 -D_DEBUG -Ms -O1 -g -o simio.obj simio.c
3
+ C:\ND\tsk_v8_5\c166\bin\c166 simio.c -o cc3008b.src -e -s -A1 -x -w68 -w91 -w27 -DSERIAL_DEBUG -DCMX -DTASKING -DCAN_MSG_LS_IN1 -DPreFront -DHW_V2 -DC166 -D_16BIT -I. -IC:/ND/ILX/Raph52/Share\LangC\oxf -IC:/ND/ILX/Raph52/Share\LangC -IC:/ND/ILX/Raph52/Share\LangC\osconfig\cmx -IC:/ND/ILX/Raph52/Share\maketmpl -Ic:\nd\cmx\tsk-c166 -D_DEBUG -O1 -g -Ms
1
+ C:\ND\tsk_v8_5\c166\bin\l166 LOC TO Net52_Online.out PTOG wst1main.obj C7SegmDisplay.obj CConfig.obj CDriveEncoder.obj CEEPROM.obj ... PSS_CA_Rulers.obj PSS_CB_Plates.obj PKG_Main.obj PSS_Z_Utilities.obj PKG_CanController.obj PKG_Can.obj c166_interrupts.obj simio.obj serio.obj WST1CMXa.OBJ cmx_166_init.obj C:\ND\TSK_V8_5\C166\lib\ext\fmtiosm.lib c:\nd\cmx\tsk-c166\liba66s.lib C:/ND/ILX/Raph52/Share\LangC\lib\WST1oxfds.lib ext\fmtiosm.lib ext\c166s.lib  ext\fp166s.lib ext\rt166s.lib GENERAL LSY "MEMORY(RAM(4000h-0dfffh)," "ROM(0000h-03FFFh,010000h-03BFFFh))" "IRAMSIZE(2048)" "RE(ME(0E000h-0EFFFh))" "RE(ME(0F200h-0F5FFh))" "HS(20000)" "SS(C166_US(512))"

Hat mir eventuell jemand einen Tipp, wie ich einfache Formatierungen 
hinbekomme bzw. was ich falsch mache? Vielen Dank.


Grüße, Andy

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Andy schrieb:
> printf("test %d", 5) -> test 3568

schon mal mit %i versucht anstelle von %d ?
teste auch mal, was bei %u passiert (mit 5, +5 und -5)

von Andy (Gast)


Lesenswert?

Hallo,

 ich habe mal folgenden code eingefügt:
1
printf("I-002: Start of CntInfo debug\n\0");
2
printf("test d: %d\n\0", 7);
3
printf("test s: %s\n\0", "huhu");
4
printf("test i: %i\n\0", 19);
5
printf("test +u: %u\n\0", 37);
6
printf("test -u: %u\n\0", -98);
und dabei folgende Ausgabe erhalten:
1
I-002: Start of CntInfo debug
2
test d: 26138
3
test s: 
4
test i: 26138
5
test +u: 26138
6
test -u: 26138

Grüße, Andy

von Bernd (Gast)


Lesenswert?

Ich würde statt Konstanten mal echte Variablen versuchen.
printf will doch nach dem Formatstring einen Zeiger auf das Argument 
bzw. die Argumente haben. Ich könnte mir vorstellen, das das bei C auf 
dem Mikrocontroller schief gehen kann.

Selbst auf dem Host klappt nicht alles 100%ig:
1
I-002: Start of CntInfo debug
2
test d: 7
3
test s: huhu
4
test i: 19
5
test +u: 37
6
test -u: 4294967198

von foobar (Gast)


Lesenswert?

Es scheint, dass die Varargs (stdarg.h) nicht funktionieren.  Das kann 
bei bestimmten Architekturen unter anderem daran liegen, dass der 
Compiler keinen Prototypen für die vararg-Funktion (wie z.B. printf) 
gesehen hat.  Hast du stdio.h included?  Evtl selbst mal nen Prototype 
angelegt? ("extern int printf(const char *, ...);").  Schreib mal ne 
eigene vararg-Funktion (mit Pointern und ints) zum Testen.  Was macht: 
printf("a %s %d %s\n", "b",42,"c"); und printf("a %d %s", 42, "b");

von Dirk B. (dirkb2)


Lesenswert?

Bernd schrieb:
> Ich würde statt Konstanten mal echte Variablen versuchen.

Wo ist da bei Call-by-Value der Unterschied.

> printf will doch nach dem Formatstring einen Zeiger auf das Argument
> bzw. die Argumente haben.

Nein. Es sei denn, es sind Strings. Und selbst Stringliterale zerfallen 
in eine Adresse auf das erste Zeichen


Bernd schrieb:
> Selbst auf dem Host klappt nicht alles 100%ig:I-002: Start of CntInfo
> test -u: 4294967198

Was erwartest du bei einem unsigned int (%u) und negativen Werten (-98)?

von Markus F. (mfro)


Lesenswert?

Andy schrieb:
> Laut Doku unterstützt das small Modell keine Formatierung,

Doku richtig lesen, das steht da nicht. Da steht:

> This SMALL version does not contain the required functionality to handle
> precision specifiers and floating point I/O

Formatierung wird also sehr wohl unterstützt (auch bei SMALL), lediglich 
precision specifiers und floating point nicht.

Bis zum Beweis des Gegenteils würde ich davon ausgehen, daß

#include <stdio.h>

vergessen wurde.

von Andy (Gast)


Lesenswert?

Hallo zusammen,

 vielen Dank für eure zahlreichen Antworten.
Das Problem ist nun gelöst. Des Rätsels Lösung war, wie foobar 
geschrieben hat, tatsächlich ein fehlender #include von <stdio.h>.
Habs zwar includiert, aber in einer Datei, wo ein printf ohne 
Formatierung verwendet wurde. Habs jetzt mal nochmals in der Datei 
includiert, in der die printf Formatierung verwendet wurde und es 
funktionierte. :-)

Ausgaben für folgenden Code:
1
printf("a %s %d %s\n", "b",43,"c");
2
printf("a %d %s\n", 42, "b");

Ausgabe ohne stdio.h:
1
a  3 
2
a 24968 …ú
Ausgabe mit stdio.h
1
a b 43 c
2
a 42 b

Vielen Dank nochmals...


Grüße, Andy

von Dirk B. (dirkb2)


Lesenswert?

Andy schrieb:
> Habs zwar includiert, aber in einer Datei, wo ein printf ohne
> Formatierung verwendet wurde. Habs jetzt mal nochmals in der Datei
> includiert, in der die printf Formatierung verwendet wurde und es
> funktionierte. :-)

Jede .c Datei wird für sich alleine compiliert. Die weiß nicht, was in 
anderen Dateien abgeht.
Um an diese Informationen bereitzustellen, gibt es die Header-Dateien.

Wenn du in einer Datei etwas aus einem anderen Modul brauchst, gibt es 
ein include.


Erst danach werden die (aus den .c entstandenen) Object-Dateien zusammen 
gebunden (gelinkt).

von Dirk B. (dirkb2)


Lesenswert?

Andy schrieb:
> tatsächlich ein fehlender #include von <stdio.h>

Das muss aber eine Warnung vom Compiler geben.
(Beim Aufruf von printf oder anderen Funktionen aus stdio.h)

Wenn nicht, daa musst du den Warnlevel erhöhen.

Behandele Warnungen wie Fehler (beseitige deren Ursache)

von Markus F. (mfro)


Lesenswert?

Andy schrieb:
> Das Problem ist nun gelöst.

... und für ein Fleißsternchen darftst Du uns noch erklären, *warum 
genau* das ohne
1
#include <stdio.h>

nicht funktioniert ;) .

Wenn Du das in Gänze verstanden hast, hast Du eine Menge über C gelernt.

von Blume (Gast)


Lesenswert?

Einfach mal so in den Raum geworfen
Es ist keine gute Idee (Embedded) SW zu testen so lange noch Warnungen 
ausgegeben werden oder man mit der Quelltext Formatierung noch nicht 
zufrieden ist. Bzw. man sich noch nicht an die Code Styles hält

von S. R. (svenska)


Lesenswert?

Blume schrieb:
> Es ist keine gute Idee (Embedded) SW zu testen so lange
> noch Warnungen ausgegeben werden oder man mit der Quelltext
> Formatierung noch nicht zufrieden ist.

Im Rahmen der Möglichkeiten teste ich während der Entwicklung 
ununterbrochen. Nichts ist schlimmer, als Probleme mit falschen Annahmen 
(versuchen) zu lösen. Daher achte ich auf zügige Turnaround-Zeiten 
(Dateiänderung -> Ergebnis im Log).

von MaWin (Gast)


Lesenswert?

Welcher Compiler, welche Version?

von Rolf M. (rmagnus)


Lesenswert?

Markus F. schrieb:
> Wenn Du das in Gänze verstanden hast, hast Du eine Menge über C gelernt.

Nicht über C selbst, sondern darüber, wie Compiler intern 
Funktionsaufrufe umsetzen. Auf C-Ebene ist es einfach nur undefiniertes 
Verhalten.

von Andy (Gast)


Lesenswert?

Hallo zusammen,

@MaWin: Der verwendete Compiler ist ein Tasking v8.5 compiler.

@DirkB: Bei dem Compiler kann man irgendwie keine Warnlevel erhöhen. Das 
gibt es da wohl nicht. Was geht ist bestimmte Warnungen komplett 
deaktivieren (zum Beispiel sind bei mir deaktiviert: -w68 -w91 -w27 
usw.)

68: function xxx, parameter yyy not used
91: no prototype of function xxx
27: unexpected text after control

Vermutlich fällt der besagte Fehler unter Warnung 91? Werds mal 
probieren. Hab leider davon jede Menge Warnungen. Weiss nicht genau 
warum.
Andere Frage dazu: Sind die Warnungen schlimm bzw. können Sie Probleme 
verursachen? Programm scheint gut zu laufen, nur gelegentlich gibt's 
Abstürze, aber wohl aus anderen Gründen.
Das Problem ist, ich verwende hier Rhapsody und dies generiert mir 
überall den Code. Für Funktionen werden stets Parameter verwendet, die 
zum Teil nicht verwendet werden (Warning 68). Auch bei Warning 27 werden 
zum Beispiel nach #endif Strichpunkt (;) Zeichen eingefügt, welche die 
Warnung 27 verursachen.

Grüße, Andy

von foobar (Gast)


Lesenswert?

Warnungen haben ihren Sinn, sie einfach blind abzuschalten kann nach 
hinten losgehen (hast du ja gerade gesehen).

Die Warnung 68 abzuschalten kann ich verstehen.  Sie soll vor 
Tippfehlern warnen.  Die übliche Methode, sie "abzuschalten" ist ein:
1
   (void)yyy; /*unused*/
im Body von xxx.  Einige benutzen ein entsprendes Makro: UNUSED(yyy);

Warnung 91 sollte man auf Systemen, die je nach Prototype 
unterschiedlichen Kode generieren, nie abschalten - umschalten auf ERROR 
wäre eher angebracht.

Die Warnung 27 solltest du einfach im Kode korrigieren.  Hinter #endif 
gehört kein Semikolon.  Früher war da mal beliebiger Text erlaubt, 
heutzutage macht man da einen richtigen Kommentar raus (#endif 
/*MSDOS*/)

von Dirk B. (dirkb2)


Lesenswert?

1
if (i = 0)
ist gültiger Code, macht aber bestimmt nicht das, was man möchte.

Darum gibt der Compiler eine Warnung

Code kann man auch mit hohem Warnlevel ohne Warnungen übersetzen.

von Andy (Gast)


Lesenswert?

Hallo,

 vielen Dank euch für die Infos.
Werde es beherzigen und den Code meines Vorgängers entsprechend 
anpassen...

Schöne Grüße, Andy

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.