Forum: Compiler & IDEs sprintf() Funktion - kleines Problem


von Daniel S. (stoegi)


Lesenswert?

Hallo,
habe folgendes Problem:

Die Ausgabe von Int-Werten aufs LCD funktioniert einwandfrei mit der
sprintf() Funktion.

Nun möchte ich einen Float Wert ausgeben.

char buffer[10]; //Ein Beispiel
double wert = 1.234;
sprintf(buffer,"%f",wert);
lcd_writetext(buffer);  //Ausgabe aufs LCD

Was hab ich hier falsch gemacht, bzw. vergessen?!
Ich krieg auf dem Display ein Fragezeichen?!

Danke

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Du linkst nicht mit der printf()-Library mit
floatingpoint-Unterstützung.

von Daniel S. (stoegi)


Lesenswert?

was meinst du genau?!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Es gibt verschiedene Varianten der printf-Library, die sich in der Größe
unterscheiden. Die mit floatingpoint-Unterstützung ist die größte.
Für Anwendungen, die keine floatingpoint-Ausgabe benötigen, gibt es
daher auch eine printf-Library ohne floatingpoint-Unterstützung.

Und mit genau der linkst Du Deinen Code.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wie baust du denn dein Makefile zusammen?

Normalerweise existieren dort bereits Vorkehrungen, um die
printf- und scanf-Bibliotheken auszuwählen.

von Daniel S. (stoegi)


Lesenswert?

Hallo,
danke für die Hinweise, habe aber leider keine Ahnung um was es genau
geht, bin Anfänger auf C.

Habt ihr vielleicht konkrete Vorschläge, wie ich im Code vorgehen
sollte? Die Problemstellung kennt ihr ja bereits.
Also wie gesagt, die Anzeige von Int werten geht ohne Probleme mit
#include <stdio.h>
...;
sprintf(buffer,"%d",wert);
...;

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Es liegt nicht am Code, sondern an den Linkereinstellungen bzw.
Libraryangaben im Makefile.

Das haben Jörg und auch ich versucht Dir zu erklären.

von Daniel S. (stoegi)


Lesenswert?

Ok, habe verstanden.
Und wie ändere ich das jetzt ab :S

Sorry, stehe auf der Leitung

von Daniel S. (stoegi)


Lesenswert?

Vielleicht hilft das Makefile

######################################################################## 
#######
# Makefile for the project lcd_8
######################################################################## 
#######

## General Flags
PROJECT = lcd_8
MCU = atmega128
TARGET = lcd_8.elf
CC = avr-gcc.exe

## Options common to compile, link and assembly rules
COMMON = -mmcu=$(MCU)

## Compile options common for all C compilation units.
CFLAGS = $(COMMON)
CFLAGS += -Wall -gdwarf-2 -O0
CFLAGS += -MD -MP -MT $(*F).o -MF dep/$(@F).d

## Assembly specific flags
ASMFLAGS = $(COMMON)
ASMFLAGS += -x assembler-with-cpp -Wa,-gdwarf2

## Linker flags
LDFLAGS = $(COMMON)
LDFLAGS +=


## Intel Hex file production flags
HEX_FLASH_FLAGS = -R .eeprom

HEX_EEPROM_FLAGS = -j .eeprom
HEX_EEPROM_FLAGS += --set-section-flags=.eeprom="alloc,load"
HEX_EEPROM_FLAGS += --change-section-lma .eeprom=0


## Objects that must be built in order to link
OBJECTS = lcd.o

## Objects explicitly added by the user
LINKONLYOBJECTS =

## Build
all: $(TARGET) lcd_8.hex lcd_8.eep## Compile
lcd.o: ../lcd.c
  $(CC) $(INCLUDES) $(CFLAGS) -c  $<

##Link
$(TARGET): $(OBJECTS)
   $(CC) $(LDFLAGS) $(OBJECTS) $(LINKONLYOBJECTS) $(LIBDIRS) $(LIBS) -o
$(TARGET)

%.hex: $(TARGET)
  avr-objcopy -O ihex $(HEX_FLASH_FLAGS)  $< $@

%.eep: $(TARGET)
  avr-objcopy $(HEX_EEPROM_FLAGS) -O ihex $< $@

%.lss: $(TARGET)
  avr-objdump -h -S $< > $@

## Clean target
.PHONY: clean
clean:
  -rm -rf $(OBJECTS) lcd_8.elf dep/* lcd_8.hex lcd_8.eep

## Other dependencies
-include $(shell mkdir dep 2>/dev/null) $(wildcard dep/*)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Bau dir'n neues Makefile mit Mfile.  Da hast du dafür einen
Menüpunkt.  Ansonsten müsste es gehen, indem du

LIBS= -Wl,-u,vfprintf -lprintf_flt -lm

irgendwo im Makefile einfügst.

von Daniel S. (stoegi)


Lesenswert?

Hm,
habs probiert,
funzt aber noch nicht.
Hab jetzt in den Optionen folgendes gefunden:

"Link with these Objects"

Da hab ich libprintf_flt.a hinzugefügt!
war das ein richtiger weg?
Funktioniert aber immer noch nicht

von Daniel S. (stoegi)


Lesenswert?

Nochmals ich.
hab jetzt geschafft mit dem externen eigenen makefile, wo ich die zeile
eingefügt habe.

Build started 1.3.2006 at 17:57:19
avr-gcc.exe  -mmcu=atmega8 -Wall -gdwarf-2 -O0 -MD -MP -MT lcd.o -MF
dep/lcd.o.d  -c  ../lcd.c
../lcd.c:5: warning: return type of 'main' is not `int'
../lcd.c: In function `main':
../lcd.c:25: warning: unused variable `y'
avr-gcc.exe -mmcu=atmega8  lcd.o    -Wl,-u,vfprintf -lprintf_flt -lm -o
lcd_9.elf
avr-objcopy -O ihex -R .eeprom  lcd_9.elf lcd_9.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load"
--change-section-lma .eeprom=0 -O ihex lcd_9.elf lcd_9.eep
Build succeeded with 2 Warnings...

Geht aber immer noch nicht

von Daniel S. (stoegi)


Lesenswert?

SO,
sorry
habe das "s" vor printf vergessen.

Jetzt funktionierts.. vielen dank

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> habs probiert,

Was denn?

Sicher nicht Mfile.

> Hab jetzt in den Optionen folgendes gefunden:

> "Link with these Objects"

Dort gibt's nämlich sowas nicht.  Dafür einen Menüpunkt Makefile ->
printf() options...

> Da hab ich libprintf_flt.a hinzugefügt!
> war das ein richtiger weg?

Nein, das ist kein Objektmodul, sondern eine Bibliothek.  Diese
Bibliothek besitzt aber nur eine Implementierung für vfprintf().
Diese Funktion musst du zusätzlich mittels -uvfprintf noch dem Linker
als Anforderung mitgeben, andernfalls wird aus dieser Bibliothek
nichts gelinkt.  Gelinkt würde stattdessen das vfprintf() aus der
Standardbibliothek, nachdem es über die Auflösung von sprintf() aus
der Standardbibliothek anschließend plötzlich als undefined reference
auftaucht.  Zu diesem Zeitpunkt ist die Verarbeitung von
libprintf_flt.a aber bereits abgeschlossen und vergesen.

von Daniel S. (stoegi)


Lesenswert?

// get converted value
  double x = ADCW/1023.*5.;

  char buffer[5];
  sprintf(buffer,"%.3f",x);einstellen

  lcd_gotopos(2,6);
  lcd_writetext(buffer);

Egal, ich hab meine Programmierung jetzt so und hab die Zeile...
LIBS= -Wl,-u,vfprintf -lprintf_flt -lm
...ins Makefile dazugegeben und es funktioniert einwandfrei.

Danke Jörg

von Ralf (Gast)


Lesenswert?

komisch, in meinem Programm (atmega16) habe ich "sprintf" benutzt, im
Makefile keine Lib eingebunden und funktioniert trotzdem.

# Additional libraries
#
# Minimalistic printf version
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min
#
# Floating point printf version (requires -lm below)
#LDFLAGS +=  -Wl,-u,vfprintf -lprintf_flt
#
# -lm = math library
LDFLAGS += -lm

Gruß Ralf

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ja klar funktioniert sprintf auch so, nur eben nicht die
Gleitkomma-Formate.

von karlheinz (Gast)


Lesenswert?

sprintf()....

dieser oder ähnliche befehle sprengen den avrspeicher. sind sehr sehr
aufgebläht. am besten ist wenn man die routinen selber strickt, die
sind dann um ein etliches kleiner

von Daniel S. (stoegi)


Lesenswert?

Hallo,
also ich finde sprintf() sehr fein.
Habe jetzt mit sehr wenig Aufwand eine Dezimalzahl mit Nachkommastellen
auf meinem Display.
.......................................................

Ein paar Verständnisfragen hätte ich da aber noch.
1. Was hat das mit dem AVR Speicher zu tun am PC, bevor ich das HEX
file hinüber lade?
2. Liegt das daran, dass AVR Studio den ATmega8 simuliert und somit
nicht mehr Speicher hergibt?
3. Wieso funktioniert der Befehl sprintf() aber trotzdem sehr schön,
indem man nur das makefile ändert (libs)?

Vielen Dank
Stögi

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> dieser oder ähnliche befehle sprengen den avrspeicher.

Verallgemeinerungen sind immer richtig.

von karlheinz (Gast)


Lesenswert?

Erstens ist printf() eine recht komplexe Funktion (die folglich auch
sehr viel Code mit sich in den ROM schleppt)....

aus diesem fachforum und von dir noch unterstützt.
wenn du den code anschauen tust, weisst du wie umständlich diese
anweisung in c geschrieben wird. und die spr... ist noch complexer als
die pr...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

"und die spr... ist noch complexer als die pr..."

Wieso das denn?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Wieso das denn?

Weil er den Code vielleicht doch nicht angeguckt hat?  Sonst wüsste
er, dass alles da drin in vfprintf() passiert und alles andere nur
Wrapper darum sind.  Daher muss man auch mit -uvfprintf eine
undefinierte Referenz zu dieser Funktion erzwingen, denn nur diese
befindet sich in libprintf_flt.a, alle Wrapper wie printf() oder
sprintf() fehlen da drin.

Meine Bemerkung bezog sich nur auf die Unzulässigkeit einer
Verallgemeinerung: in einem ATtiny2313 will ich auch kein printf
haben, in einem ATmega8 kommt's drauf an (wenn der Platz dafür noch
frei ist, kann sich's damit einfacher debuggen lassen), auf einem
ATmega1281 interessiert's kein Schwein mehr wirklich, wieviel Platz
das braucht.  Da kann dann einfach keine Rede mehr sein von ,,sprengen
den avrspeicher''.

von Daniel S. (stoegi)


Lesenswert?

Tja,
vielen Dank,
hat mir doch um einiges weitergeholfen :)

von karlheinz (Gast)


Lesenswert?

ha...ha...ha....
ihr legt euch die eigene aussage so zurecht, so wie ihr sie braucht.
von dieser seite kann es aber nicht so sehen. verstanden hat das der
stoeger aber immer noch nicht und geholfen erst recht nicht.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das klingt wie der Ruf nach der Heise-Makrele. Dabei ist doch erst
Donnerstag ...

Oder könntest Du versuchen, Deine Aussage mit irgendwelcher Substanz zu
belegen?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ach, pebisoft will uns nur mal wieder die Steilvorlage
fürs Wochenende geben.

von Daniel S. (stoegi)


Lesenswert?

Hallo,
also ich muss sagen, der Beitrag von Karlheinz war nicht gerade mit
Niveau... Naja egal.
Auf jeden Fall, Hab ich vorher nicht so viel gewusst, wie jetzt, nachem
meine Frage beantwortet wurde.

Immerhin ist das Ergebnis da, nach dem ich suchte.

Vielen Dank,
ihr könnt ja weiter Diskutieren ;)

von karlheinz (Gast)


Lesenswert?

schaut euch mal das marktforum an....da könnt ihr menschen kennenlernen
aus eurem fach (studiert), die sich haben übers ohr hauen lassen mit
sogenannte schnäppchen. ich glaube so etwas spricht für sich.
ich dachte erst das man nur noch die ossis bescheissen kann, aber ihr
habt es auch anscheinend noch nicht gelernt, bzw die weisheit nicht mit
dem löffel gegessen. schaut euch ruhig einmal die namen an. es sind
namen von leuten hier aus dem forum,die den kopf immer stolz angehoben
haben...und nun diese blamage..he..he..es ist nicht immer gold was
glänzt und hier angeblich fachwissen von sich gibt.
wenn man im glashaus sitzt..he..he..

von Daniel S. (stoegi)


Lesenswert?

dein geschwafel hilft auch nicht.. ;)

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Da hat Jörg wohl voll ins Schwarze getroffen.
Ich hatte diese vermutung auch schon seit längerem...

von karlheinz (Gast)


Lesenswert?

"Forum - Sonstiges / Offtopic"

schaut euch mal dieses forum an.
den untertitel "karrikaturen" und andere.
ich habe den eindruck, das ein ganz grosser teil eine volksverhetzung
nebenbei betreibt. da tummeln sich naziparolen und
ausländerfeindlichkeit, ich wusste nicht das ihr zu dieser richtung
gehört. ich kann den betreiber der seiten nur raten, eine bessere
aufsicht und reinigung der seiten durchzuführen. ich glaube das es von
einer anzeige wegen volksverhetzung und ausländerbeleidigung nicht mehr
weit enfernt ist. ein tipp: die obengenannten seiten mal zu filzen.
aber schawchköpfe lassen sich leicht steuern. auch tauchen wieder
einige namen von euch auf. eine meldung dieser unmisslichkeiten ist
bald unumgänglich. es ist für mich als deutscher peinlich, wenn ich
beim ausländertreffen darauf hingewiesen werde.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Was hat das ganze mit der Benutzung verschiedener printf-Derivate zu
tun?

Nichts.

Ist irgendein Zusammenhang zur von "karlheinz" aufgestellten
Behauptung, daß sprintf deutlich mehr Code benötigen würde als printf,
zu erkennen? Oder gar eine Art Versuch, diese Behauptung zu erläutern?

Die Indiskutabilität einiger Beiträge im OT-Forum muss hier nicht
angesprochen werden, aber sie steht auch in keinerlei Zusammenhang mit
der fachlichen Qualifikation von Patrick, Jörg oder auch mir.

Vorschlag zur Güte:
Lerne denken.
Lerne lesen.
Lerne C.
Oder gehe woanders hin.

von karlheinz (Gast)


Lesenswert?

gerade muss dieses auch hier angesprochen werden.
ich weiss nicht ob du auch zu dieser gruppe gehören tust, du nimmst
diese hetzparolen gerade im schutz. die fachliche qualifikation spreche
ich patrick, jörg und dir ab. null ahnung habt ihr, nur ein
restgeschafele befindet sich in euer hirn, was sich noch vom studium
festgesetzt hat. ansonsten seit ihr nicht in der lage, euch auf neue
situation und neue fragesteller einzustellen. ihr seit wandelde wracks,
die aber auch keiner belastung standhalten, sondern sich nur mit dummen
fachgeschwafel über wasser halten. ihr seit nicht in der lage, alleine
ein kilo salz zu kaufen, soweit steht ihr abseits vom wirklichen
leben.
ich brauch nur einmal eure forumzeiten hier durchzugehen, dann weiss
man
, ihr steht alleine und einsam in der welt und schwätzt nur dumm
herum.
der eine oder andere von euch hat vielleicht ein pipijob, aber zur
leistung seit ihr nicht geboren.

von Fritz G. (fritzg)


Lesenswert?

@karlheinz

Säufst du?

von karlheinz (Gast)


Lesenswert?

nö.....,du???????????????

von derbrain (Gast)


Lesenswert?

So, nachdem unser kleiner Troll Karlheinz seinen Spaß hatte, möchte ich
gern auf das ursprüngliche Thema zurückkommen. Ich habe das selbe
Problem wie Daniel am Anfang, nämlich ein Fragezeichen im Output statt
einer Fließkommazahl.
Im Makefile hab ich brav
LIBS = -Wl,-u,vprintf -lprintf_flt -lm
eingetragen. Allerdings gibt es bei LDFLAGS nochmal -Wl. Ist das ein
Problem? Hab auch schon versucht alles in LDFLAGS reinzuschreiben, hat
auch nichts geändert...
Es geht um printf(), nicht sprintf(), aber das sollte im Prinzip doch
das gleiche sein, oder?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ja, es ist das gleiche.

Schreib mal die Kommandozeile auf, die "make" produziert, wenn es
den ganzen Job linken will.

Vielleicht hättest du ja auch besser 'nen neuen Thread angefangen
statt diese olle Kammelle wieder aufzuwärmen. ;-)  Ist jetzt zu
spät.

von Werner (Gast)


Lesenswert?


von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Werner, meinst du wirklich, der OP liest das nach über einem Jahr noch?

von Stoegi (Gast)


Lesenswert?

Normalerweise nicht;)
habe aber ein E-Mail bekommen

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.