3

我一直在查看 Codility 测试(http://codility.com/),因为我正在考虑尝试获得证书,但我遇到了一些非常奇怪的语法错误,它似乎使用了一点不同版本的 Objective-C 到 iOS。

例如,要完成的函数声明如下:

int equi (NSMutableArray *A) { //.... }

-(int)equi:(NSMutableArray *)A { //... }

当我声明以下for循环时(A是一个数组NSNumber):

12. for (int i = 0; i < [A count]; i++){
13.    total = total + [[A objectAtIndex:i] intValue];   
14. }

它给了我以下编译错误:

func.m:12: error: 'for' loop initial declarations are only allowed in C99 mode
func.m:12: note: use option -std=c99 or -std=gnu99 to compile your code
func.m:13: error: invalid operands to binary + (have 'double' and 'id')

如果有人可以对此有所了解,那么可能是objective-c的版本或编译器版本不同吗?

谢谢

编辑:来自 Codility 的@Kos 在下面评论说,他们最近将他们的 Objective-C 编译器切换到了 Clang,这应该意味着我问的大多数问题现在都不是问题了。

4

4 回答 4

5
int equi (NSMutableArray *A) { //.... }

这不是“Objective-C 的不同版本”。这是一个 C 函数。

生成编译器错误是因为...

'for' loop initial declarations are only allowed in C99 mode

编译器稍后会告诉您解决方案:

use option -std=c99 or -std=gnu99 to compile your code

另一个可以通过强制转换来解决:

total = total + (int)[[A objectAtIndex:i] intValue];

或者,甚至更好:

total = total + [(NSNumber *)[A objectAtIndex:i] intValue];
于 2012-09-18T21:08:59.190 回答
2

我尝试参加 Objective-C 测试并有类似的经历。我的结论是 Codility 支持 Objective-C 1 而不是现代的 Objective-C 2。在我看来 Codility 使用 gcc 编译器,这就是为什么它是旧的 Objective-C 语法。我们这些在 Apple 平台上工作的人已经习惯了 Apple 更新的 Objective-C 2。不幸的是,我不知道有任何针对现代 Objective-C 的编程测试。

于 2013-08-26T22:17:16.467 回答
0

请注意,这个问题完全是在 Codility 的上下文中,它没有明确告诉您它正在编译的 C 版本。

正如 H2CO3 所指出的,声明是一个 C 函数。我被抛出了,因为测试应该是在 Objective-C 中,而不是 C,虽然是的,Objective-C 是 C 的超集,但我期待 Objective-C 语法。

Codility 不允许您访问编译器标志,因此堆栈跟踪没有用。i问题是在循环声明中的初始声明for(C90 风格)。它应该被重写为明确的:

int i = 0;
int count = [A count];
for (i = 0; i < count; i++) {
    total = total + [((NSNumber *)[A objectAtIndex:i]) intValue];
} 
于 2012-09-19T10:15:33.623 回答
-2

在 for 循环中,计数不正确。正确的计数是数组计数 - 1,如下:

int i = 0;
int contagem = [A count];
for (i = 0; i < count - 1; i++) {
    total = total + [((NSNumber *)A[i]) intValue];
}
于 2013-05-07T22:59:16.433 回答