对于此分配,我需要为用户提供了值的数组制作排序后的副本。除了该特定部分,我所有的代码均按预期工作。我需要此函数(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部分,它会很好地工作,除了它将在调用函数后打印排序后的数组而不是原始数组。
答案 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;
在这里(上),您正在兑现承诺。
如果您不想编辑原始数组,那么最简单的解决方案是在将其发送到排序功能之前将其复制。