对于这项任务,我需要一个数组的用户给出值的排序的副本。我所有的代码按预期工作,除了这个特定部分。我需要这个功能(sortedCopy)打印出自己的数组排序的版本,实际上并没有改变该数组本身。据我所知,这样做的,我需要的功能所使用的阵列的恒定版本,以便原型会是这样的:INT * sortedCopy(const int的*数组,INT大小),但是这一切就是为了给在标题所示的错误。特别:
main.cpp:72:29: error: assignment of read-only location '*(array +
((sizetype)(((long unsigned int)i) * 4)))' array[i] = array[min]
这些反应都是错误两次,除了与阵列[分钟] =温度;在最后,而不是
这是所使用的代码,与主要的相关部分:
#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
}
}
如果我删除功能的常量部分,它工作完全正常,但它会打印出数组排序函数被调用后,而不是原来的数组。
首先,C / C ++,最好读“自顶向下”:
int arraySize;
int array[arraySize]; // arraySize is undefined here!!
cin >> arraySize;
在第二行,ARRAYSIZE,可能是1,或0,或-1000。还没有定义它,直到线3。此外,C ++不允许分配可变大小的阵列(除非该尺寸是常量[所以它是在编译时已知]):
int array[4];
以上是好的。这有助于操作系统知道多少内存,为您提供在栈上(它需要做的这个程序开始运行之前)。
const int arraySize = 4;
int array[arraySize];
因为C ++编译器知道ARRAYSIZE是4,它处理这就像上面的代码,所以这也是很好。
因此,要处理真正可变长度(长度取决于输入)的阵列,则需要先读出的用户输入,然后使用动态分配(“新”,或一个,做动态分配为你,就像一个矢量容器)。
至于用“常量”的问题,我认为你需要在这里明白的是,“常量”实际上只是从程序员一个承诺:本程序员沟通,编译器(以及任何程序员阅读的代码),这个数据是不应该改变。所有的编译器是检查是否遵守你的诺言(或者,如果你将它发送到另一个函数/指针不认为承诺)。因此,通过使用“常量”没有完成的工作正在做你真正保持数据不变 - 只是,如果你不这样做的工作,它会抱怨。
int* sortedCopy(const int *array, int size) {
以上您检举到了sortedCopy功能将保持数据的数组常量的编译器。
array[i] = array[min];
array[min] = temp;
在这里,(上面),你正在打破这一承诺。
如果你不想编辑原始阵列,那么最简单的解决办法就是将它发送给你的排序功能前将其复制。