2012-01-31 7 views
0

私はインデックス[1 ... 20]の配列を持っています。 indicesArrayの最初の4つの要素は、特定の型のファイル(型Aと呼ばれます)にリンクされ、他の16個はB型にリンクされます。列挙型を使用して整数の範囲に型を割り当てる?

ランダムに配列をシャッフルします。今では4つのインデックスを抽出したいと思いますが、最大でも4つのタイプのうち1つだけがタイプAであることができます。

ここでenum関数を使用してインデックス1〜4を "タイプA"として定義する必要があると思います&インデックス5-20を「タイプB」とし、もし私が例えば私の新しくランダム化されたindicesArray [0]の最初の要素は、どのタイプがそれに応じて&であるかを知ることができました。

私はそれのようなものだ列挙型の例から使用さ見てきた道:

enum category { typeA = 0, typeB }; 

はTYPEBにタイプA &にインデックス1-4に休息を割り当てることが可能です、または私は間違ってトラックにしていますここに?前もって感謝します。

編集は、私はこの&をすぐにエラーに

私はエラーを取得し、これをコンパイルしよう

#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) { 
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

int* indices = malloc(20*sizeof(int)); 

for (int i=0; i<20; i++) { 

    indices[i] = i; 

} 

enum category {typeA, typeB}; 


enum category categoryForIndex(int index) { 
    if (index >= 1 && index <= 4) { 
     return typeA; 
    } else { 
     return typeB; 
    } 
} 

[pool drain]; 
return 0; 

} 
を実行したテストしようとしたコードスニペット

を含めるには、「ネストされた関数は、使用無効になっています - fnested-functions to re-enable "は、通常、第2のメインが偶然、またはそのような何かにミックスされたときに発生します。何か案は?

編集練習

あなたがトラックオフにしている
#import <Foundation/Foundation.h> 

enum category {typeA, typeB}; 

enum category categoryForIndex(int index) { 
if (index >= 1 && index <= 4) { 
    return typeA; 
    } else { 
    return typeB; 
    } 

} 

int main (int argc, const char * argv[]) { 
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

int* indices = malloc(20*sizeof(int)); 

for (int i=1; i<=20; i++) { 

    indices[i] = i; 

} 


NSLog(@"index[0] is %i:", indices[16]); 

enum category index; 

index = indices[16]; 

switch (categoryForIndex(index)) { //this tests to see what category 16 belongs to 
    case typeA: 
     NSLog(@"index is of type A"); 
     break; 
    case typeB: 
     NSLog(@"index is of type B"); 
     break; 
    default: 
     NSLog(@"index not valid"); 
     break; 
} 

[pool drain]; 
return 0; 

} 
+0

は包括 'N-1 'に' 0 'から行くCにインデックスを注意してください。 – pmg

+0

ありがとうpmg :)はい私が参照する配列はインデックスを保持しています(1から始まる)。 – Octave1

答えて

1

にソリューションを配置する方法を示していますいくつかのコードを含めます。指定されたenumを1-4に割り当てることはできません。列挙型定数は正確に1つの値を持ち、1つのみです。あなたができることはenumを使用して、すでに完了したようにtypeAtypeBという2つのタイプを定義してから、インデックスをタイプに戻してマッピングする関数を定義することです。

enum category categoryForIndex(int index) { 
    if (index >= 1 && index <= 4) { 
     return typeA; 
    } else { 
     return typeB; 
    } 
} 

ここでインデックスを分類する方法があります。

+0

ありがとうKevin、それは試してみましたが、私は期待していませんでした - 入れ子関数と関係があります。私は上記の少しのコードスニペットを投稿しました。 – Octave1

+2

@ Octave1:あなたのプログラムの 'main'関数内で*関数を定義しようとしたからです。 'main'関数の前など)を外側に移動する必要があります。 – dreamlax

+0

非常にうまくいきました。索引がどのカテゴリに属しているかを調べる方法を示すコードを掲載しました。少し時間がかかり、誰かにとって有用かもしれません。再度ありがとうDreamlax&ケビン。 – Octave1

0

あなたはAさんが前面に常にいることを知っているように、あなたは、最初の配列をシャッフルすることなく、それを行うことができます:

#define IndexCount 20 
#define ExtractCount 4 
#define TypeACount 4 

int indicesRemainingCount = IndexCount; 
int indices[IndexCount] = { ... }; // your indices, first 4 are type A 
int chosenIndices[ExtractCount]; // to be filled with random elements from indices, max one of type A 

int minIndex = 0; 
for (int i = 0; i < ExtractCount; ++i) { 
    int j = minIndex + arc4random_uniform(indicesRemainingCount - minIndex); 
    chosenIndices[i] = indices[j]; 
    if (j < TypeACount) { 
     // Set minIndex so I won't pick another A. 
     minIndex = TypeACount; 
    } else { 
     // Remove the chosen B so I don't pick it again. 
     --indicesRemainingCount; 
     indices[j] = indices[indicesRemainingCount]; 
    } 
} 
+0

これは、入力配列を破壊的に変更したい限り、妥当です。 –

+0

彼はそれをシャッフルしたいと言った。だから彼はそれを修正するか、それをコピーするつもりだった。 –

+0

「破壊的に」というのは、まず配列に含まれていたデータを捨ててしまうことです。セルを交換するのではなく、それらを上書きします。あなたがそれをスワップに変更した場合、それはシャッフルの場合と同じになります。 –

関連する問題