当函数调用时,试图阻止数组更改时发生无效转换错误

Invalid conversion error when trying to keep array from changing when called by a function

本文关键字:转换 错误 无效 函数调用 数组      更新时间:2023-10-16

对于这个赋值,我需要对用户给定值的数组进行排序。除了这个特定的部分,我的所有代码都能正常工作。我需要这个函数(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外,它会两次执行此错误;而不是

这是使用的代码,与主要的相关部分:

#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部分,它会完全正常工作,只是它会在调用函数后打印排序后的数组,而不是原始数组。

首先,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,所以它像上面的代码一样处理它,所以这也没问题。

因此,要处理真正可变长度的数组(长度取决于输入),您需要首先读取用户输入,然后使用动态分配("new",或为您进行动态分配的容器,如向量)。

至于"const"的问题,我认为你需要理解的是,"const"实际上只是程序员的一个承诺:程序员正在与编译器(以及任何阅读代码的程序员)沟通,这些数据不应该改变。编译器所做的只是检查您是否遵守了承诺(或者您是否将其发送给不包含该承诺的另一个函数/指针)。因此,使用"const"并没有为您实际保持数据恒定所做的工作——只是如果不做这项工作,它会抱怨。

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

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

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

在这里(上图)你违背了这个承诺。

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