2015-03-01 2 views
0

Я пытаюсь прочитать неизвестное количество элементов в массиве, когда мой размер достигает текущей емкости, я вызываю функцию, чтобы удвоить размер и скопировать содержимое старого массива в новый массив. Я получил свой «&», но, похоже, он все еще передает массив по значению.Как динамически изменять размеры массивов?

#include <iostream> 
#include <fstream> 
using namespace std; 
void resize(int*&, int&); 

int main() { 
    ifstream in("numbers.input"); 
    int cap = 10; 
    double avg; 
    int total = 0; 
    int size = 0; 
    int *arr = new int [cap]; 
    int temp; 

    for(int i =0; i <cap; i++){ 
     in >> temp; 
     if(size >= cap) { 
      resize(arr,cap); 
     } 
     arr[i]=temp; 
     total += arr[i]; 
     size++; 
    } 
    avg = (double) total/cap; 
    cout << cap <<endl; 
    cout << size <<endl; 
    cout << total <<endl; 
    cout << avg; 
    return 0; 

} 
void resize(int *&arr,int &cap) { 
    cap*=2; 
    int* newArr = new int[cap]; 
    for(int i = 0; i < cap; i++){ 
     newArr[i] = arr[i]; 
    } 
    delete [] arr; 
    arr = newArr; 
} 
+1

Почему так сложно форматировать код перед публикацией ... –

+4

Использовать вектор и избежать проблемы? –

+0

Какие у вас есть доказательства того, что «массив» (фактически указатель) не передается по ссылке? Это не значит, что это сложно проверить для этого утверждения. – chris

ответ

1

Все вы пытаетесь реализовать «вручную» уже в стандартной библиотеки. Используйте std :: vector <>, который реализует стратегию удвоения/перераспределения, очень похожую на то, что вы делаете .

#include <fstream> 
#include <vector> 

int main() { 
    std::ifstream in("numbers.input"); 
    std::vector<int> arr; 
    int temp; 
    while (in >> temp) { arr.push_back(temp); } 

    // process your data ... 
} 

См http://www.cplusplus.com/reference/vector/vector/

Чтобы ответить на этот вопрос более буквально: Массивы всегда передаются посредством ссылки, как правило, путем передачи указателя на первый элемент.

+0

Рассмотрите возможность редактирования названия вашего вопроса? Это действительно касается динамического изменения размера массива. –

+0

Я бы использовал вектор, если мог, но назначение вызывает массив. Но спасибо, во всяком случае. –

0

Функция изменения размера выполняет указатель по ссылке и изменяет значение переменной, с которой она вызывается. Однако у вас есть целый ряд ошибок:

  1. Вы копируете cap элементы из старого массива, но уже в два раза cap, что приводит к из связанного доступа и возможного сбоя.
  2. Функция resize никогда не вызывается из-за ошибки в вашем входном цикле. Вы должны пройти через отладчик (или хотя бы добавить несколько вызовов трассировки cout), чтобы выяснить, что происходит. Постарайтесь понять это, если вы не можете сообщить мне об этом.
  3. Ваше усреднение - cap в качестве делителя. Это неправильное.

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

Примечание 2: В вашем вопросе вы также должны точно сказать, что происходит с вашей программой - «кажется, что передача массива по значению» немного расплывчата - почему вы думаете, что он не проходит по значению ?

+1

Есть еще одна проблема. Преждевременное изменение значения 'cap' в функции' resize' до вызова 'new []'. Если 'new []' выдает исключение, 'cap' теперь имеет неправильное значение. – PaulMcKenzie

+0

Ну, я думаю, что он передает его по значению, потому что массив остается неизменным, но, как вы указали, функция его изменения даже не вызывается.Тем не менее, вы указали мне в правильном направлении, и я очень ценю это. –

+0

Я получил его, чтобы изменить размер. Однако, я думаю, что исключение вызывает нехватка памяти (std :: bad_alloc), но я смущен. Должны ли новые и удаленные защищать меня от этого? –