当函数调用时,试图阻止数组更改时发生无效转换错误
Invalid conversion error when trying to keep array from changing when called by a function
对于这个赋值,我需要对用户给定值的数组进行排序。除了这个特定的部分,我的所有代码都能正常工作。我需要这个函数(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;
在这里(上图)你违背了这个承诺。
如果您不想编辑原始数组,那么最简单的解决方案就是在将其发送到排序函数之前将其复制。
- C++使用params创建线程函数会导致转换错误
- 为什么g++在未执行的代码处标记强制转换错误
- 为什么C++在将浮点数转换为字符时没有显示缩小转换错误?
- 如何在构建对象堆栈时解决转换错误?
- 执行具有转换错误的过程
- 指向类成员函数的指针中存在类型转换错误
- 为什么我在这里收到C++没有已知的转换错误?
- 增加图形转换错误
- 尝试向 COM 对象添加另一个接口时出现静态强制转换错误 C2440
- 返回带有另一个类的数据成员的构造函数?遇到转换错误?
- 指针和双重转换错误,代码没有
- 自定义函数转换错误?
- 将 C 程序转换为具有大量字符* 和无符号字符转换错误的C++
- 如何在我使用过的Arduino库之一中固定构造函数中的转换错误
- 试图使用strCMP时的char转换错误
- 我在 TSP 的C++解决方案中遇到转换错误
- "double(*)(string, double, double)"尝试传递函数C++时"double"转换错误
- 此语法中的构造函数转换错误
- Opengl 精度转换错误编译错误 E0415
- 无效的转换错误和无效的类型