【发布时间】:2019-06-27 19:06:44
【问题描述】:
对于这个分配,我需要对用户赋予值的数组进行排序副本。我的所有代码都按预期工作,除了这个特定部分。我需要这个函数(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 部分,它完全可以正常工作,只是它会在调用函数后打印排序后的数组,而不是原始数组。
【问题讨论】:
-
// Not sure if I need to return anything or not either如果您承诺返回int*(或任何其他非 void 类型),违反该承诺就是未定义行为。 -
int* sortedCopy(const int *array, int size)可能应该动态创建一个新数组并返回该新数组,而不是修改您现在尝试执行的原始数组。 -
int arraySize;int array[arraySize];cin >> arraySize;您创建了未定义大小的数组。另请注意,非常量长度的静态数组不是 C++ 标准的一部分 -
另外 - 这可能只是从复制到 stackoverflow 的拼写错误,但是 - 在第一个 for 循环之后需要一个右括号。通常,在使用 stackoverflow 时,尽量让您的问题尽可能小而简单,同时仍然代表原始问题(在这种情况下,编译器会因为“const”而抱怨)。这通常意味着与您第一次遇到问题的程序相比,让示例代码做一些非常不同的事情。这有助于您自己调试,并为我们读者节省大量时间。
标签: c++ arrays sorting pointers constants