2012-05-07 4 views
1

두 단계로 정수의 2D 배열을 선언 할 수있는 방법이 있습니까? 범위에 문제가 있습니다.2D 배열 선언 - 목적 C

이제
//I know Java, so this is an example of what I am trying to replicate: 

int Array[][]; 
Array = new int[10][10]; 

는, OBJ-C에서 나는 비슷한 싶지,하지만 난 구문 권리를 얻을 기운이 내가 할 노력하고 있어요 것입니다. 지금은 그것을 한 번에,하지만 나는 현재 그것을 가지고있는 경우에는 문 외부에서 사용할 수 없습니다 :

int Array[10][10]; //This is based on an example I found online, but I need 
        //to define the size on a seperate line than the allocation 

이 사람이 나를 도울 수 있습니까? 나는 아마도 더 기본적인 질문을 안다. 그러나 당신은 메시지의 바깥쪽에 "new"라는 키워드를 사용할 수없고, int에 메시지를 보낼 수 없다. :(

이 *편집 1 :. **

내 문제가 범위와 관련이

//Declare Array Somehow 
Array[][] //i know this isn't valid, but I need it without size 

//if statement 
if(condition) 
Array[1][2] 
else 
Array[3][4] 

//I need to access it outside of those IFs 

//... later in code 
Array[0][0] = 5; 
+0

당신은 * * 목표 - C에서 모든'new'을 사용할 수 없습니다. – rid

답변

4

당신이 경계 중 하나의 크기를 알고 있다면 이것은, 2 차원 배열을 만드는 나의 선호하는 방법입니다 :

int (*myArray)[dim2]; 

myArray = calloc(dim1, sizeof(*myArray)); 

그리고 그것을

free(myArray); 

불행하게도, 경계 중 하나가이 고정되어야한다

이 작동하는 하나 호출 해제 할 수 있습니다. 당신이 경계 중 하나를 모르는 경우

그러나,이 역시 작동합니다 :

static inline int **create2dArray(int w, int h) 
{ 
    size_t size = sizeof(int) * 2 + w * sizeof(int *); 
    int **arr = malloc(size); 
    int *sizes = (int *) arr; 
    sizes[0] = w; 
    sizes[1] = h; 
    arr = (int **) (sizes + 2); 

    for (int i = 0; i < w; i++) 
    { 
     arr[i] = calloc(h, sizeof(**arr)); 
    } 

    return arr; 
} 

static inline void free2dArray(int **arr) 
{ 
    int *sizes = (int *) arr; 
    int w = sizes[-2]; 
    int h = sizes[-1]; 

    for (int i = 0; i < w; i++) 
     free(arr[i]); 

    free(&sizes[-2]); 
} 
+0

첫 번째 방법이 저에게 효과적이었습니다. (행운이있는 것은 1 개의 고정 된 치수를 가지고 있었다!!) 그렇게 많이 고마워해라!! – MrHappyAsthma

+0

이것은 가변 크기의 2D 배열을 만드는 아름다운 솔루션입니다. free2dArray (•)에서 h가 사용되지 않는다는 것에 유의하십시오. –

0

당신이 보여 선언 (예 : int Array[10][10];)는 OK, 그리고 것 선언 된 범위에서 유효합니다. 클래스 범위에서 수행하면 전체 클래스에 유효합니다.

배열 크기가 다른 경우 동적 할당 (예 : malloc 친구) 나에 대한 (NSMutableArray를 사용하는 비 기본 데이터 형)

+0

범위 밖에서 액세스해야합니다. 배열의 크기는 If-Else 문 집합에 따라 달라 지지만 IF/Else가 사용되는 외부 변수는 사용할 수 없습니다. – MrHappyAsthma

+0

편집보기 ... ... – MByD

+0

내 질문에 대해 더 자세히 설명하기 위해 메인 포스트를 편집했지만 NSMutableArray를 사용할 수 있다고 가정합니다. 전적으로 "int"값으로 작업하고 있습니다. 그래서 [intValue]와 같은 메시지를 계속 보낼 필요가 없도록 기본 유형을 고수하려고했습니다. – MrHappyAsthma