Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa NSArray到C数组_Cocoa_Opengl - Fatal编程技术网

Cocoa NSArray到C数组

Cocoa NSArray到C数组,cocoa,opengl,Cocoa,Opengl,我们能把NSArray转换成c数组吗。如果没有,还有什么替代方案。[假设我需要在opengl函数中输入c数组,其中c数组包含从plist文件读取的顶点指针]我建议您自己转换,使用类似于: NSArray * myArray; ... // code feeding myArray id table[ [myArray count] ]; int i = 0; for (id item in myArray) { table[i++] = item; } 答案取决于C数组的性质 如

我们能把NSArray转换成c数组吗。如果没有,还有什么替代方案。[假设我需要在opengl函数中输入c数组,其中c数组包含从plist文件读取的顶点指针]

我建议您自己转换,使用类似于:

NSArray * myArray;

... // code feeding myArray

id table[ [myArray count] ];

int i = 0;
for (id item in myArray)
{
    table[i++] = item;
}

答案取决于C数组的性质

如果需要填充长度已知的基元值数组,可以执行以下操作:

NSArray* nsArray = [NSArray arrayWithObjects:[NSNumber numberWithInt:1],
                                             [NSNumber numberWithInt:2],
                                             nil];
int cArray[2];

// Fill C-array with ints
int count = [nsArray count];

for (int i = 0; i < count; ++i) {
    cArray[i] = [[nsArray objectAtIndex:i] intValue];
}

// Do stuff with the C-array
NSLog(@"%d %d", cArray[0], cArray[1]);
或者,您可能希望
nil
-终止数组,而不是传递其长度:

// Make a nil-terminated C-array
int count = [nsArray count];
NSString** cArray = malloc(sizeof(NSString*) * (count + 1));

for (int i = 0; i < count; ++i) {
    cArray[i] = [nsArray objectAtIndex:i];
    [cArray[i] retain];    // C-arrays don't automatically retain contents
}

cArray[count] = nil;

// Do stuff with the C-array
for (NSString** item = cArray; *item; ++item) {
    NSLog(*item);
}

// Free the C-array's memory
for (NSString** item = cArray; *item; ++item) {
    [*item release];
}
free(cArray);
//生成一个以零结尾的C数组
int count=[nsArray count];
NSString**cArray=malloc(sizeof(NSString*)*(count+1));
对于(int i=0;i
NSArray
有一个
-getObjects:range:
方法,用于为数组的子范围创建C数组

例如:

NSArray *someArray = /* .... */;
NSRange copyRange = NSMakeRange(0, [someArray count]);
id *cArray = malloc(sizeof(id *) * copyRange.length);

[someArray getObjects:cArray range:copyRange];

/* use cArray somewhere */

free(cArray);

但这不会将NSNumber对象转换为基本数字类型。提问者需要转换使用OpenGL的C数组;因此,他们完全可以自己填充C数组,而不需要将NSNUMBER放入其中。啊!没有看到该问题的OpenGL要求。在这种情况下,是的,手动迭代数组是合适的。这是一个很好的答案,我希望我能多次投票。我有一个建议,就是
NSString**
类型的使用有点模糊。我建议对malloc返回的指针和数组大小使用
[NSData initwithbytesnopy:length:freeWhenDone:][/code>。我尝试了使用malloc的第二种方法,我认为需要禁用arc。至少,我是这样让它工作的。当问到这个问题时,也许arc不存在。。。。
NSArray *someArray = /* .... */;
NSRange copyRange = NSMakeRange(0, [someArray count]);
id *cArray = malloc(sizeof(id *) * copyRange.length);

[someArray getObjects:cArray range:copyRange];

/* use cArray somewhere */

free(cArray);