2

遅れてC配列をObjective-Cのメソッドに渡したい。通常、Selector:withObject:afterDelayを実行できますが、配列を変更したり、NSMutableArrays、NSDictionaries、またはその他のCocoaオブジェクトに変換したりすることはできません。C配列である必要があります。StackOverflowとGoogleに関する私の調査では、Cプリミティブを渡す1つの方法は、それらをNSInvocationでラップすることであることがわかりました。以下のコードでこれを実行し、渡される配列へのポインターとして引数を設定してみました。

float gun1_vertex[24][8] = { {data,...data},{data,...data}, ... {data,...data} };
float gunDown1_vertex[24][8] = { {data,...data},{data,...data}, ... {data,...data} };

NSInvocation *inv = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:@selector(testMethod:secondCArray:)]];
  [inv setSelector:@selector(testMethod:secondCArray:)];
  [inv setTarget:self];
  [inv setArgument:&gun1_vertex[0][0] atIndex:2];
  [inv setArgument:&gunDown1_vertex[0][0] atIndex:3];
  [inv performSelector:@selector(invoke) withObject:nil afterDelay:0.1f];

以下の方法で渡された配列からいくつかの値を出力しようとすると、テストアプリがクラッシュし続けます。私はおそらく完全に明白な何かを見逃しているだけです。誰かがここに光を当ててくれませんか?

- (void)testMethod:(float *)test secondCArray:(float *)test2 {

    for ( int a = 0 ; a < 10 ; a++ ) {

        NSLog(@"%f %f",test[a],test2[a]);

    }

}
4

3 に答える 3

3

あなたはこのようなことをすることができます:

-(void) testMethod:(NSData *) arrayone secondArray:(NSData *) arraytwo
{
    float **gun1_vertex = (float **)[arrayone bytes];
    float **gunDown1_vertex = (float **)[arraytwo bytes];

    // ...
}

NSData *gun1data = [NSData dataWithBytes:(void *)gun1_vertex     length:sizeof(float) * 24 * 8];
NSData *gun1downData = [NSData dataWithBytes:(void *)gunDown1_vertex length:sizeof(float) * 24 * 8];

[inv setArgument:&gun1data atIndex:2];
[inv setArgument:&gun1downData atIndex:3];
于 2012-01-31T01:45:56.653 に答える
3

あなたの問題は十分な間接的ではありません。引数として設定する値の場所へのポインタsetArgumentを取ります。この場合の値もポインタです...渡されたポインタと型情報を使用すると、正しいバイト数をコピーできます。setArgument

したがって、次のようなものが必要です。

float *gun1_vertex_pointer = &gun1_vertex[0][0];
[inv setArgument:&gun1_vertex_pointer atIndex:2];
于 2012-01-31T01:48:27.083 に答える
1

遅延後に電話をかけるには、dispatch_afterブロックを使用します。

    double delayInSeconds = 0.1;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [self testMethod:&gun1_vertex[0][0] secondCArray:&gunDown1_vertex[0][0]];
    });
于 2012-01-31T01:33:57.107 に答える