half-horse half-gateway
117 / 83 / 43
Регистрация: 10.05.2016
Сообщений: 562
1

Изменение динамического массива внутри функции

26.04.2020, 15:52. Показов 6656. Ответов 9

Author24 — интернет-сервис помощи студентам
Добрый день.

Имеется следующий код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void add(int* mas, int& size, int elem)
{
    int* old = mas;
    mas = new int[++size];
 
    for (int i = 0; i < size - 1; i++)
        mas[i] = old[i];
 
    mas[size - 1] = elem;
}
 
int main()
{
    int size = 1;
    int* mas = new int[1]; 
    mas[0] = 0;
 
    for (int i = 1; i <= 9; i++)
        add(mas, size, i);
 
    for (int i = 0; i < size; i++)
        cout << mas[i] << endl;
    
    return 0;
}
Проблема в том, что массив mas из функции main() после выполнения функции add(mas, size, elem) не изменяется. Да, можно объявить массив вне тела функций и обращаться как к глобальной переменной, но такой вариант мне не подходит. И, собственно, складывается вопрос, как изменить размер динамического массива примерно тем способом, которым я пытался, но так, чтобы это изменение зафиксировалось в переменной mas из функции main? Мне пока что на ум что-то ничего, кроме как сменить у функции add(mas, size, elem) тип с void на int* и возвращать измененный массив, не пришло, но мне кажется, что это не очень симпатично.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.04.2020, 15:52
Ответы с готовыми решениями:

создание динамического массива внутри функции
Люди, помогите пожалуйста. Нужно написать функцию, которая читает из файла числа (их количество...

Выделение памяти для динамического двумерного массива внутри функции
Имеется вот такой код : #include &lt;iostream&gt; void allocateMemory(int ***array, int size); void...

Инициализация двумерного динамического массива внутри программы
Здравствуйте! Подскажите, пожалуйста, можно ли как-то инициализировать двумерный динамический...

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

9
Заблокирован
26.04.2020, 16:10 2
Просто ты не понимаешь, как это работает. Поймёшь - будешь молодец.

Изменение динамического массива внутри функции
0
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
26.04.2020, 17:19 3
Лучший ответ Сообщение было отмечено BlackStoneBlack как решение

Решение

BlackStoneBlack, mass передайте по ссылке: void add(int *& mas, int& size, int elem)
с длиной size и последним элементом - беда. Нарисуйте на бумажке чтобы понять что ++size это size +=1 и условия цикла и номер последнего элемента тоже нужно представить. И delete [] old ; тоже уместно бы свершить.
1
half-horse half-gateway
117 / 83 / 43
Регистрация: 10.05.2016
Сообщений: 562
26.04.2020, 18:44  [ТС] 4
Цитата Сообщение от Verevkin Посмотреть сообщение
не понимаешь, как это работает
Может и не понимаю. Ответ твой не приблизил к ответу никак. Если ничего дельного сказать не можешь, то лучше просто промолчать.

Добавлено через 2 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
void add(int *& mas, int& size, int elem)
Да, помогло.
Цитата Сообщение от IGPIGP Посмотреть сообщение
delete [] old;
Да, это просто я ошибся немного, наспех писал.
Цитата Сообщение от IGPIGP Посмотреть сообщение
с длиной size и последним элементом - беда
Что конкретно не так? Там же цикл крутится до size - 1, то есть до предыдущего размера массива. Ну и номер последнего элемента массива будет size - 1.
0
Заблокирован
26.04.2020, 18:49 5
Цитата Сообщение от BlackStoneBlack Посмотреть сообщение
Может и не понимаю. Ответ твой не приблизил к ответу никак.
Я этого не ожидал. Мне очень жаль.
1
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
26.04.2020, 19:44 6
Цитата Сообщение от BlackStoneBlack Посмотреть сообщение
а, это просто я ошибся немного, наспех писал.
так вам не показывать ошибки? Нор вы же скромничаете. У вас ошибки с выделением и индесацией ещё. А вы
Цитата Сообщение от BlackStoneBlack Посмотреть сообщение
просто
упрямитесь.
Цитата Сообщение от BlackStoneBlack Посмотреть сообщение
Ну и номер последнего элемента массива будет size - 1.
BlackStoneBlack, если выделено size+1 то последний индекс - size.
Про передачу по ссылке поняли?
0
half-horse half-gateway
117 / 83 / 43
Регистрация: 10.05.2016
Сообщений: 562
27.04.2020, 11:20  [ТС] 7
Цитата Сообщение от IGPIGP Посмотреть сообщение
так вам не показывать ошибки?
Да я не против, чтобы носом ткнули. Я имел ввиду, что я просто ошибся с очищением old.
Цитата Сообщение от IGPIGP Посмотреть сообщение
если выделено size+1 то последний индекс - size
Дык он же икриминируется операцией ++size. То есть сам size увеличивается на единицу. Причем, учитывая, с какой стороны стоит оператор, то он сначала увеличивается сам, а уже потом только происходит дальнейшая операция. Если я неправ - пожалуйста, разжуйте подробнее.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Про передачу по ссылке поняли?
Да.

Не по теме:

Цитата Сообщение от Verevkin Посмотреть сообщение
Я этого не ожидал
Смысл отвечать в теме, если ты даже не планируешь помогать? Видимо, только ради того, чтобы попетушиться и почувствовать какое-то ложное чувство доминирования. В общем и целом - идиотизм.

0
Заблокирован
27.04.2020, 11:30 8
Цитата Сообщение от BlackStoneBlack Посмотреть сообщение
Смысл отвечать в теме, если ты даже не планируешь помогать?
Я прямо указал тебе на ошибку в твоём коде, даже не поленился картинку нарисовать. Чо ты возмущаешься, будто я с тебя за это денег требую? Не нравится - не бери. Не понял - я не виноват.

Не отвечай на этот коммент, отстань от меня.
1
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
27.04.2020, 14:13 9
Цитата Сообщение от BlackStoneBlack Посмотреть сообщение
Дык он же икриминируется операцией ++size. То есть сам size увеличивается на единицу. Причем, учитывая, с какой стороны стоит оператор, то он сначала увеличивается сам, а уже потом только происходит дальнейшая операция. Если я неправ - пожалуйста, разжуйте подробнее.
Да, тут приношу извинения, не подумал. Я не люблю сайдэффектных выражений при ответственных операциях вроде выделения памяти и не вдумался. Тут я не прав.

Добавлено через 9 минут
ps передавая size по ссылке и изменяя его подобным образом вы ломаете читабельность. Передавайте сразу на 1 больше если так.
0
half-horse half-gateway
117 / 83 / 43
Регистрация: 10.05.2016
Сообщений: 562
04.05.2020, 18:59  [ТС] 10

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
сайдэффектных выражений при ответственных операциях вроде выделения памяти
Если это есть и работает без каких-то неопределенностей, то смысла нет этого избегать. Чисто стиль кода. Я же не вижу смысла писать крупные конструкции, если всё можно оформить лаконично, ибо это тоже, как бы парадоксально не звучало, снижает читабельность кода.

Цитата Сообщение от IGPIGP Посмотреть сообщение
подобным образом вы ломаете читабельность
Субъективщина. Как по мне - вполне очевидно, что размер увеличится на единицу, учитывая название функции.



Добавлено через 10 минут

Не по теме:


Можно было бы, конечно, что-то подобное сделать:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
struct dynarr
{
public:
 
    int* list;
 
    size_t size;
 
    dynarr(size_t size)
    {
        this->size = size;
        this->list = new int[size];
    }
 
 
    ~dynarr()
    {
        if (this->list != nullptr)
            delete[] this->list;
    }
};
 
void add(dynarr& arr, int element)
{
    int* old = arr.list;
    arr.list = new int[++arr.size];
 
    for (int i = 0; i < arr.size - 1; i++)
        arr.list[i] = old[i];
 
    delete[] old; 
    arr.list[size - 1] = elem;
}
 
int main()
{
    dynarr arr(1); 
    arr.list[0] = 0;
 
    for (int i = 1; i <= 9; i++)
        add(arr, i);
 
    for (int i = 0; i < size; i++)
        cout << arr.list[i] << endl;
    
    return 0;
}
Так бы, наверное, было бы читабельнее, но смысл от этого?.. :D

0
04.05.2020, 18:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.05.2020, 18:59
Помогаю со студенческими работами здесь

Изменение динамического массива на статический
Помогите изменить динамический массив на статический #include &lt;iostream.h&gt; #include &lt;stdlib.h&gt;...

Изменение размера динамического массива
вводится числовой массив неизвестной длинны, каждое число заносится в динамический массив. using...

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

Изменение размера динамического массива (resize)
Учусь менять размер динамического массива. Помогите разобраться, пожалуйста. Допустим, есть...

Изменение размера динамического массива объектов класса
Всех приветствую! Нужно изменить размер динамического массива, в котором я храню созданные объекты....

Некорректное удаление динамического массива внутри объекта
Здравствуйте, встретился вот такой проблемой: скрин Краткое введение в курс дела, захотел...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru