mikrocontroller.net

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


Autor: Daniel Stoeger (stoegi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Daniel Stoeger (stoegi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was meinst du genau?!

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie baust du denn dein Makefile zusammen?

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

Autor: Daniel Stoeger (stoegi)
Datum:

Bewertung
0 lesenswert
nicht 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);
...;

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel Stoeger (stoegi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, habe verstanden.
Und wie ändere ich das jetzt ab :S

Sorry, stehe auf der Leitung

Autor: Daniel Stoeger (stoegi)
Datum:

Bewertung
0 lesenswert
nicht 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/*)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel Stoeger (stoegi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel Stoeger (stoegi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel Stoeger (stoegi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SO,
sorry
habe das "s" vor printf vergessen.

Jetzt funktionierts.. vielen dank

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Daniel Stoeger (stoegi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: karlheinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel Stoeger (stoegi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> dieser oder ähnliche befehle sprengen den avrspeicher.

Verallgemeinerungen sind immer richtig.

Autor: karlheinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"und die spr... ist noch complexer als die pr..."

Wieso das denn?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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''.

Autor: Daniel Stoeger (stoegi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja,
vielen Dank,
hat mir doch um einiges weitergeholfen :)

Autor: karlheinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Daniel Stoeger (stoegi)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: karlheinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: Daniel Stoeger (stoegi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dein geschwafel hilft auch nicht.. ;)

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

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

Autor: karlheinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: karlheinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Fritz Ganter (fritzg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@karlheinz

Säufst du?

Autor: karlheinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nö.....,du???????????????

Autor: derbrain (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Stoegi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Normalerweise nicht;)
habe aber ein E-Mail bekommen

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.