努力保持阵列从当一个函数调用时变化转换无效错误

问题描述 投票:-1回答:1

对于这项任务,我需要一个数组的用户给出值的排序的副本。我所有的代码按预期工作,除了这个特定部分。我需要这个功能(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++ arrays sorting pointers const
1个回答
1
投票

首先,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;

在这里,(上面),你正在打破这一承诺。

如果你不想编辑原始阵列,那么最简单的解决办法就是将它发送给你的排序功能前将其复制。

© www.soinside.com 2019 - 2024. All rights reserved.