2013-10-30 3 views
0

구조체하기 : 문제가 다른 곳이기 때문에C++ 정렬 배열은 내가 기능을 분류 한

void countingSort(TPhone * const * array, int count) { 

    // some code 

    // making copy od array 
    TPhone * const * arrayCopy = new TPhone * [count]; 

    for(int i = 0; i < count; i++) { 
     arrayCopy[i] = array[i]; 
    } 

    for(int i = 0; i < count; i++) { 
     int index = // some function to determine where to place array[i] 
     array[index] = arrayCopy[i]; 
    } 
} 

은 내가 정렬 알고리즘에 대한 세부 정보를 ommited. 문제는 arrayCopy 신고 문제입니다.

... 라인에

arrayCopy[i] = array[i] 
... 
array[index] = arrayCopy[i]; 

이 오류 메시지가

error: assignment of read-only location ‘*(arrayCopy + ((sizetype)(((long unsigned int)i) * 8ul)))’ 
error: assignment of read-only location ‘*(array + ((sizetype)(((long unsigned int)index) * 8ul)))’ 

이 선언에 const 사용에 문제를이 있어야 얻을하지만 난 그것을 해결하는 방법을 모른다

+0

왜 const를 사용하고 있습니까? 상수로 선언 할 때 컴파일러에 수정하려고하지 않는다고 알려줍니다. –

+0

아마도 매개 변수의 형식 선언을 복사했습니다. 'TPhone * const *'를'TPhone *'(또는'auto')로 변경하십시오. –

+0

@RedAlert 귀하의 요지를 이해하지 못합니다. 포인터 배열 * in *은 확실히 포인터와 const가 될 수 있습니다. 그것들은 여기에서 수정되어서는 안된다. 해당 포인터가 가리키는 내용이 아닌 포인터 배열 * content *가 변경됩니다. 그래서 OP 컴파일러에게 "이것은 포인터 - 투 - const 객체의 수정 가능한 포인터 배열입니다. 합리적인 것보다 더 많이 보인다. 그들은 잘못하고있다.하지만 아이디어는 확실하다. – WhozCraig

답변

3

오른쪽에서 왼쪽으로 const 및 포인터 선언 읽기 :

TPhone * const * arrayCopy 
^^^^^
    | | | | \---- arrayCopy is a 
    | | | \------------ pointer to 
    | | \------------------- const 
    | \-------------------------- pointer to 
    \--------------------------------- TPhone 

그래서 arrayCopy는 사실 상수 포인터의 배열입니다 (배열도 마찬가지입니다). 상수 포인터는 이동할 수 없습니다 (예 : 을 가리킬 수 없습니다). 따라서 덮어 쓸 수 없으므로 정렬 할 수 없습니다.

당신이 일정 TPhone (즉, 당신이 TPhone의 필드를 변경할 수는 없지만 당신이 주변에 포인터를 이동할 수 있습니다)에 대한 포인터의 배열을 원하는 경우에, 당신은 const를 이동해야합니다 : 다음

pointer to constant TPhone: 
TPhone const * // right-to-left 

array of pointer to constant TPhone: 
TPhone const * [] // right-to-left 
but since arrays can't easily be passed to functions, you can use a pointer: 
TPhone const * * // right-to-left 

을 수행 할 수 있습니다 포인터를 (메모리 주소 일뿐입니다)으로 변경하지만 실제 TPhone 개체는 변경할 수 없습니다.