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.
Hi, falls du ein Makefile verwendest, bei LDFLAGS -lm hinzufügen, auf der Komandozeile einfach gcc bla.c -lm
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 ????
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?
Dann solltest Du wohl die völlig unsinnige #include-Anweisung wieder weglassen. #include benutzt man nicht zum Einbinden von .a-Dateien.
OK, ich hab die 'include' Anweisung weggelassen. Aber ich bekomme immer noch diese Meldung: "test.c:46: warning: implicit declaration of function `dtostre'" Wieso?
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.
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.
Ööh, gute Frage. Keine Ahnung was du genau damit meinst. (Sorry ich bin noch C Anfänger)
> 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.
> Öö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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.