2014-10-09 8 views
2

Я потратил хороший час, пытаясь понять это - как написать эту функцию (вверху кода - insertionSort), которая позволяет мне передать массив по ссылке на него , Таким образом, я могу вызвать '.size' в массиве. Он должен быть массивом для этого назначения.Передача неизвестного массива в функцию по ссылке (C++)

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

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

insertionSort.cpp: 11: ошибка: параметра 'А' включает в себя ссылку на массив неизвестного связанного 'INT []' insertionSort.cpp: В функции 'недействительной сортировка вставок (интермедиат (&) [])': insertionSort.cpp : 13: ошибка: запрос для пользователя '' '' '(INT) 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; 
} 
+0

Это не Java. У родных массивов нет члена 'size()'. – WhozCraig

+2

Если размер не фиксируется во время компиляции, вы должны использовать 'std :: vector <>' – quantdev

+1

. Вы не можете «вызывать. Размер в массиве». Встроенные массивы на C++ не являются классами, у них нет методов. Вы не можете «называть» что-либо в массиве. И вообще невозможно определить размер массива, если вы уже не знаете этого размера. – AnT

ответ

-5

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

+0

Я просто попытался сделать .length вместо этого, и я получил ту же ошибку, но со словом «длина» вместо «размер» haha ​​ –

0

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

void foo(int *array) 

или

void foo(int array[]) 

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

void foo(int *array, unsigned int length) 

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

+0

Отлично. Это облегчает жизнь. Спасибо. Таким образом, нет способа сделать это без добавления другого параметра? –

+0

Проверьте векторы, они сделают вашу жизнь намного проще. http://www.cplusplus.com/reference/vector/vector/ –

+0

И я хочу запомнить вас, что утверждение «C-массивы - это просто указатели» - это просто сказать, что Земля плоская (а это не так). – AnArrayOfFunctions

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

вы, вероятно, хотите 'for (size_t j = 0; j

+0

Спасибо, @MattMcNabb, отредактировал мой ans –

0

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

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

используется расширение компилятора, чтобы использовать VLA (Variable массив длины). вместо этого предпочитает использовать 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); 

С известным размером времени компиляции rray,

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

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