Moin,
ich arbeite zzt ein wenig an der MultiWii und bin an ein Problem
gestoßen, wo ich nicht weiter komme. Es geht um die Typen int32_t und
long.
Fehler
1
GPS.cpp:1747: undefined reference to `set_new_altitude(long)'
GPS.cpp
1
void set_new_altitude(int32_t _new_alt){
2
...
3
set_new_altitude(GPS_conf.rth_altitude * 100);
GPS.h
1
void set_new_altitude(int32_t _new_alt);
MultiWii.cpp
1
gps_conf_struct GPS_conf;
types.conf
1
typedef struct
2
{
3
4
//Don't forget to change the reply size in GUI when change this struct;
5
6
// on/off flags
7
// First byte
8
uint8_t filtering : 1;
9
uint8_t lead_filter : 1;
10
uint8_t dont_reset_home_at_arm : 1;
11
uint8_t nav_controls_heading : 1;
12
uint8_t nav_tail_first : 1;
13
uint8_t nav_rth_takeoff_heading : 1;
14
uint8_t slow_nav : 1;
15
uint8_t wait_for_rth_alt : 1;
16
// Second byte
17
uint8_t ignore_throttle: 1; // Disable stick controls during mission and RTH
uint8_t land_speed; // between 50 and 255 (100 approx = 50cm/sec)
29
uint16_t fence; // fence control in meters
30
31
uint8_t max_wp_number;
32
33
uint8_t checksum;
34
} gps_conf_struct;
Ich hoffe ich habe nichts vergessen mit anzugeben, falls doch sagt mir
bescheid und ich füge noch etwas hinzu. Wie kann ich den Fehler beheben?
Grüße
betaros
Beta Ros schrieb:> Es geht um die Typen int32_t und> long.
warum mischst du ?
> FehlerGPS.cpp:1747: undefined reference to `set_new_altitude(long)'
hier long
> GPS.cppvoid set_new_altitude(int32_t _new_alt){
hier int32_t
auch wenn beide das selbe sein sollte
wenn der Compiler meckert beuge ich mich
entweder
aus
set_new_altitude(long) set_new_altitude(int32_t) machen oder
set_new_altitude(int32_t) set_new_altitude(long) machen
oder vielleicht wurde einfach nur das #include vergessen ?
oder gibt es diese Funktion nicht ?
Schreibfehler ?
ich habe jetzt 3 Seiten google Suche durch nach gps.cpp & Arduino, in
keiner fand ich eine Funktion Namens:
set_new_altitude
evtl. wäre es hilfreich mal die LIB zu posten ?
es gibt einige gps.cpp woher sollte man wissen mit welcher du spielst ?
Hi,
danke für die schnelle Antwort. Du hast recht, ich habe vergessen
anzugeben, woher ich den Quelltext nehme. Er stammt von hier:
http://eosbandi.com/downloads/
Ich habe den Quellcode ja mit angegeben und wie man sieht wird nicht
einmal eine long-Variable angegeben und verwendet, weshalb mich der
Fehler wundert. Und wenn int32_t das gleiche ist wie long verwundert
mich der Fehler umso mehr :(
Grüße
betaros
ich sehe 2 mögliche Fehler
1.
der Aufruf
set_new_altitude(alt.EstAlt); könnte mit einem cast entschärft werden
so:
set_new_altitude((long)alt.EstAlt);
oder so, je nachdem was den stört
set_new_altitude((int32_t)alt.EstAlt);
was in alt.EstAlt definiert ist weiss ich grad nicht
2.
die Aufrufe erfolgen eher als die Funktion bekannt ist
set_new_altitude(rth_alt); in Zeile 782
die Funktion ist erst in Zeile 900
manchmal hilft umstellen, die Funktion höher an den Anfang setzen dann
kennt der Compiler sie vor dem Aufruf
alternativ bindet man ja Header zu gps.cpp sollte mindestens ein gps.h
existieren der hier fehlt ein wo sie bekannt gemacht wird:
void set_new_altitude(int32_t);
oder
void set_new_altitude(long);
aber Arduino ist zickig, ich kämpfe auch immer mit meinen *.c und *.h
Files in der Arduino IDE wobei mein c + h im Studio hervoragend laufen
nur in der Arduino IDE ist mir das Zusammenspiel suspekt weil ich keine
richtige IDE habe mit Linkeroptionen wie im Studio.
Beta Ros schrieb:> Moin,>> ich arbeite zzt ein wenig an der MultiWii und bin an ein Problem> gestoßen, wo ich nicht weiter komme.
Was hast du am original Code verändert?
Da ich keine Ardunio IDE habe, weiss ich nicht, ob das Original sauber
linkt.
Nach Durchsicht der Sourcen sollte das eigentlich der Fall sein.
Soweit ich gesehen habe, ist da auch kein Präprozessor-#if in
irgendeiner Art und Weise beteiligt. Das File hat auch korrekt die
Endung cpp, so dass es auch nichts mit Name-mangling zu tun haben wird.
Wenn also das Original problemlos compiliert und linkt, dann muss es was
mit deinen Änderungen zu tun haben. Da hilft es allerdings dann nichts,
wenn du aufs Original verweist.
Hi,
also ich habe das Casten ausprobiert und auch das Verschieben der
Funktionen, leider beides ohne Erfolg.
Ich habe meinen Quellcode mal hochgeladen:
http://betaros.no-ip.org/MultiWii.zip
Grüße
betaros
Wenn ich das richtig sehe, dann steht dieser ganze Code abhängig vom
1
#if defined(GPS_SERIAL)
in Zeile 373
Ich hab von da weiter gehend das zugehörige #endif mal gesucht, aber
noch nicht gefunden. Das sollte man mal in einen Editor laden, der die
entsprechenden Zusammenhänge darstellen kann.
Du kannst mal folgendes probieren.
Bau mal einen Syntaxfehler in die Funktion ein. Zb.
wenn dieser Syntaxfehler vom Compiler NICHT gemeldet wird, dann wird die
Funktion überhaupt nicht compiliert, weil sie durch das #ifdef Dickicht
ausgeschlossen wird.
Warum hast du eigentlich
1
//#define GPS_SERIAL 2 // should be 2 for flyduino v2. It's the serial port number on arduino MEGA
// Common GPS functions - #defines inside handle I2CGPS and SERIAL
6
//
7
voidinit_RTH()
8
{
9
f.GPS_mode=GPS_MODE_RTH;// Set GPS_mode to RTH
10
f.GPS_BARO_MODE=true;
11
#if defined (I2C_GPS)
12
GPS_I2C_command(I2C_GPS_COMMAND_START_NAV,0);//waypoint zero
13
#else
14
GPS_hold[LAT]=GPS_coord[LAT];//All RTH starts with a poshold
15
GPS_hold[LON]=GPS_coord[LON];//This allows to raise to rth altitude
16
....
damit ist aber klar, dass das nicht funktionieren kann. Die Funktion
wird gar nicht mitcompiliert.
Da hat jemand geschlampt und nie ausprobiert, ob man GPS_SERIAL
auskommentieren kann und welche Funktionen bzw. Funktionalität dann
wegfallen.
du kannst nicht GPS_SERIAL auskommentieren (und auch nicht einfach die
Baudrate weglassen).
Autosense bedeutet nicht, dass der Arduino dann den Serial Port
rausfindet, an dem das GPS hängt, sondern dass er feststellt, ob am
angegebenen Port ein GPS hängt (auch wenn ich die zu GPS_PROMINI_SERIAL
im Code noch nicht gefunden habe).
-> Konfigurationsfehler deinerseits, auch wenn der Code in gps.cpp
furchtbar durch die #if Origien entstellt ist und dringend aufgeräumt
werden müsste.
Hi,
entschuldige, dass ich so spät erst antworte, aber ich bin leider nicht
früher dazu gekommen.
Vielen Dank auf jedem Fall für die viele Arbeit und Mühe die du dir
gemacht hast, um mir zu helfen. Anscheinend habe ich dann den Quellcode
falsch verstanden gehabt. Ich dachte GPS_SERIAL würde nur für den
Arduino Mega gebraucht. Mein Ziel ist es den Code auf einem Arduino
Leonardo zum laufen zu bekommen, jedoch ist der Code noch 10 kb zu groß.
Meine Hoffnung lag deshalb in GPS_PROMINI_SERIAL.
Auch wenn man die I2C Version noch nicht verwenden soll, so möchte ich
doch mal versuchen dies zu kompilieren, komm jedoch wieder auf den
ursprünglichen Fehler mit setAltitude(long) in MultiWii.cpp line 1205.
Jedenfalls vielen Dank für die Hilfe :)
Grüße
betaros