c увеличить динамический массив

Это моя первая проблема, о которой нужно спросить, пожалуйста, внимательно изучите меня, если это необходимо ��

Я пытаюсь решить проблему для класса C ++ в школе. Я столкнулся с ошибкой, которую действительно не могу понять. Я делаю шаги в программировании.

В задании говорится:

используемый механизм наследования,

база данных, содержащая студентов, использующих динамическое распределение памяти,

способ расширения базы данных без использования расширенных структур данных,

операторы перегрузки потока для объектов созданного класса.

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

Пожалуйста, укажите мне в правильном направлении.

Программа компилируется и запускается, новый массив, кажется, содержит первые два элемента старого массива, и к моменту, когда он достигает первого нового элемента, программа вылетает (ячейка памяти, кажется, троллит меня и держит улыбающееся лицо) ,

Первые два Student объекты копируются, третий элемент вызывает ошибку:

Содержание

  1. Решение
  2. Другие решения
  3. The Codeby
  4. 1 ответ 1

Решение

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

Если не указано иное, все параметры, передаваемые в функцию, являются значениями. Хотя первый параметр является указателем, он позволяет изменять только ту память, на которую он указывает, а не сам указатель.

Вам нужно изменить объявление первого параметра на Student ** с кодом, измененным в методе для обработки двойной разыменования, или измените его на Student*& ,
Я подозреваю, что вам повезло, что это сработало на целое число.

Другие решения

Вы передаете указатель на список студентов к вашему resizeArr рутина, т.е. void resizeArr(Student* oldList, int oldSize, int newSize) , но не указатель на указатель.
Следовательно, присвоение нового / другого блока памяти указателю в resizeArr позволит переменной в resizeArr указывать на новый адрес, но указатель, который был передан resizeArr (т.е. list1 ) не изменилось.

Я бы предложил изменить логику на Student* resizeArr(Student* oldList, int oldSize, int newSize) и называть это как list1 = resizeArr(list1, initSize, plusSize);

Это аналогично подписи void* realloc (void* ptr, size_t size); ,

The Codeby

ООО Кодебай

Создание динамического массива в языке c#

На днях мне попалась задача, для решения которой требовалось создать динамический массив. Обычно я привык вместо массивов использовать обобщенные списки List , которые по умолчанию являются динамическими. Но, по условию задачи требовалось работать именно с массивом, который не является таковым, поэтому возникла небольшая проблема, решение которой описано в этой статье.

В языке c# под словом массив подразумевается объект с заранее заданным неизменяемым размером. То есть, к примеру, если Вы создали массив, который содержит пять элементов, то увеличить данный размер динамически Вы уже не сможете, так как он является фиксированным. В этом можно легко убедиться, воспользовавшись свойством IsFixedSize.

С помощью данного свойства Вы можете определить, имеет ли созданный массив фиксированную длину. Если результатом является значение true, как в данном примере, то это значит, что мы не можем добавлять или удалять элементы в уже созданном массиве, то есть изменять его текущий размер. Но, при этом мы можем изменять его существующие элементы.

Так как задача довольно актуальная, то какой-то способ решения всё-таки должен быть. И он есть. Если Вам необходимо создать динамический массив, то Вы можете воспользоваться, например методом Resize класса System.Array.

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

Либо мы можем схитрить и всё-таки решить данную задачу, воспользовавшись обобщенным списком List класса System.Collections.Generic, например:

Вместо массива мы используем список, который, как уже говорилось ранее, по умолчанию является динамическим. С помощью него мы выполняем всю необходимую работу и как только добиваемся нужного результата, то с помощью метода ToArray преобразуем список в массив.

Динамический массив интов можно увеличить в размерах нехитрым способом:

Помогите написать аналогичную функцию для массива с-строк, заданного следующим образом:

1 ответ 1

Да, в общем-то, все то же самое:

  • Создаете новый массив new char*[sz*2];
  • В него копируете указатели на с-строки из старого массива;
  • Убиваете старый массив;
  • Возвращаете указатель на новый массив.

Только имейте в виду: что в примере с int, что со строками, новые элементы (те, что не скопированы) остаются неинициализированными (мусор). По-хорошему их надо инициализировать.

Источник: computermaker.info

Понравилась статья? Поделиться с друзьями:
Ок! Компьютер
Добавить комментарий