2012-01-31 2 views
0

나는 인덱스 [1 ... 20] 배열을 가지고 있습니다. indicesArray의 처음 4 개 요소는 특정 유형의 파일 (유형 A)에 연결되고 다른 16 개는 유형 B에 연결됩니다.enum을 사용하여 정수 범위에 유형을 지정 하시겠습니까?

임의로 배열을 임의로 섞습니다. 이제 인덱스 중 4 개를 추출하려고하지만 최대 4 개 중 하나만 A 유형이 될 수 있습니다.

인덱스 1 - 4를 "유형 A"로 정의하려면 여기에서 enum 함수를 사용해야한다고 생각합니다. & 인덱스 "유형 B"로 5-20, 그렇다면 내가 보았다면 내 새로 랜덤 화 된 indicesArray [0]의 첫 번째 요소는 어떤 유형인지 알 수 있습니다. & 이에 따라.

내가 열거 본 예에서 사용했던 방법은 간다 같은 :

enum category { typeA = 0, typeB }; 

그것은 &에게 b를 입력에 나머지 TYPEA하는 인덱스 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 "은 우연히 두 번째 메인이 믹스에 던져 지거나, 그런 식으로 일어날 때 주로 발생합니다. 어떤 아이디어?

편집 연습

당신은 트랙 떨어져있어
#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로 지정할 수는 없습니다. Enum 상수는 정확하게 하나의 값을 가지며 하나만 값을가집니다. 당신이 할 수있는 일은 enum을 사용하여 이미 완료 한 것처럼 typeAtypeB의 두 가지 유형을 정의한 다음 색인을 유형으로 다시 매핑하는 함수를 정의하는 것입니다.

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

이제 색인을 분류 할 수 있습니다. 당신이 A의를 알 수 있도록

+0

감사합니다. Kevin, 그 말이 맞아요. 나는 그것을 시험해 보았습니다. 기대하지 않았던 오류가 중첩 된 함수와 관련이 있습니다. 위에 약간의 코드 스 니펫을 게시했습니다. – Octave1

+2

@ Octave1 : 프로그램의'main' 함수 내에서 * 함수를 정의하려고했기 때문입니다. 'main' 함수와 같이 외부로 옮겨야합니다. – dreamlax

+0

위대한 그 일을 아주 잘, 내가 좀 알아 냈어 데 시간이 걸렸으므로 주어진 인덱스가 속한 카테고리를 확인하는 방법을 보여주는 몇 가지 코드를 게시했습니다, 그리고 누군가에게 유용 할 수 있습니다. 다시 한번 Dreamlax & Kevin에게 감사드립니다. – Octave1

0

당신은 먼저 배열을 셔플하지 않고 그것을 할 수에게 앞에 항상 :

#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

"destructively"이란 말은 배열에 있던 데이터를 버리고 있다는 뜻입니다. 셀을 바꾸는 대신 덮어 씁니다.당신이 스왑을 변경했다면, 그것은 셔플 케이스와 동일하게됩니다. –

관련 문제