2010-11-18 11 views
0

Ich habe folgendes ProblemTypecasting Int32 zu sCplx16 IQ Proben in C

Ich habe eine Struktur

typedef struct 
{ 

    Int16 real; 
    Int16 imag; 

}sCplx16; 

Int32 Data; //Data has real-imag packed into 32 bits. real-imag are 16 bits each. 

Jetzt bekomme ich Int32 Wert mit Echt imag zusammengepackt. Ich habe bereits eine Funktion geschrieben, die das Argument sCplx16 akzeptiert, und ich möchte es nicht zu Int32 machen, da es viele Änderungen innerhalb der Funktion geben wird.

dies zu vermeiden, typecasted ich die Variable

Fun((sCplx16)Data); 


fun.c 

Fun(sCplx16 DataPtr) 

{ 

    // 

} 


Inside the function, I find that value received are mapped correctly to 
DataPtr.real and DataPtr.imag. 

Is this typecasting correct? Someone told me that it will vary with compiler. 
meaning imaginary will be first 16 bits and real will be next 16 bits. 

Ich denke nur endianness dies wirkt und Compiler nicht

Bitte teilen Sie Meinung

Dank

Antwort

0

Ich bin nicht sicher darüber, wie der Compiler, der mit der Typumwandlung für die Funktion mit Wert arbeitet, übergeht. Aber wenn Sie die Funktion ändern, um einen Zeiger des Int32 zu übergeben, dann, soweit ich weiß, würde es nur von der Endian-Reihenfolge betroffen sein.

0

Sie können sich nicht darauf verlassen, dass innerhalb der Struktur kein Padding vorhanden ist, "Aliasing" von Feldern wie diesem ist nur für das erste Feld sicher. Untersuchen Sie, ob es möglich ist, Ihren Compilern zu sagen, die Struktur nicht aufzufüllen (das Attribut wird manchmal als "gepackt" bezeichnet), und fügen Sie Code hinzu, der überprüft, ob das ist, was Sie erwarten, d. H. 32/CHAR_BIT.

0

Die beiden Punkte der Besorgnis der Schublade gesteckt sind:

  • Endianness. Wenn Sie den Code auf eine Maschine mit unterschiedlicher Endianität portieren, werden die gepackten Daten nicht mehr korrekt den Strukturfeldern zugeordnet.
  • Größenunterschiede. Wenn sizeof(sCplx16) != sizeof(Int32), dann ist nicht ersichtlich, wie das Mapping wird. Dieser Unterschied könnte auftreten, weil Int16 nicht genau 16 Bit breit ist, oder möglicherweise als Folge der Auffüllung zwischen den Strukturelementen (obwohl das unwahrscheinlich ist, wenn sie den gleichen Typ haben. Nur ein Compiler, der absichtlich schwierig ist, fügt solche unnötige Auffüllung hinzu)

der einfachste Weg, voll portablen Code zu bekommen, ist eine kleine Funktion zu schreiben, die die gepackte Darstellung in die Struktur konvertiert:

sCplx16 unpack(Int32 data) 
{ 
    sCplx16 result = { (data >> 16) & 0xFFFF, data & 0xFFFF }; 
    return result; 
} 

Dann können Sie Ihre Funktion als Fun(unpack(Data));

nennen