www.mikrocontroller.net

Forum: Compiler & IDEs Problem mit dtostre()


Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich beschäftige mich erst seit kurzen mit GCC. Mein Problem ist das ich
nicht weiss was es mit dem linken bei der Funktion 'dtostre()' auf
sich hat.
Ich habe gelesen das ich '#include <libm.a>' noch einfügen muss aber
was muss ich damit machen '-lm'?

Wo muss ich was reinschreiben???

Danke.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

falls du ein Makefile verwendest, bei LDFLAGS -lm hinzufügen, auf der
Komandozeile einfach gcc bla.c -lm

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm,
ich verstehe nicht so ganz wo ich das in der makefile eintragen muss.
sorry
Meinst du das so:
...
#---------------- Linker Options ----------------
#  -Wl,...:     tell GCC to pass this to linker.
#    -Map:      create map file
#    --cref:    add cross reference to  map file
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
LDFLAGS += $(EXTMEMOPTS)
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)

LDFLAGS = gcc test.c -lm

????

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LDFLAGS += -lm

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, das werde ich mal probieren. Danke!!

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Komisch, ich hab das jetzt so eingetragen

#---------------- Linker Options ----------------
#  -Wl,...:     tell GCC to pass this to linker.
#    -Map:      create map file
#    --cref:    add cross reference to  map file
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
LDFLAGS += $(EXTMEMOPTS)
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)

LDFLAGS += -lm

aber ich bekomme immer noch diese Meldung:

'test.c:5:18: libm.a: No such file or directory'

Was mach ich falsch?

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann solltest Du wohl die völlig unsinnige #include-Anweisung wieder
weglassen.
#include benutzt man nicht zum Einbinden von .a-Dateien.

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK,
ich hab die 'include' Anweisung weggelassen. Aber ich bekomme immer
noch diese Meldung:
"test.c:46: warning: implicit declaration of function `dtostre'"

Wieso?

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil die Funktion in <stdlib.h> deklariert ist und du das offenbar
nicht included hast.

Ja, sie ist leider trotzdem in libm.a implementiert, das ist ein
unglücklicher Umstand.  Normalerweise sollte libm.a nur die Funktionen
beinhalten, die in <math.h> deklariert sind.  Wir werden wohl
perspektivisch aber libm.a und libc.a vereinen, es hat sowieso nicht
viel Sinn, das in zwei Libs zu halten.  Derzeit musst du sie also
mittels -lm linken, was du ja schon tust.

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, hat geholfen diese Meldung zu verhindern.
Aber irgendwie scheint das Programm dort zu hängen. Ich will den Wert
des ADC auf dem LCD ausgeben aber ich bekomme nichts angezeigt!

int main(void)
{
  double result;
  double volt;
  char * Ausgabe;
  DDRD = 0x00;
  DDRC = 0xF8;
  DDRB = 0xFF;
  DDRA = 0x00;
  PORTA = 0x00;


  lcd_init(LCD_DISP_ON);

  SREG |= (1<<7);


  ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);

  ADCSRA |= (1<<ADSC);

 while(!(ADCSRA & (1<<ADIF)));
   volt = 0;
   result = 0;
   Ausgabe = 0;

  while(1)
   {
    ADCSRA |= (1<<ADSC);

    while(!(ADCSRA & (1<<ADIF)));
    result = ADC;
    ADCSRA |= (1<<ADIF);


    volt = result*0.0025;   //Faktor: Vref/1023


    dtostre(volt, Ausgabe, 2, 0);

    lcd_puts(Ausgabe);

   }
 }

Also der ADC müsste einwandfrei laufen, es muss danach irgendwas faul
sein. Denn wenn ich 'lcd_putc(result)' einfüge schmeisst mir das LCD
Zeichen raus.

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo ist denn der Speicher, auf den char *Ausgabe zeigt?

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ööh, gute Frage. Keine Ahnung was du genau damit meinst.
(Sorry ich bin noch C Anfänger)

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo bekomme ich denn mehr info zu diesen Thema mit 'char *'?

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wo bekomme ich denn mehr info zu diesen Thema mit 'char *'?

Im C-Buch deines geringsten Misstrauens. Oder mit google.de nach
C-Tutorial suchen. char* gehört zu den absoluten Grundlagen, das sollte
in nahezu jedem Tutorial enthalten sein.

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ööh, gute Frage. Keine Ahnung was du genau damit meinst.

Dass dein Zeiger namens Ausgabe ins Nirvana zeigt.  Woraufhin auch
immer er zeigt (vielleicht auf Adresse 0, das wäre dann ein Alias für
Register 0, vielleicht auch auf was völlig anderes -- RAMs haben nach
dem Einschalten in der Regel sehr zufällig aussehende Bitmuster), das
wird dann vom dtostre() überschrieben.  Das kann natürlich die
seltsamsten Effekte haben.

Für jeden Zeiger, den du benutzt, musst du dir stets vergegenwärtigen,
dass er auf ein gültiges Objekt zeigen muss.  Das musst du irgendwie
angelegt haben.  malloc() wäre sicher in deinem Falle overkill.  Du
willst eher sowas haben wie

...
  char Ausgabe[20];
...

  dtostre(volt, &Ausgabe, 2, 0);

Aber das allein soll dich bitte nicht davon abhalten, den Abschnitt
über Felder und Zeiger (Arrays and pointer) im C-Buch deiner Wahl
nochmal gründlich durchzugehen.

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, habe vergessen, vor dem Posten das Gehirn einzuschalten.  Es
muss natürlich

  dtostre(volt, Ausgabe, 2, 0);

heißen, da Felder in Form eines Zeigers auf ihr erstes Element an
Funktionen übergeben werden.

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.