Ошибка неверного преобразования при попытке предотвратить изменение массива при вызове функцией - PullRequest
0 голосов
/ 04 февраля 2019

Для этого назначения мне нужно сделать отсортированную копию массива, для которого пользователь дал значения.Весь мой код работает как задумано, за исключением этой конкретной части.Мне нужна эта функция (sortedCopy) для распечатки отсортированной версии их массива, без фактического изменения самого массива.Насколько я могу судить, для этого мне нужно было использовать постоянную версию массива в функции, чтобы прототип был примерно таким: int * sortedCopy (const int * array, int size), но все, что это делает, это даетошибка указана в названии.В частности:

main.cpp:72:29: error: assignment of read-only location '*(array + 
((sizetype)(((long unsigned int)i) * 4)))' array[i] = array[min]

, и он делает эту ошибку дважды, за исключением массива [min] = temp;в конце вместо этого

Этот код используется с соответствующими частями main:

#include <iostream>
using namespace std;

int* sortedCopy(const int *array, int size) {
    int i, j, min, temp;
    for (i = 0 ; i < size - 1; i++) {
        min = i;
        for (j = i + 1; j < size; j++) {
            if (array[j] < array[min]) {
                min = j;
            }
        }
        temp = array[i];
        array[i] = array[min];
        array[min] = temp;
    }
    cout << "Sorted array is: " << endl;
    for(int i = 0; i < size; i++) {
        cout << array[i] << " ";
    }
    cout << endl;
    // Not sure if I need to return anything or not either
}

int main() {
    cout << "Please enter the size of the array." << endl;
    int arraySize;
    int array[arraySize]; 
    cin >> arraySize;
    cout << "Please enter integer values until the array is filled." << endl;
    for (int i = 0; i != arraySize; i++) {
        cout << "Value " << (i + 1) << ": "; 
        cin >> array[i];
        cout << endl;
    sortedCopy(array, arraySize);
    for (int i = 0; i != arraySize; i++) { // I want this part to print the 
    cout << array[i] << " ";               // original array entered by the user
    }
}

Если я удалю константную часть функции, она будет работать нормально, за исключением того, чтовыведите отсортированный массив после вызова функции вместо исходного массива.

1 Ответ

0 голосов
/ 04 февраля 2019

Во-первых, C / C ++ лучше всего читать «сверху вниз»:

int arraySize;
int array[arraySize]; // arraySize is undefined here!!
cin >> arraySize;

Во второй строке, ArraySize, может быть 1, или 0, или -1000.Вы не определили его до третьей строки. Кроме того, C ++ не позволяет выделять массивы переменного размера (если только этот размер не является константным [поэтому он известен во время компиляции]):

int array[4];

Выше хорошо.Это помогает операционной системе узнать, сколько памяти выделено для вас в стеке (это необходимо сделать до запуска программы).

const int arraySize = 4;
int array[arraySize];

Поскольку компилятор C ++ знает, что arraySize равен 4, он обрабатываетэто так же, как приведенный выше код, так что это тоже хорошо.

Таким образом, для обработки массивов действительно переменной длины (длина зависит от входных данных), вам нужно сначала прочитать пользовательские вводы, , а затем используйте динамическое выделение («новый», или контейнер, который выполняет динамическое выделение для вас, например, вектор).

Что касается проблемы с «const», я думаю, что вам нужно понять, что«const» - это просто обещание программиста: программист сообщает компилятору (и всем программистам, читающим код), что эти данные не должны изменяться.Все, что делает компилятор, это проверяет, выполняете ли вы свое обещание (или отправляете ли вы его другой функции / указателю, который не выполняет это обещание).Таким образом, используя «const», вы не выполняете работу по поддержанию константности данных - просто вы получите жалобу, если вы не выполнят эту работу.

int* sortedCopy(const int *array, int size) {

Выше вы указываете компилятору, что функция sortedCopy будет сохранять данные в массиве постоянными.

    array[i] = array[min];
    array[min] = temp;

И здесь (выше) вы нарушаете это обещание.

Если вы не хотите редактировать исходный массив, то самое простое решение - просто скопировать его перед отправкой в ​​функцию сортировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...