【问题标题】:Invalid conversion error when trying to keep array from changing when called by a function尝试在函数调用时保持数组不变时出现无效转换错误
【发布时间】: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 &gt;&gt; arraySize; 您创建了未定义大小的数组。另请注意,非常量长度的静态数组不是 C++ 标准的一部分
  • 另外 - 这可能只是从复制到 stackoverflow 的拼写错误,但是 - 在第一个 for 循环之后需要一个右括号。通常,在使用 stackoverflow 时,尽量让您的问题尽可能小而简单,同时仍然代表原始问题(在这种情况下,编译器会因为“const”而抱怨)。这通常意味着与您第一次遇到问题的程序相比,让示例代码做一些非常不同的事情。这有助于您自己调试,并为我们读者节省大量时间。

标签: c++ arrays sorting pointers constants


【解决方案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;

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

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

【讨论】:

  • 这是我想出的纠正第一部分的代码:cout &lt;&lt; "Please enter the size of the array." &lt;&lt; endl; int arraySize; cin &gt;&gt; arraySize; int *array; 我希望我做得对,虽然我对动态内存分配还是新手,所以请告诉我如果我以正确的方式做到了...否则,是的,只需将数组复制到另一个就可以了,非常感谢您的回答!我应该补充一点,我有 `delete[] 数组; ` a main 的最底层。我也为糟糕的格式道歉,我不确定你如何/是否可以在这些段落中制作段落
  • 我无法编辑最后一条评论,因为我最近已经有了,但我想在第一部分的代码中添加一些东西,我似乎不小心没有包括在内。就是这样:array = new int[arraySize];,然后是int *array;
  • @Spago,简短回答:那行不通。使用stackoverflow,在来这里提问之前,您应该总是花一些时间在谷歌上搜索问题。在这种情况下,谷歌搜索“c++ 动态分配”或“c++ new”将提供关于如何制作任何大小取决于用户输入的数组的全面解释。
猜你喜欢
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多