1

古いqtファイルからC#に変換しようとしているコードのブロックがありますが、以下のユニオン内の構造体で何が起こっているのかが少しわかりません。':'が何をするのかわかりません...サイズを設定していると思いますが、これに関するドキュメントは見つかりませんでした。また、C#にはユニオンがないため、このようなものを変換するためのベストプラクティスは何ですか。ありがとうございました

union uAWord
{
   uAWord()
     : m_AWord(0) {}

    struct sBcdAWord
    {
      quint32 m_O  :8;
      quint32 m_S  :2;
      quint32 m_D  :18;
      quint32 m_SS :3;
      quint32 m_P  :1;
    }
    sBcdAWord m_F;
    quint32 m_AWord;
}
4

4 に答える 4

2

これはいわゆるビットフィールドです。部分sBcdWordは32ビットワードであり、各フィールドはそれぞれ8、2、18、3、1ビットをとるそのワードの一部です。したがって、ワードレイアウトは次のようになります。

  • Bit0-Bit7 m_0
  • Bit8-Bit9 m_S
  • ビット10-ビット27m_D
  • ビット28-ビット30m_ss
  • ビット31m_P

これをC#に移植する方法は、コードを巧妙に移植するのか、それともPInvokeが必要なのかによって異なります。PInvokeの場合、最善の解決策は、おそらくsBcdAWordをUnit32としてマップし、読み取りと書き込みをマスクするアクセサー戦略を作成することです。コードポートの場合は、メモリ使用量の節約に特別な必要がない限り、分離されたプロパティを使用することをお勧めします。

于 2011-03-14T21:18:58.023 に答える
1

その構文は、ビットフィールドを宣言するために使用されます。数値は、その値のビット数です。たとえば、http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/index.jsp?topic =%2Fcom.ibm.vacpp6m.doc%2Flanguage%2Fref%2Fclrc03defbitf.htmを参照してください。

C#への適切な変換は、私が推測するケースによって異なります。スペースをあまり意識しない限り、必要なすべての値をクラスで並列に保持します。

于 2011-03-14T21:19:58.310 に答える
0

これはに初期化m_aWordされ0ます。

于 2011-03-14T21:16:05.757 に答える
0

他の質問に答えるには、C#では構造体が必要になる可能性があり、属性を使用してユニオンのような動作を引き出す必要があります。

この特定の例は、次のようになります。

[StructLayout(LayoutKind.Explicit)]
struct uAWord {

    [FieldOffset(0)] 
    private uint theWord = 0;

    [FieldOffset(0)] 
    public int m_P;
    [FieldOffset(1)] 
    public int m_S;
    [FieldOffset(3)] 
    public int m_SS;
    [FieldOffset(7)] 
    public int m_O;
    [FieldOffset(18)] 
    public int m_D;

    public uAWord(uint theWord){
        this.theWord = theWord;
    }
}

LayoutKind.Explicit、メモリ内のどこに各フィールドをマップするかを指示し、各FieldOffset(int)フィールドを開始するビットを指示することを示します。 詳細については、こちらをご覧ください。 コンストラクターでを設定してこの構造体を割り当てるuint theWordと、他の各プロパティが異なるメモリアドレスで始まるチャンクにアクセスします。

残念ながら、それは実際には正しくありません。プロパティを使用し、ビットマスキング/シフトを実行して正しく設定する必要があります。このような:

struct uAWord {

    private uint theWord = 0;

    public int m_P {get {return (theWord & 0x01);}}
    public int m_S {get {return (theWord & 0x02) << 2;}}
    public int m_SS {get {return (theWord & 0x04) << 3;}}
    public int m_0 {get {return (theWord & 0x18) << 6;}}
}
于 2011-03-14T21:35:21.613 に答える