Динамический массив передан функции - PullRequest
1 голос
/ 30 июня 2019

У меня проблема с массивом, размер которого я хочу изменить. Вот мой код:

int main ()
{
    // Build an application here
    int length = 0;
    int size = 0;
    int input;
    bool endAdding = false;

    cout << "Please enter the length of the new array : ";
    cin >> length;

    int* oPtrDynamicArray = CreateDynamicArray (length, size);

    do
    {
        cout << "Add an element (0 to quit) : " << endl;
        cin >> input;
        cout << endl << endl;

        if (input == 0){
            endAdding = true;
        }
        else
        {
            InsertElement(oPtrDynamicArray, input, size, length);
        }
        cout << "The array contains : " << endl;
        for (int i = 0; i < size; i++)
        {
            cout << i << ": [" << oPtrDynamicArray[i] << "]" << endl;
        }
    } while (!endAdding);

    DeleteDynamicArray (oPtrDynamicArray, size);
}

int *CreateDynamicArray (int capacity, int &size)
{
    size = 0;
    return new int[capacity];
}

void DeleteDynamicArray (int *dynamicArray, int &size)
{
    delete[] dynamicArray;
    dynamicArray = nullptr;
    size = 0;
}

void InsertElement (int *dynamicArray, int element, int &size, int capacity)
{
    if (capacity <= size)
    {
        ResizeDynamicArray (&dynamicArray, size+1);
    }

    dynamicArray[size] = element;
    size++;

}

void ResizeDynamicArray (int **dynamicArray, int newCapacity)
{
    int ** newArray = new int*[newCapacity];
    for (int i = 0; i < newCapacity; i++) 
    {
        newArray[i] = dynamicArray[i];
    }

    *dynamicArray = *newArray;

    delete[] newArray;
    newArray = nullptr;
}

Проблема в том, что массив передается в мою функцию «InsertElement», а затем в мой «ResizeDynamicArray» только в случае, если емкость <= размер, но массив, переданный в первое выражение, передается с хорошими значениями, но с анормальные указатели в массиве. </p>

Пример:

Для массива 3 у меня есть:

array [0] = 1 -> адрес 0x0004e300, содержащий значение 1

массив [1] = 2 -> адрес 0x00000003, содержащий ???

array [2] = 3 -> адрес 0x008ffb24, содержащий значение 2

Я действительно не понимаю, было бы здорово, если бы кто-то мог объяснить мне мою ошибку: /.

К вашему сведению, мне не нужны векторы, это упражнение для динамических массивов, поэтому мне нужны динамические массивы.

Спасибо за вашу помощь!

Ответы [ 2 ]

1 голос
/ 30 июня 2019

Проблема здесь

void InsertElement (int *dynamicArray, int element, int &size, int capacity)
{
    if (capacity <= size)
    {
        ResizeDynamicArray (&dynamicArray, size+1);
    }
    dynamicArray[size] = element;
    size++;
}

при вызове ResizeDynamicArray вы меняете указатель dynamicArray, объявленный как параметр, на InsertElement. Вы не меняете указатель oPtrDynamicArray в главном.

Если вы хотите сделать эту работу, вам нужно изменить InsertElement на двойной указатель (как ResizeDynamicArray)

void InsertElement (int **dynamicArray, int element, int &size, int capacity)
{
    if (capacity <= size)
    {
        ResizeDynamicArray (dynamicArray, size+1);
    }
    (*dynamicArray)[size] = element;
    size++;
}

Или вы можете сделать простую вещь и просто использовать std::vector<int>.

РЕДАКТИРУЙТЕ теперь, когда я смотрю на вашу вашу ResizeDynamicArray функцию, я вижу, что функция также полностью неверна. Понятно, что вы научились делать с указателями

Вот как ResizeDynamicArray должно быть

void ResizeDynamicArray (int **dynamicArray, int newCapacity)
{
    int * newArray = new int[newCapacity];
    for (int i = 0; i < newCapacity; i++) 
    {
        newArray[i] = (*dynamicArray)[i];
    }

    delete[] *dynamicArray;
    *dynamicArray = newArray;
}

Вы не первый новичок, который не понимает указателей. Внимательно посмотрите на приведенный выше код и сравните его с вашим кодом. Основное отличие состоит в том, что мой код использует указатель для изменения того, на что указывает . Ваш код попытался изменить сам указатель, что неверно. Это сбивает с толку, потому что на что указывает другой указатель (динамический массив).

0 голосов
/ 30 июня 2019

В вашем коде есть несколько проблем:

Во-первых, в ResizeDynamicArray вы выделяете массив из указателей для целых, а не для массива целых. int ** newArray = new int*[newCapacity] должно быть int *newArray = new int[newCapacity].

Во-вторых, как только вы это исправите, вам нужно написать *dynamicArray = newArray;; но вы должны освободить старый массив до того, как вы назначите указатель на новый блок памяти.

void ResizeDynamicArray (int **dynamicArray, int newCapacity)
{
    int *newArray = new int[newCapacity];
    for (int i = 0; i < newCapacity; i++) 
    {
        newArray[i] = (*dynamicArray)[i];
    }

    delete[] *dynamicArray;
    *dynamicArray = newArray;
}

В-третьих, поскольку вы InsertElement можете вызывать ResizeDynamicArray (который вернет вам новый блок памяти), вам необходимо изменить первоначально переданный указатель. Поэтому вам нужно передать указатель на указатель внутри функции, как вы это делали с ResizeDynamicArray:

void InsertElement (int **dynamicArray, int element, int &size, int capacity)

Адаптируйте тело соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...