Komplexe Zahlen, die von C ++ nach C by-value übergeben wurden, scheinen auf PowerPC nicht zu funktionieren

9

Wenn ich einen komplexen Gleitkommawert (complex.h) von einem C ++ - Aufrufer an eine c-Bibliothek übergebe, wird der Wert beim Ausführen auf einem 32-Bit-PowerPC nicht korrekt übergeben. Ich habe zwei verschiedene Open-Source-Softwarebibliotheken benutzt, als ich dieses Problem entdeckte. Ich habe es bis zu der Grenze isoliert, als C ++ einen komplexen Werttyp an eine reine C-Typ-Funktion übergibt. Ich habe einen einfachen Code geschrieben, um das zu demonstrieren.

%Vor%

Die Quell-C-Datei ist wie folgt

%Vor%

Das aufrufende C ++ Programm ist wie folgt

%Vor%

Normalerweise würde ich erwarten, dass die Ausgabe

ist %Vor%

Aber wenn ich die Quelle auf einer eingebetteten Power-PC-Maschine laufe, bekomme ich eine Ausgabe, die zeigt, dass der Werttyp für den Komplex nicht richtig übergeben wird.

%Vor%

Ich überprüfte die Größe der Parameter von gdb und sowohl vom aufrufenden als auch vom Funktionsrahmen sind die Größen 4 Bytes, 4 Bytes, 8 Bytes und 4 Bytes, für den Gleitkomma, den komplexen Gleitzeiger, den komplexen Gleitkomma und den Gleitkomma.

Ich realisiere, dass ich den komplexen Wertparameter einfach als Zeiger oder meine eigene Struktur ändern kann, wenn ich c ++ zu c bordery kreuze, aber ich möchte wissen, warum ich keinen komplexen Werttyp von c ++ nach c über a übergeben kann Kraft pc.

Ich habe nur dieses Mal ein anderes Beispiel erstellt, diesmal habe ich etwas von der Assembly und den Registerwerten ausgegeben.

%Vor%

Kurz vor dem Aufruf, wo die Parameter übergeben werden.

%Vor%

Dies sollte Assembler-Code sein, wo es die Rücksendeadresse speichert und die Parameter speichert, um in die Routine zu gelangen.

%Vor%

Blick auf die Baugruppe direkt nach der Verzweigung:)

%Vor%

Dies sind die Werte, sobald wir uns vollständig in der Routine befinden (nachdem Variablenwerte zugewiesen wurden.

%Vor%

Meine Layman-Ansicht sieht so aus, als würde C ++ den komplexen Werttyp als Referenz- oder Zeigertyp übergeben? aber C behandelt es wie ein Werttyp? Also ist das ein Problem mit Gcc auf dem Power-PC? Ich benutze gcc4.7.1. Ich bin dabei, gcc4.9.3 als Cross-Compiler auf einer anderen Maschine zu erstellen. Ich werde diesen Beitrag entweder aktualisieren, sobald ich die Ausgabe von einem neueren Compiler funktioniert.

Wenn der Cross-Compiler nicht funktioniert, aber der Speicherauszug des ursprünglichen Problems betrachtet wird, zeigt dies, dass auf der Power-PC-Plattform der komplexe Wert nicht als Wert übergeben wird. Ich gebe das Beispiel der Struktur hier an, um zu zeigen, dass ein 64-Bit-Wert auf einer 32-Bit-Maschine als Wert durchlaufen werden kann.

    
dan 24.03.2016, 16:03
quelle

2 Antworten

4

Ihr Code verursacht undefiniertes Verhalten. In der C ++ - Einheit wird die Funktion wie folgt deklariert:

%Vor%

aber der Funktionskörper ist:

%Vor%

was nicht passt.

Um den Compiler bei der Diagnose dieses Fehlers zu unterstützen, sollten Sie den Präprozessor nicht verwenden, um verschiedene Prototypen für die gleiche Funktion zu verwenden.

Um diesen Fehler zu vermeiden, müssen Sie den Funktionsprototyp nur Typen verwenden, die sowohl in C als auch in C ++ gültig sind. Wie im Beispiel myComplex_t .

    
M.M 25.03.2016 02:19
quelle
0

Am Ende haben wir einen Cross Compiler gegen den nativen Compiler auf dem Dev-Board benutzt, um die Binaries zu erstellen. Anscheinend werden komplexe Zahlen über die C-C ++ - Grenze für den nativen Compiler, den wir verwendeten, nicht richtig behandelt.

Alle vorgeschlagenen Änderungen wurden versucht und fehlgeschlagen, aber sie waren immer noch gute Vorschläge. Es half uns zu bestätigen, dass es sich um ein Compiler-Problem handeln könnte, das es uns ermöglichte, einen Cross-Compiler zu verwenden. Danke allen!

    
dan 01.06.2016 00:09
quelle