web-dev-qa-db-ja.com

Objective Cの配列の長さ

質問のいずれにも回答が見つかりませんでした。関数に整数配列を渡していますが、今度は配列を走査したいと思いますが、配列内の要素の数を指定するarrayname.lengthを使用してC、C++で簡単に機能したので、それを見つける方法は何ですか? [NSArrayObject length]はNSArray型で機能しますが、int []で必要です。 [XYZ count]でさえ動作しません。

31
Darpan

Intの配列を持つObjective-Cに固有のものはありません。 Cを使用している場合と同じ手法を使用します。

sz = (sizeof foo) / (sizeof foo[0]);
21
Andy Gaskell

[XYZ count]を使用して、配列の長さを取得できます

30
user2070420

Cには_array.length_のようなものはありません。Objective-Cのint配列は、Cのint配列と正確に同じです。_int foo[5]_のように静的に定義されている場合、 sizeof(foo)を実行してサイズを取得できますが、同じ関数内でのみfooが定義されています(他の関数では、配列自体ではなく単なるintポインターです)。それ以外の場合、この情報を取得する固有の方法はありません。サイズを渡すか、センチネル値を使用する必要があります(C文字列の終端の「\ 0」は、単なるcharの配列です)。

17
Chuck

え? Cでは、「arrayname.length」のようなものはありません。 int[]などのプリミティブ型の配列には、実行時に関連する長さ情報がありません。

5
unwind

配列は基本的に、配列に割り当てられたメモリブロックの先頭への単なるメモリアドレスです。実際に使用するには、作成後の長さを何らかの形で覚えておく必要があります。すべての関数に長さを渡すか、配列と長さの両方を別の構造にラップして、その構造を渡すことができます。

5
James M.

[配列数]これは、objective-cで最も簡単に機能するようです。

4
chillininvt

このコードは、配列内の要素の総数が不明な場合に使用できます。

main()
{
    int a[]={1,2,3,4,5,6,7}
    int i;
    clrscr();
    for (i=0;i<=((sizeof(a)/sizeof(int));i++)
    {
        puts(a[i]);
    }
    getch();
}

Cにはarrayname.lengthのようなものはありません。そのため、非常に多くの関数が引数のペアを取ります。1つの引数は配列で、1つの引数は配列の長さです。これの最も明白なケースはメイン関数です。この関数は、main.mという名前のファイル内のすべてのiPhoneプロジェクトであり、次のようになります。

int main(int argc, char *argv[]) {    
  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  int retVal = UIApplicationMain(argc, argv, nil, nil);
  [pool release];
  return retVal;
}

argv引数がv ectorまたは文字列の配列であり、argc引数がc ountの数であることに注意してください。この配列にあるアイテム。

すべてのプリミティブタイプに対して同じことを行う必要があります。これは、Objective-Cの[〜#〜] c [〜#〜]部分です。 NSArrayまたはサブクラスを使用してObjective部分にとどまる場合は正常に機能しますが、すべての要素がオブジェクトである必要があります。

2
PeyloW

整数の配列が必要な場合は、NSNumberオブジェクトでラップし、NSArrayに配置します。

あなたがやろうとしていることは、Cで実際にうまくサポートされていませんが、Mac上で試すことができる方法があります(malloc_size):

cで動的に割り当てられたメモリのサイズを決定する

NSMutableArrayの仕事のように見えます。 C配列で作業する必要がある理由はありますか?そうでない場合は、NSMutableArrayを検討してください。

私は間違っているかもしれません(私がいる場合は修正してください)が、Cで実行時にint []のサイズを取得する簡単な方法はありません。配列を保持する構造体と、配列内のアイテム数を自分で追跡できるintを作成するなどの操作を行う必要があります。

より複雑な場合でも、構造体に配列とブロックを保持させることができます。その後、ブロックを設計して追跡を行うことができます。

しかし、これはCの質問であり、客観的な質問ではありません。

1
pxl

次のアプローチを試してください:

float ptArray[] = {97.8, 92.3, 89.4, 85.7, 81.0, 73.4, 53.0, 42.3, 29.4, 14.1};

int x = sizeof(ptArray)/sizeof(ptArray[0]);

 NSLog(@"array count = %d", x);

出力

array count = 10
0
RichApple