3

証明書を取得しようと考えていたので、Codilityテスト(http://codility.com/ )を見てきましたが、いくつかの非常に奇妙な構文エラーに遭遇しました。少し使用しているようです。 iOSへのObjective-Cの異なるバージョン。

たとえば、完了する関数は次のように宣言されています。

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

そして、コンパイラは1行後に解決策を教えてくれます。

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

もう1つは、キャストすることで解決できます。

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関数です。テストはCではなくObjective-Cで行われることになっていたため、私はスローされました。そうですが、Objective-CはCのスーパーセットですが、Objective-C構文を期待していました。

Codilityではコンパイラフラグにアクセスできないため、スタックトレースが役に立たなかったのはなぜですか。問題は、ループ宣言(C90スタイル)i内にあるという最初の宣言でした。for明示的にするために、次のように書き直す必要があります。

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 に答える