PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Funktion in Lib auslagern



morten1027
11.08.2010, 18:07
Servus,
ich fange hier nochmal einen neuen Thread an, damit es in meinem andren nicht drunter und drüber geht.

Und zwar gehts jetzt einfach nur darum eine einfache minifunktion, die einen Wert verdoppelt in die lib zu packen.

Das test-programm funktioniert so wie ich mir das vorstelle wenn ich die funktion ganz normal im hauptprogramm auscodiere.

Das hier ist das hauptprogramm wo ich die funktion (die in der lib sein soll) heraus aufrufe


#include "RP6ControlLib.h"

//int8_t getdoppel(int8_t pzahl1);
int8_t zwischenergebnis,count;

/************************************************** ***************************/


int16_t main(void)
{
initRP6Control(); // Always call this first! The Processor will not work
// correctly otherwise.

initLCD();


showScreenLCD("################", "################");

// Play a sound to indicate that our program starts:
sound(100,40,64);
sound(170,40,0);
mSleep(400);
setLEDs(0b0000);

showScreenLCD("lib test", "Example Program");
mSleep(1000);


zwischenergebnis = getdoppel (3);

uint8_t n = 0;
while (n < zwischenergebnis){ //es sollte jetzt 6mal piepsen
mSleep (1000);
showScreenLCD("in der ", "Schleife");
sound(100,40,64);
n++;
}

return 0;
}




die funktion, habe ich hier in die library Roboter\RP6Examples\Eigene Programme\RP6Lib\RP6control\RP6ControlLib.c geschrieben
int8_t getdoppel(int8_t pzahl1){
int8_t ergebnis = pzahl1 *2;
return ergebnis;
}

und in der headerdatei Roboter\RP6Examples\Eigene Programme\RP6Lib\RP6control\RP6ControlLib.h
habe ich den funktionskopf bekanntgegeben

int8_t getdoppel(int8_t pzahl1)


Allerdings gibt es wenn ich im Hauptprogramm "make all" mache einen Fehler, er kennt die funktion wohl noch nicht?
Gibt es noch etwas auf das ich achten muss oder ich falsch gemacht habe?
Bin wie gesagt in sachen Lib ein Neuling, sorry

Das hier ist der Fehler:


-------- begin --------
avr-gcc (GCC) 4.1.2 (WinAVR 20070525)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Compiling: RP6Control_05_IO_ADC.c
avr-gcc -c -mmcu=atmega32 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=RP6Control_05_IO_ADC.lst -I../../RP6lib -I../../RP6lib/RP6control -I../../RP6lib/RP6common -std=gnu99 -MD -MP -MF .dep/RP6Control_05_IO_ADC.o.d RP6Control_05_IO_ADC.c -o RP6Control_05_IO_ADC.o
RP6Control_05_IO_ADC.c: In function 'main':
RP6Control_05_IO_ADC.c:31: warning: implicit declaration of function 'getdoppel'

Linking: RP6Control_05_IO_ADC.elf
avr-gcc -mmcu=atmega32 -I. -gdwarf-2 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=RP6Control_05_IO_ADC.o -I../../RP6lib -I../../RP6lib/RP6control -I../../RP6lib/RP6common -std=gnu99 -MD -MP -MF .dep/RP6Control_05_IO_ADC.elf.d RP6Control_05_IO_ADC.o ../../RP6lib/RP6control/RP6ControlLib.o ../../RP6lib/RP6common/RP6uart.o ../../RP6lib/RP6common/RP6I2CmasterTWI.o --output RP6Control_05_IO_ADC.elf -Wl,-Map=RP6Control_05_IO_ADC.map,--cref -lm
RP6Control_05_IO_ADC.o: In function `main':
C:\Users\Andreas Martin\Documents\Roboter\RP6Examples\Eigene Programme\Versuch Lib/RP6Control_05_IO_ADC.c:31: undefined reference to `getdoppel'
make: *** [RP6Control_05_IO_ADC.elf] Error 1

> Process Exit Code: 2
> Time Taken: 00:01

radbruch
11.08.2010, 18:29
Nach int8_t getdoppel(int8_t pzahl1) fehlt ein ; in RP6ControlLib.h?

morten1027
11.08.2010, 18:44
Nach int8_t getdoppel(int8_t pzahl1) fehlt ein ; in RP6ControlLib.h?

ist nur beim copy & paste verlorengegangen. ist also vorhanden.

morten1027
13.08.2010, 14:43
Niemand eine Idee woran es liegen könnte?

Bitte auch an alle Idiotiien denken die mir so passieren könnten. Danke :)

radbruch
13.08.2010, 15:01
Hallo,

ich kann es fehler- und warnungsfrei kompilieren. Hauptprogramm wie oben, Änderung in RP6ControlLib.c:

/************************************************** ***************************/
// Includes:

#include "RP6ControlLib.h"

int8_t getdoppel(int8_t pzahl1)
{
int8_t ergebnis = pzahl1 *2;
return ergebnis;
}


/************************************************** ***************************/
Und in RP6ControlLib.h:

/************************************************** ***************************/
int8_t getdoppel(int8_t pzahl1);
// Init:


Ich glaube, bei Änderungen in den Library-Dateien muss man ein clean und dann ein make_all ausführen. Hast du vielleicht mehrere Kopien der Lib-Dateien in verschiedenen Verzeichnissen?

Gruß

mic

morten1027
13.08.2010, 16:06
AAHHHH.... da hätte man selbst drauf kommen können...

Genau das war der Fehler, ich hatte die RP6Lib einmal kopiert zur Sicherheit. Ich dachte das Programm greift auf das Verzeichnis im selben Ordner (wo meine eigenen Programme sind) zu. Tatsächlich greift es wohl (warum auch immer) auf die Lib im übergeordneten Verzeichnis zu.

Tja, so kanns gehen. Danke für die Hilfe. Meißtens hängt einfach an solchen simplen Sachen...