0

私は、いくつかの c++ を xcode の目的の c コードに統合するのに少し苦労しています。最初に、オーディオを再生する C++ プログラムを作成しましたが、問題なく動作しました。いくつかの関数と構造体で構成されています。Objective-C コードに統合しようとする前に、次のようなことを行いました。

typedef struct MyPlayer {

//some declarations...

} MyPlayer;
void createInput(MyPlayer *player);
//some other functions...

そして、c++ ファイルのメインで:

int main (int argc, const char * argv[]) {
MyPlayer player = {0};

// create it
createInput(&player);
}

これは完璧に機能しました。

さて、それをobjective-cに持ち込もうと思いました

Objective-C コードのヘッダー ファイルにプレーヤーを追加しました。

そして次のようなことをしました:

 self.player = {0}; //does not compile, commented it out to test
 createInput(self.player);

= {0} をコメントアウトするとコンパイルはできますが、createInput に入ろうとするとクラッシュします。このような目的の c + c++ プロジェクトがある場合、ポインターを使用したり、構造体に {0} を入力したりするにはどうすればよいですか?

なぜそれをobjective-cに入れるのですか? 私のインターフェースはobjective-c/cocoaに組み込まれているため

ありがとう!ベンジャミン

4

2 に答える 2

0

あなたの問題は、Objective-C の場合、プレーヤー構造がローカル変数ではないことです。これは、プロパティとして宣言されていると想定されます。を使用して値を代入するself.playerと、本質的に[self setPlayer:{0}]意味のないプロパティ セッター メソッドを呼び出すことになります。

コードをどのように使用しているかを見ると、playerが実際にはMyPlayer構造体へのポインターとして宣言されていると想定しているため、メモリを割り当てる必要があります。そのために使用callocすると、構造体を作成し、同時にゼロに初期化できます。

このようなもの:

self.player = calloc(1, sizeof(MyPlayer));

これにより、メモリが割り当てられ、内容がゼロに設定され、プロパティ セッターが呼び出されて、そのメモリがプレーヤープロパティに割り当てられます。

私が間違っている場合は、Objective-C コードでplayerがどのように宣言されているかを示していただければ助かります。

于 2013-07-19T11:43:00.777 に答える
0

構造体オブジェクトをどのように正確に宣言しているかわかりません。しかし、次のコードは正常に動作しています

typedef struct myStruct{
  int a;
  int b;
  int c;
}myStruct;

- (void)viewDidLoad
{
    [super viewDidLoad];
    myStruct abc = {0}; //works fine

    // myStruct abc;  
    //self.abc = {0}; //error  

    NSLog(@"%d %d %d",abc.a,abc.b,abc.c);
}
于 2013-07-19T12:04:29.387 に答える