2010-11-02 6 views
9

У меня есть небольшая проблема с 1D-массивом в C++. У меня есть функция линии это:C++ динамический размер массива

void func(int (&array)[???]) 
{ 
    // some math here; 

    "for" loop { 
     array[i] = something; 
    } 
} 

я называю функции где-то в коде, и, прежде чем я сделал математику я не могу знать размер массива. Массив переходит к функции в качестве ссылки !, потому что она мне нужна в функции main(). Как я могу выделить массив, подобный этому ?, так что массив с? измерение переходит к функции в качестве ссылки, тогда я должен поместить измерение и записать ему некоторые значения.

+5

Действительно, ваш вопрос немного неясен. Является ли ваша проблема распределением, доступом или передачей массива функции?Пожалуйста, покажите фактический код, который иллюстрирует вашу проблему, или опишите, что вы на самом деле хотите сделать. –

+0

Массив ссылок - это необычный зверь: вы, вероятно, не хотите использовать подобные ссылки. –

+0

@Eamon: у вас не может быть массива ссылок, приведенный выше код является ссылкой на массив. – 2010-11-02 10:53:51

ответ

9

Используйте указатель, а не ссылка:

void func(int *a, int N); 

Или, проще использовать вектор:

void func(std::vector<int> &a); 

векторы могут быть выделены, просто говоря

std::vector<int> a(10); 

число элементов можно получить с помощью a.size().

+0

Вот и все :) Большое спасибо, С наилучшими пожеланиями! – nykon

14

Поскольку вы используете C++, почему бы не использовать std::vector<> вместо этого?

+1

+1: для 'std :: vector'. – rubenvb

+0

Дополнительный +1 для вектора, я использую их все время в любое время, когда я не знаю, насколько великим будет «что-то». – 2010-11-02 11:53:37

+0

Считаете ли вы, что ответ полезен для новичка? –

10

Другие упомянули, что вы должны использовать std::vector в C++, и они правы.

Но вы можете сделать свой код, сделав func шаблоном функции.

template <typename T, size_t N> 
void func(T (&array)[N]) 
{ 
    // some math here; 

    "for" loop { 
     array[i] = something; 
    } 
} 
+0

Метод функции шаблона является ярким примером: «как реализовать функциональность, уже присутствующую в стандартной библиотеке» ... – rubenvb

+6

@rubenvb: Как вы думаете, что здесь реализовано? – 2010-11-02 10:52:01

+5

Я согласен с этими «вы должны использовать вектор»; ОК; но этот ответ дает возможность решить и понять главный вопрос OP ... –

5

Если массив вы передаете func является массив стека, а не указатель, вы можете сохранить его размер с помощью шаблона функции:

template <class T, size_t N> 
void func(T(&array)[N]) 
{ 
    size_t array_length = N; // or just use N directly 
} 

int main() 
{ 
    int array[4]; 
    func(array); 
} 

Тем не менее, как и другие уже указывали out, std::vector, вероятно, лучшее решение здесь.

+0

Это интересно. – CiscoIPPhone

+0

, но не нужно, потому что внутри func вы получили шаблон-параметр N, который содержит ту же информацию (что и константа времени компиляции). –

+0

@Fabio - правый, отметил. –

0

Как и вектор, который был предложен, вы могли бы использовать valarray, который также является частью STL, и предназначен специально для обработки математических коллекций.

0

Что вы должны понимать, это то, что массивы являются указателями. Определение типа int array[5] выделит пространство для 5 целых чисел в стеке, а array будет адресом первого значения. Таким образом, чтобы получить доступ к первому значению в массиве, вы можете написать

array[0] или *array (который является таким же, как *(array + 0))

Таким же образом, чтобы получить адрес третьего элемента, можно написать

&array[2] или array + 2

поскольку массивы указателей, вам не придется беспокоиться о размере выполнения вашего массива, если вы хотите, чтобы передать его в функцию, просто передать его как указатель:

void func(int *array) 
{ 
    int size; 
    //compute size of the array 
    for (int i = 0; i < size; ++i) 
    { 
     //do whatever you want with array[i] 
    } 
}

Смежные вопросы