尝试在函数调用时阻止数组更改时发生无效的转换错误

时间:2019-02-04 02:11:21

标签: c++ arrays sorting pointers const

对于此分配,我需要为用户提供了值的数组制作排序后的副本。除了该特定部分,我所有的代码均按预期工作。我需要此函数(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]

,它会执行两次此错误,但array [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
    }
}

如果我删除了函数的const部分,它会很好地工作,除了它将在调用函数后打印排序后的数组而不是原始数组。

1 个答案:

答案 0 :(得分:1)

首先,最好从“自上而下”阅读C / C ++:

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

在第二行,ArraySize可能为1、0或-1000。直到第3行,您都尚未定义它。 另外,C ++不允许您分配可变大小的数组(除非大小为const [因此在编译时就知道了)):

int array[4];

上面很好。这样可以帮助操作系统知道要在堆栈上为您提供多少内存(在程序开始运行之前需要这样做)。

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

由于C ++编译器知道arraySize为4,因此它就像上面的代码一样处理,因此也很好。

因此,要处理真正可变长度(取决于输入的长度)的数组,您需要先读取用户输入,然后使用动态分配(“ new”或动态执行的容器为您分配资源,就像矢量一样。

关于“ const”的问题,我认为您需要在这里理解的是,“ const”实际上只是程序员的诺言:程序员正在与编译器进行通信(以及所有读取代码的程序员)该数据不应更改。编译器所做的只是检查您是否遵守承诺(或者是否将其发送给持有该承诺的另一个函数/指针)。因此,通过使用“ const”,实际上没有使数据保持不变的任何工作-只是如果不做工作,它将抱怨。

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

在上面,我们向编译器标记 sortedCopy 函数将使数组中的数据保持不变。

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

在这里(上),您正在兑现承诺。

如果您不想编辑原始数组,那么最简单的解决方案是在将其发送到排序功能之前将其复制。