4

Objective-Cメソッドから整数のCスタイル配列を返す方法は? これまでのところ、私のコードは次のようになります。

関数呼び出し:

maze = [amaze getMaze];

関数:

-(int*) getMaze{
    return maze;
}

今日、Objective-C で書き始めたばかりなので、これは私にとってまったく新しいことです。

4

4 に答える 4

4

Cスタイルの配列について明示的に質問した場合、ここで使用すべき提案はありませんNSArray

C スタイルの配列 (以下を参照) を Objective-C (または C または C++) の値として直接返すことはできません。そのような配列への参照を返すことができます。

int、 、doubleなどの型struct xはすべて値で渡すことができます。つまり、値を表す実際のビットが渡されます。他のもの; C スタイルの配列、動的に割り当てられたメモリ、Objective-C スタイルのオブジェクトなど。すべて参照によって渡されます。これは、値が渡されることを表す実際のビットを含むメモリ内の場所への参照です。

したがって、関数/メソッドから C スタイルの配列を返すには、次のことができます。

  1. 動的に ( malloc et al ) 配列を作成し、割り当てられたメモリへの参照を返します。
  2. 既存の配列への参照を渡し、関数にそれを埋めさせます。また
  3. 配列をstruct...としてラップします。

通常の選択は (1) または (2) です。次のように、スタックに割り当てられた配列への参照を返すことはできません。

int *thisIsInvalid()
{
   int myValues[5];
   ...
   return myValues; // will not work, the type is correct but once function
                    // returns myValues no longer exists.
}

本当に (小さい) 配列を値で返したい場合は、(3) を使用して実際に行うことができます。struct値は値によって渡されることに注意してください。したがって、次のように動作します。

typedef struct
{
   int array[5];
} fiveInts;

fiveInts thisIsValid()
{
   fiveInts myValues;
   ...
   myValues.array[3] = ...; // etc.
   ...
   return myValues;
}

(配列の読み取り/書き込みに関しては、配列を a 内にラップすることによるオーバーヘッドがないことに注意してくださいstruct-上記のコストはすべての値をコピーバックすることです-したがって、小さな配列にのみお勧めします!)

HTH

于 2013-06-13T02:58:54.253 に答える