Forum: Mikrocontroller und Digitale Elektronik Fehlermeldund beim Compilieren undefined reference


von Wieso??? (Gast)


Lesenswert?

Hallo ich habe ein Program wo ich einen kleinen Befehl in die main.c 
datei hinzugefügt habe und zwar den Befehl:

lcd_clrscr();
print_rc5(code_input);

Jetzt bekomme ich beim compilieren die Fehlermeldung

undefined reference to 'print_rc5'

Was mache ich falsch?Bitte verständlich erklären da ich keine guten 
Programmierkenntnisse habe

von mar IO (Gast)


Lesenswert?

Zwar gebe ich dir jetzt keine Antwort auf deine Frage, aber such mal 
nach "undefined reference" hier im Forum. Du bist nicht der erste der 
dieses Problem hat! Das bringt dich sicher weiter, auch wenn es etwas 
lesearbeit ist.

von Stephan W. (sir_wedeck)


Lesenswert?

Hi

dein Compiler kennt die Funktion nicht!
"print_rc5"

Wie kommst du auf die Idee diese dort ein zufügen?
Vielleicht fehlt dir die Lib dafür!

Stephan

von Karl H. (kbuchegg)


Lesenswert?

Wieso??? schrieb:
>
> lcd_clrscr();
> print_rc5(code_input);
>
> Jetzt bekomme ich beim compilieren die Fehlermeldung
>
> undefined reference to 'print_rc5'

undefined reference ist eine Fehlermeldung vom Linker, der die Aufgabe 
hat, aus den Einzelteilen das komplette Programm zusammenzubauen.

Und sie besagt, dass der Linker in den Teilen, die du ihm zum 
Zusammenbau gegeben hast, keine Implementierung für print_rc5 gefunden 
hat.

Ist ein bischen so, wie wenn du beim IKEA am Tresen stehst und dich 
beschwerst, dass das Drehelement aus der Anleitung nicht in der Packung 
war: undefined Reference zu Drehelement.

Und der freundliche Herr erklärt dir, dass du die 2te Schachtel aus dem 
Regal auch noch hättest mitnehmen müssen.

von Wieso??? (Gast)


Lesenswert?

Ja danke für die Antworten,es ist nicht schlimm das Ihr mir die Lösung 
nicht vorkaut.Das möchte ich auch garnicht.

Lesen BILDET!!!

von Wieso??? (Gast)


Lesenswert?

Hallo ich bins nochmal,

Also ich glaube ich weiß woran es liegt und zwar habe ich ja einfach den 
Befehl in die main.C eingefügt.Aber ich habe diese funktion garnicht 
definiert.Kennt ihr vielleicht eine Seite wo mir erklärt wird wie ich 
funktionen definiere?Weil ich habe jetzt einfach mal in die Header Datei 
main.h die funktion print eingefügt mit dem argument (void) was ja für 
mich nicht richtig ist weil ich ja den RC5 code ausgeben möchte.

von Thomas K. (rlyeh_drifter) Benutzerseite


Lesenswert?

ok, der Ansatz war schonmal nicht schlecht.

Die Funktion sollte, bevor du sie im c-file (.c) aufrufst, in einer 
header Datei (.h) stehen mit allen Parametern die sie so erwartet.
Die Suchbegriffe sind Deklaration (angeben wie sie von außen aussieht) 
und Definition (was dann drinnen passiert)

Woher kommt die Idee gerade die Funktion print_rc5 zu verwenden? Dort wo 
die Funktion herkommt findet sich bestimmt eine Deklaration.

von Wieso??? (Gast)


Lesenswert?

Die Idee ist mir gekommen weil ich eine Schaltung habe die uber einen 
TSOP gesteuert wird und den RC5 code benutzt.Daran ist ein LCD 
angeschlossen was mir sobiso schon Werte eines SHT11 anzeigt.Weil meine 
Fernbedienung nicht so toll das RC5 sendet dachte ich mir lass ich mir 
den RC5 code anzeigen sodas ich die RC5 datei anpassen kann damit ich 
die Schaltung endlich richtig steuern kann

von Karl H. (kbuchegg)


Lesenswert?

Wieso??? schrieb:
> Hallo ich bins nochmal,
>
> Also ich glaube ich weiß woran es liegt und zwar habe ich ja einfach den
> Befehl in die main.C eingefügt.Aber ich habe diese funktion garnicht
> definiert.Kennt ihr vielleicht eine Seite wo mir erklärt wird wie ich
> funktionen definiere?Weil ich habe jetzt einfach mal in die Header Datei
> main.h die funktion print eingefügt mit dem argument (void) was ja für
> mich nicht richtig ist weil ich ja den RC5 code ausgeben möchte.

Na ja, irgendwo muss ja die Funktion
print_rc5(code_input);
herkommen. Sprich: Irgendwer muss sie ja einmal geschrieben haben.

Wie kommst du denn auf die Idee, dass es diese Funktion gibt, dass sie 
genau so heißt und das sie diese Argumente nimmt. So etwas saugt man 
sich ja nicht einfach aus den Fingern.

von Wieso??? (Gast)


Lesenswert?

Der Ersteller des Programms hat mich darauf hingewissen

von Karl H. (kbuchegg)


Lesenswert?

Wieso??? schrieb:
> Der Ersteller des Programms hat mich darauf hingewissen

Schön.
Und kannst du eine entsprechende Funktion in dem was der Ersteller 
geschrieben hat finden?

von Wieso??? (Gast)


Lesenswert?

Nein deswegen muss ich das ja selber irgendwie hinkriegen.Ich muss 
irgendwie es schaffen den RC5 Code der ja sobiso schon im Programm code 
benutzt wird in die Print funktion einzufügen

von Karl H. (kbuchegg)


Lesenswert?

Wieso??? schrieb:
> Nein deswegen muss ich das ja selber irgendwie hinkriegen.Ich muss
> irgendwie es schaffen den RC5 Code der ja sobiso schon im Programm code
> benutzt wird in die Print funktion einzufügen

Aus deinem Gebrabbel wird keiner wirklich schlau.
Hast du nun eine Funktion print_rc5 oder hast du sie nicht?
Wenn nicht, was hindert dich daran, eine zu schreiben?
print_rc5 klingt jetzt erst mal nicht gerade nach komplizierter 
Raketentechnik.

von Wieso??? (Gast)


Lesenswert?

Nein habe die Funktion nicht!!!

Ich möchte ja eine funktion schreiben habe ich auch getan aber ich weiß 
nicht wie ich der Funktion sage das sie den RC5 code verwenden soll

von Karl H. (kbuchegg)


Lesenswert?

Wieso??? schrieb:
> Nein habe die Funktion nicht!!!
>
> Ich möchte ja eine funktion schreiben habe ich auch getan aber ich weiß
> nicht wie ich der Funktion sage das sie den RC5 code verwenden soll

Hast du doch schon

print_rc5(code_input);


Jetzt muss nur noch in der Funktion Code rein, der mit dem übergebenen 
etwas anfangen kann. Ich geh mal davon aus, dass code_input einfach nur 
1 Byte ist (du zeigst ja keinen Code, aus dem man wenigstens mal 
irgendwas entnehmen könnte). Also lass dir doch ganz einfach mal dieses 
1 Byte auf deinem LCD ausgeben. Da stehen dann Zahlen auf dem LCD. Dann 
drückst du auf deiner Fernsteuerung Tasten und schaust dir an, welche 
Zahlen kommen. Und daruas ziehst du dann deine Schlüsse, wie du die 
print_rc5 Funktion aufbohren willst, damit auf deinem LCD auch wirklich 
'Lauter' steht, wenn du auf die Lauter Taste drückst.

(Oder was auch immer du dir vorstellst, was dann auf dem LCD auftauchen 
soll)

RC5 Code sind erst mal einfach nur Zahlen! Lass sie dir ausgeben und 
sieh nach welche Zahl welcher Taste entspricht, wenn du was anderes als 
diese Zahlen auf der Anzeige haben willst.

Abgesehen davon:
Kauf dir ein C-Buch und fang an C zu lernen.

von Wieso??? (Gast)


Lesenswert?

Hier der Teil aus main.c

  while(1)        // main loop
  {

    if (new_rc5_data())
    {
      code_input = get_rc5_code();    // read two bytes from interrupt !

      lcd_clrscr();
      print_rc5(code_input);


Und hier ist die main.h

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <stdio.h>
#include "types.h"
#include "lcd.h"

#define uchar unsigned char
#define uint unsigned int

#ifndef XTAL
#define XTAL 16000000              /**< clock frequency in Hz, used to 
calculate delay timer */
#endif

#define F_CPU 16000000L

#define LPM(i) (__LPM_classic__(i))

//---------------------------------------------------------------------- 
------------
//  Definition Ausgänge
//---------------------------------------------------------------------- 
------------

#define OUT_PORT   PORTA

#define OUT1     PA7  // Relais 1
#define OUT2     PA6  // Relais 2
#define OUT3     PA5  // Relais 3
#define OUT4     PA4  // Relais 4
#define OUT5     PA3  // Relais 5

//---------------------------------------------------------------------- 
------------
//  Definition Eingänge
//---------------------------------------------------------------------- 
------------

#define  xRC5_IN    PIND
#define  xRC5     PD2  // IR input low active

#define DCF77_PIN  PIND
#define DCF77_PORT  PORTD
#define DCF77_DDR  DDRD
#define DCF77    PD3
#define DCF77_PON  PD4

//---------------------------------------------------------------------- 
------------
//  Strukturen
//---------------------------------------------------------------------- 
------------

struct stime
{
  unsigned char mm;
  unsigned char hh;
};

struct ssetup
{
  unsigned char dcf77_on;
  unsigned char feu_soll;
  unsigned char tem_soll;
  struct stime CH3_on;
  struct stime CH3_off;

  struct stime CH4_on;
  struct stime CH4_off;

  struct stime CH5_on;
  struct stime CH5_off;

  struct stime reg_on;
  struct stime reg_off;

  unsigned char tem_hyst;
  unsigned char feu_hyst;
};

//---------------------------------------------------------------------- 
------------
//  globale Variablen
//---------------------------------------------------------------------- 
------------

extern   unsigned int  rc5_data;  // store result

//---------------------------------------------------------------------- 
------------
//  Funktionsprototypen
//---------------------------------------------------------------------- 
------------

void ter_menu (void);      //Menüführung für Terrariumsteuerung
void delay_ms(int ms);      //Warte Funktion
void set_output( void );    //Ausgänge der Terrariumsteuerung setzen
void get_basic_setup(int leer);    //Läd die Grundeinstellungen, die in 
der Funktion eingetragen sind
void save_setup(int leer);
void load_setup(int leer);
void Start_SHT11(void);      //Startroutine für den SHT11 Sensor
void manual_mode(void);      //Handbetrieb

von Wieso??? (Gast)


Lesenswert?

Ich bin zu blöd krieg es nicht hin.

von Simon K. (simon) Benutzerseite


Lesenswert?

Du bist aber auch merkbefreit. Nicht mal in passende Formatier-Tags oder 
Anhang (.c/.h) kannst du deinen Code packen.

von abc (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Wie kommst du denn auf die Idee, dass es diese Funktion gibt, dass sie
> genau so heißt und das sie diese Argumente nimmt. So etwas saugt man
> sich ja nicht einfach aus den Fingern.
Das ist der BASCOM- bzw. Bauklötzchenprogrammierungs-Virus...

> Ist ein bischen so, wie wenn du beim IKEA am Tresen stehst und dich
> beschwerst, dass das Drehelement aus der Anleitung nicht in der Packung
> war: undefined Reference zu Drehelement.

> Und der freundliche Herr erklärt dir, dass du die 2te Schachtel aus dem
> Regal auch noch hättest mitnehmen müssen.
Der Vergleich ist GENIAL! Du solltest deine ganzen Beiträge hier im 
Forum mal zu einem Buch linken ähhh.... zusammenpacken, "C mit 
Alltagssprache verständlich erklärt" ;-)

von Karl H. (kbuchegg)


Lesenswert?

Wieso??? schrieb:
> Hier der Teil aus main.c
>
>   while(1)        // main loop
>   {
>
>     if (new_rc5_data())
>     {
>       code_input = get_rc5_code();    // read two bytes from interrupt !

und haben diese beiden bytes auch einen Datentyp?


> Ich bin zu blöd krieg es nicht hin.

Wie gibst du denn woanders Zahlen aufs LCD aus?
Du hast doch, wenn ich das richtig verstanden habe, eine Funktion die 
SHT11 Codes ausgeben kann. An der kannst du dich erst mal orientieren, 
wie man Dinge am LCD ausgibt. Alles was du fürs erste brauchst, sind 
HEX-Zahlen am LCD. Das ist nun wirklich pipifax, weil sprintf die ganze 
Arbeit macht sofern keine andere Funktion dafür im Programm vorhanden 
ist.

Im Übrigen: Verzeih aber etwas am LCD auszugeben, wenn das LCD 
grundsätzlich schon läuft ist eine Anfängrübung. Das musst du alleine 
hinkriegen. Genauso wie eine Funktion schreiben.

So hat das alles keinen Sinn. Ohne entsprechende Grundlagen ist es 
sinnlos, da noch weiter zu machen. Wer mit einem Schraubenzieher nicht 
umgehen kann, sollte nicht einen Benzinmotor auf Diesel umzubauen 
versuchen.

von abc (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> So hat das alles keinen Sinn. Ohne entsprechende Grundlagen ist es
> sinnlos, da noch weiter zu machen. Wer mit einem Schraubenzieher nicht
> umgehen kann, sollte nicht einen Benzinmotor auf Diesel umzubauen
> versuchen.

Hausaufgaben...

von Karl H. (kbuchegg)


Lesenswert?

abc schrieb:
> Karl heinz Buchegger schrieb:
>> So hat das alles keinen Sinn. Ohne entsprechende Grundlagen ist es
>> sinnlos, da noch weiter zu machen. Wer mit einem Schraubenzieher nicht
>> umgehen kann, sollte nicht einen Benzinmotor auf Diesel umzubauen
>> versuchen.
>
> Hausaufgaben...

Glaub ich ehrlich gesagt gar nicht.
Eher jemand, der seine Fähigkeiten wieder mal bei weitem überschätzt 
hat. Es besteht halt immer noch ein gewaltiger Unterschied zwischen 
Wollen und Können. Und den wird es auch immer geben. 'Wollen' kann man 
schnell etwas, interessiert aber keinen. Entscheidend ist, was ein Mann 
kann und was er nicht kann (tm Captain Jack Sparrow).

von abc (Gast)


Lesenswert?

Kann auch sein, in letzter Zeit wollen hier so viele ihre Arbeit gemacht 
haben, da bin ich wohl etwas paranoid geworden...

von Wieso??? (Gast)


Lesenswert?

Ich hab es irgendwie hinbekommen fragt mich nicht wie aber es geht jetzt 
habe mich durch den vorhandenen Code durchgelesen von SHT bis ich es 
irgendwie zum laufen gekriegt habe.

PS:Ich hasse C++

von Tim T. (tim_taylor) Benutzerseite


Lesenswert?

Wieso??? schrieb:
> Ich hab es irgendwie hinbekommen fragt mich nicht wie aber es geht jetzt
ganz schlecht.

> habe mich durch den vorhandenen Code durchgelesen von SHT bis ich es
> irgendwie zum laufen gekriegt habe.
und es wird auch nicht besser.


> PS:Ich hasse C++
Ich glaube das ist deinem C-Quelltext egal...

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.