Передача неизвестного массива в функцию по ссылке (C ++)

Я потратил хороший час, пытаясь выяснить это — как мне написать эту функцию (в верхней части кода — inserttionSort), которая позволяет мне передавать массив по ссылке на него. Таким способом, который позволяет мне вызывать «.size» в массиве. Это должен быть массив для этого назначения.

Я пытался не передавать его по ссылке, разыменовывать массив перед вызовом размера и т. Д. Я продолжаю получать ошибки :(.

Это самая последняя ошибка компилятора для этого кода:

inserttionSort.cpp: 11: ошибка: параметр «A» включает ссылку на массив с неизвестной границей «int []»
inserttionSort.cpp: в функции void inserttionSort (int (&) [])»:
inserttionSort.cpp: 13: ошибка: запрос на членство «размер» в ‘(интермедиат) A ’, который не относится к классу типа« 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;
}

2

Решение

Важно помнить, что массивы C — это просто указатели на первый элемент массива. Передать массив очень просто, вы бы просто сделали что-то вроде:

void foo(int *array)

или же

void foo(int array[])

Однако, поскольку это просто указатель на его базовый тип, у него нет функций-членов для вызова, и он не имеет ни малейшего представления о том, как структура памяти выглядит за ее пределами (т. Е. Не имеет понятия длины). Если вы хотите узнать длину переданного динамического массива, вам нужно передать длину в качестве второго параметра, предположительно, любой созданный массив должен знать его длину.

void foo(int *array, unsigned int length)

Или вы можете избежать всего этого и использовать векторы, которые концептуально похожи на ArrayList в Java.

0

Другие решения

Когда вы делаете:

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])

это правильный способ передать массив по ссылке.

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;
}
}
0

Попробуйте использовать Array.length, который должен работать в Borland C ++ Builder.

-5
По вопросам рекламы [email protected]