Я потратил хороший час, пытаясь выяснить это — как мне написать эту функцию (в верхней части кода — 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;
}
Важно помнить, что массивы C — это просто указатели на первый элемент массива. Передать массив очень просто, вы бы просто сделали что-то вроде:
void foo(int *array)
или же
void foo(int array[])
Однако, поскольку это просто указатель на его базовый тип, у него нет функций-членов для вызова, и он не имеет ни малейшего представления о том, как структура памяти выглядит за ее пределами (т. Е. Не имеет понятия длины). Если вы хотите узнать длину переданного динамического массива, вам нужно передать длину в качестве второго параметра, предположительно, любой созданный массив должен знать его длину.
void foo(int *array, unsigned int length)
Или вы можете избежать всего этого и использовать векторы, которые концептуально похожи на ArrayList в Java.
Когда вы делаете:
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])
это правильный способ передать массив по ссылке.
Массивы могут быть переданы по ссылке, например:
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;
}
}
Попробуйте использовать Array.length, который должен работать в Borland C ++ Builder.