У меня есть функция сортировки:
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];
}
}
Я опустил детали об алгоритме сортировки, потому что проблема в другом. Дело в том, что есть проблема с объявлением 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
использование в декларации, но я не знаю, как это исправить …
Прочитайте объявления 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.
Других решений пока нет …