通过引用将未知数组传递给函数(C ++)

时间:2014-10-09 03:23:29

标签: c++ arrays pass-by-reference variable-length-array

我花了一个小时试图解决这个问题 - 我如何编写这个函数(在代码顶部--insertSort),它允许我通过引用传递一个数组。在某种程度上,我可以拨打' .size'在阵列上。它必须是这个任务的数组。

我试过不通过引用传递它,在调用它之前取消引用数组,等等。我一直收到错误:(。

这是此代码的最新编译器错误:

insertionSort.cpp:11:错误:参数'A'包含对未知绑定数组的引用'int []' insertionSort.cpp:在函数'void insertionSort(int(&)[])'中: insertionSort.cpp:13:错误:请求'(int )A'中的成员'size',它是非类型'int'

#include <iostream>
//#include <array> - says no such file or directory

using namespace std;


void insertionSort(int (&A)[])                 <-----ERROR HERE
{
    for (int j=1; j <= A->size(); j++)         <-----ERROR HERE
    {
        int key = A[j];
        //now insert A[j] into the sorted sequence a[0...j-1].
        int i = j-1;
        while (i >= 0 && A[i] > key)
        {
            A[i+1] = A[i];
            i -= 1;
        }
        A[i+1] = key;
    }
}

int main()
{
    int Asize = 0;

    cout << "Hello. \nPlease enter a number value for the insertionSort Array size and then hit enter: " << endl;
    cin >> Asize;

    int A[Asize];

    char Atype;

    cout << "There are three ways to order your inserstionSort array; \nb - for best case \nw - for worst case \na - for average case" << endl << "Which type do you desire for this array? \nPlease enter 'b', 'w', or 'a': " << endl;
    cin >> Atype;

    if (Atype == 'b')
    {
        cout << "You have chosen type b." << endl;
    }

    else if (Atype == 'w')
    {
        cout << "You have chosen type w." << endl;
    }

    else if (Atype == 'a')
    {
        cout << "You have chosen type a." << endl;
    }


    cout << "Terminate Program" << endl;
}

4 个答案:

答案 0 :(得分:1)

当你这样做时:

std::cin >> Asize;
int A[Asize]; // Not standard

使用编译器的扩展名来使用VLA(可变长度数组)。 我更喜欢使用std::vector(然后你有void insertionSort(std::vector<int> &v))。

如果您无法使用std::vector,则可以使用:

std::unique_ptr<int[]> A(new int [Asize]);

由于仅在运行时知道大小,因此必须将大小传递给函数:

void insertionSort(int* a, std::size_t size)

并按以下方式致电insertionSort

insertionSort(A.get(), ASize);

使用已知的数组编译时间大小

void insertionSort(int (&A)[42])

是通过引用传递数组的正确方法。

答案 1 :(得分:0)

重要的是要记住C数组只是指向数组第一个元素的指针。传递数组很简单,你可以这样做:

void foo(int *array)

void foo(int array[])

然而,因为它只是指向它的基类型的指针,所以它没有要调用的成员函数,并且它不知道内存结构在它之外是什么样的(即没有长度概念)。如果你想知道传递的动态数组的长度,那么你需要将长度作为第二个参数传递,大概是创建的数组应该知道它的长度。

void foo(int *array, unsigned int length)

或者,你可以避免所有这些,并使用概念上类似于java中的ArrayList的向量。

答案 2 :(得分:0)

可以通过引用传递数组,例如:

void somefunc(int (&arr)[30]) {}

这将确保您不能为此数组传递任何其他大小(固定大小数组): 所以,你不能这样做:

int a[40];
func(a); // compilation error

但是,任意大小的数组也可以通过引用传递,例如:

template<typename T, size_t N>
void somefunc2(T (&arr)[N])
{
    // N can be used as size, as required, instead of querying size of the array
}

因此,纠正的功能如下:

template<typename T, size_t N>
    void insertionSort(T (&A)[N]) // ok, now
    {
        for (size_t j=1; j < N; j++) 
        {
            int key = A[j];
            //now insert A[j] into the sorted sequence a[0...j-1].
            int i = j-1;
            while (i >= 0 && A[i] > key)
            {
                A[i+1] = A[i];
                i -= 1;
            }
            A[i+1] = key;
        }
    }

答案 3 :(得分:-5)

尝试使用可在Borland c ++ builder

中使用的Array.length