Назначение типов диапазону целых чисел с помощью enum? - PullRequest
0 голосов
/ 01 февраля 2012

У меня есть массив индексов [1 ... 20]. Первые 4 элемента indicesArray связаны с файлом определенного типа (назовите его тип A), остальные 16 связаны с типом B.

Я перемешиваю массив наугад. Теперь я хочу извлечь 4 из индексов, но самое большее только один из 4 может иметь тип A.

Я думаю, что мне нужно использовать здесь функцию enum, чтобы определить индексы 1-4 как "тип A" и индексы 5-20 как "тип B", тогда, если я посмотрю, например, на. первый элемент моего недавно рандомизированного indicesArray [0], я мог бы сказать, какой это тип и действовать соответственно.

То, как я видел enum из примеров, выглядит примерно так:

enum category { typeA = 0, typeB };

Можно ли назначить индексы 1-4 для типа A, а остальные для типа B, или я здесь не на том пути? заранее спасибо.

Изменить, чтобы включить фрагмент кода

Я попытался проверить это и сразу столкнулся с ошибкой

 #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 для повторного включения», что обычно происходит, когда вторая основная часть попадает в микс случайно или что-то подобное. Есть идеи?

Изменить, чтобы включить некоторый код, который показывает, как применить решение на практике

#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;

}

Ответы [ 2 ]

1 голос
/ 01 февраля 2012

Ты не в курсе.Вы не можете присвоить 1-4 заданному перечислению.Константы перечисления имеют только одно значение и только одно.Что вы можете сделать, так это использовать enum для определения двух типов, скажем typeA и typeB, как вы уже сделали, а затем определить функцию, которая отображает индекс обратно на тип, например

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

Теперь у вас есть возможность классифицировать ваши индексы.

0 голосов
/ 01 февраля 2012

Вы можете сделать это, не перетасовывая массив, чтобы знать, что буквы А всегда впереди:

#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];
    }
}
...