2011-10-21 13 views
0

以下はその状況です。 Cで完全に書かれたシステム/ソフトウェアがあります。このCプログラムは、C++で書かれたある種のデータ処理エンジンを起動するための新しいスレッドを生成します。したがって、私が持っているシステムは、2つのスレッド(メインスレッドとデータ処理エンジンスレッド)を実行します。さて、私はCでstructを取り、データ処理スレッドに渡してC++関数がCの構造体にアクセスできるようにする関数をCで記述しました。そうしている間、私は、C言語の側でアクセスされたときにC言語の構造体の特定のフィールド(unsigned intなど)の値が変化していることに気づいています。同時に、intのようなプリミティブなデータ型を渡すと、値は変化しません。それがなぜこのように振る舞うのか誰かが私に説明することができれば素晴らしいだろう。以下は、私が書いたコードです。 `CおよびC++コードの相互運用性 - データ受け渡しの問題

/* C++ Function */ 
void DataProcessor::HandleDataRecv(custom_struct* cs) 
{ 
    /*Accesses the fields in the structure cs - an unsigned int field. The value of 
    field here is different from the value when accessed through the C function below. 
    */ 
} 

/*C Function */ 
void forwardData(custom_struct* cs) 
{ 
    dataProcessor->HandleDataRecv(cs); //Here dataProcessor is a reference to the object 
            //of the C++ class. 
} 

` また、これらの機能の両方が、一部の例外を除き、別のソースファイル(.ccに内線との.c EXTや他との1)

+1

あなたのコードはどのプラットフォームで実行していますか?どのコンパイラ/リンカファミリですか? – ObscureRobot

+0

私はlinuxでコードを実行していて、gccを使ってCとC++の両方のファイルをコンパイルします – Saravana

+0

g ++でC++ファイルをコンパイルしていませんか? –

答えて

0

(補正)であり、C++でのスーパーセットでありますC(意味C89)、私は何が起こっているのか混乱しています。私はそれがあなたの変数や、実行しているシステムをどのように渡したりタイプしているかと何か関係があると仮定することしかできません。技術的に言えば、私が間違っていない限り、c/C++の相互運用性とは何の関係もありません。

さらに詳しい情報が役立ちます。

+2

CはC++の厳密なサブセットではありません。たとえば、C99にはいない多くの機能があります。 –

+0

私はLinuxシステムで走っていて、gccコンパイラを使ってC/C++ソースファイルをコンパイルしました。基本的には、C++関数呼び出しを行うCラッパー関数を使ってC構造体をC++関数に渡しています。 C++関数はこの構造体のメンバにアクセスするだけです。 – Saravana

+0

どのように値が変化しているか、認識可能なパターンに気がついたか、完全にランダムであるか.........どのような構造体の型か、それらに含まれると思われるものが含まれていると思いますか?それら。 – 8bitwide

0

structには、速度のために32ビットの境界線上に変数を整列させるために、「空のバイト」が追加されている可能性があります(したがって、CPUレジスタは変数を直接指すことができます)。

もう一方の側では、スペースを節約するために構造体をパックすることができます。

+0

このような場合、新しい構造体を作成し、C構造体をこの構造体にいくつかのラッパーを介して変換すると、それは機能しますか? – Saravana

+0

私はまずそれが問題かどうかを判断します。ほとんどのコンパイラには、バイトパッキングをオンまたはオフにするスイッチまたはプラグマがあります。ダミー変数を追加することで、パッキングで構造体を手動でレイアウトすることもできます。 –

3

Iは双方が両方の言語

  • に同じ

    • プリントsizeof(custom_struct)に構造体を配置することを確認し、両方の言語でcustom_structのインスタンスを作成し、 各メンバ変数のオフセット印刷たいです。
  • +0

    マイケルに感謝します。私はそれを試してみる。 – Saravana

    1

    私の野生の推測はマイケル・アンドレソンが正しいと考えています。構造のアライメントが問題になるかもしれません。

    -fpack-struct=4 
    

    (または4のためのいくつかの他の数)との両方のCおよびC++ファイルをコンパイルしてみてください。このようにして、構造体はすべての場合において同じように整列されます。

    構造体の宣言を見ることができれば、おそらくもっと明確になります。構造体にはコンストラクタのようなC++固有のコードを含む#ifdefは含まれていません。また、データ整列を操作する指示文の#pragma packをチェックします。