C++ eigenartiges Vehalten unter ARM

togepi

Lt. Junior Grade
Registriert
Nov. 2007
Beiträge
359
Hi,

nachdem ich mich nun seit 7 Stunden durch mysteriöse Bugs innerhalb meines Programms kämpfe bin ich nun auf den merkwürdigsten von allen gestoßen, der evtl. gleichzeitig der Auslöser meiner Probleme ist.

Vorab: Cross compiler ist der GCC 4.7.3, Zielsystem ist ein Raspberry PI mit ARMv6 CPU.

Ich muss für eine Gesichtsverarbeitungssoftware char werte zu double konvertieren, um damit rechnen zu können. Leider scheint mein ARM Prozessor das aber nicht richtig zu können, wie im folgenden Dargestellt:

Code:
int main(void) {
	for (int i = 0; i < 10; ++i) {
		char c = i;
		cout << (int) c << "--> " << (double) c << endl;
	}

        return 0;
}

Output auf meinem ARM gerät:

Code:
0--> 16
1--> 16
2--> 16
3--> 16
4--> 16
5--> 16
6--> 16
7--> 16
8--> 16
9--> 16

Egal welche Zahl, der char wird immer zu 16 konvertiert.

Um nicht völlig vom Glauben abzufallen habe ich den gleichen Test auf meinem Windows Gerät mit Visual Studio 2013 aufgeführt, mit folgendem Ergebnis:

Code:
0--> 0
1--> 1
2--> 2
3--> 3
4--> 4
5--> 5
6--> 6
7--> 7
8--> 8
9--> 9

Es funktioniert normal.

Ich komme nicht drumherum, die char werte zu double zu konvertieren. Könnte mich jemand erleuchten, was zur Hölle hier los ist? Hat es evtl. etwas mit dem Fließkommamodell zu tun? Falls ja, wie kriege ich meine char zu double Werten konvertiert?
 
Hi,
und was kommt raus, wenn du die char Werte direkt ausgibst?

Greetz
​hroessler
 
hroessler schrieb:
Hi,
und was kommt raus, wenn du die char Werte direkt ausgibst?

Greetz
​hroessler

Nur um absolut sicher zu gehen habe ich nochmal ein komplett neues Projekt erstellt und gebe den char auch noch als char statt int aus. Diesesmal wird komischerweise immer zu 0 anstatt 16 konvertiert, aber es funktioniert nicht.

Code:
int main() {
	for (int i = 'A'; i < 'S'; ++i) {
		char c = i;
		cout << (int) c << "(" << c << ")" << "--> " << (double) c << endl;
	}
	return 0;
}

Code:
pi@raspberrypi ~ $ ./test
65(A)--> 0
66(B)--> 0
67(C)--> 0
68(D)--> 0
69(E)--> 0
70(F)--> 0
71(G)--> 0
72(H)--> 0
73(I)--> 0
74(J)--> 0
75(K)--> 0
76(L)--> 0
77(M)--> 0
78(N)--> 0
79(O)--> 0
80(P)--> 0
81(Q)--> 0
82(R)--> 0
 
Na ja das ist echt seltsam. :freak: Ich ziehe mich hier an Strohhalmen hoch, aber kannst du mal die casts per static_cast machen und vielleicht den char erst nach int und dann nach double casten? Also:

Code:
int main() {
    for (int i = 'A'; i < 'S'; ++i) {
        char c = i;
        cout << (int) c << "(" << c << ")" << "--> " << static_cast< double > ( static_cast< int > ( c ) ) << endl;
    }
    return 0;
}

P.S. Ach na ja, das ist eigentlich auch Blödsinn. Daß der cast nach int funktioniert, haben wir ja schon gesehen, und von int nach double wird's dann wahrscheinlich auch klappen. Damit kommen wir der Ursache deines Problems also auch nicht näher. :-\
 
Zuletzt bearbeitet:
Kleines update:

Ich habe das Testprogramm nun einem direkt auf dem Pi kompiliert, und siehe da, dort gibt es den korrekten Output.
Mit anderen Worten: Es liegt anscheinend ein Konfigurationsproblem mit meinem Cross Compiler vor.

Kompiliere mit -mfpu=vfpv3 and thank me later ;-)

Weder -mfpu=vfpv3 noch -mfpu=vfpv existieren laut GCC 4.7.3.

Edit: Sorry, doch, hatte mich da wohl irgendwo vertippert. Leider gleiches Problem.

Ich habe jetzt schon etwas rumexperimentiert. Zur zeit benutze ich folgenden Compiler und -Optionen:

Code:
arm-linux-gnueabi-g++-4.7 -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF

Der arm-linux-gnueabi-g++-4.7 ist eine Standarttoolchain die unter Ubuntu verfügbar ist. Ich habe auch bereits das Gegenstück, namentlich arm-linux-gnueabihf-g++-4.7 getestet, dort gibt mir jedes Kompilat allerdings einen Segmentation Fault auf dem Pi, anscheinend sind da einige Libs inkompatibel. Habe auch bereits mit -mfpu=vfp -mfloat-abi=hard bzw march=armv6 experimentiert, jedes mal mit gleichem Ergebnis oder Segmentation fault auf dem Pi. :(

Was mich alledings noch mehr verblüfft ist: Wenn meine Toolchain nicht korrekt konfiguriert ist, wie konnte ich dann überhaupt schon eine Bildverarbeitungssoftware entwickeln die mehr oder weniger funktioniert? (Inklusive OpenCV, Raspicam libary usw). Müsste ich dann nicht viel früher Probleme bekommen haben? Wird dort etwa nirgends jemals nach double oder float gecasted? Oder liegt es daran, dass die libs jeweils dynamisch vom Pi geladen werden, wo sie korrekt funktionieren?
 
Zuletzt bearbeitet:
Zurück
Oben