С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 31.08.2016
Сообщений: 38
1

Не меняет адресс массива после завершения функции

17.10.2016, 20:21. Показов 870. Ответов 3
Метки нет (Все метки)

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
26
27
28
29
30
31
void elmAdd(int * arr, int & a)
{
    int elm, flag = 1;
    while (flag)
    {
        std::cout << "\nVVedite unikalnij element, kotorij nujno dobavit k massivu : ";
        std::cin >> elm;
        for (int i = 0; i < a; i++)
        {
            if (elm == *(arr + i))
            {
                std::cout << "\nChislo ne unikalno ";
                flag = 1;
                break;
            }
            flag = 0;
        }
    }
    a+=1;
    int *pBuff = new int[a];
    for (int i = 0; i < (a - 1); i++)
    {
    pBuff[i]= arr[i];
    }
    delete[]arr;
    arr = pBuff;
    arr[a-1] = elm;
    for (int i = 0; i < a; i++)
    std::cout << arr[i];
    return ;
}
Добавлено через 17 минут
такой вот вариант меня не очень устраивает, потому что хочется не приравнивать адрес исходного массива к этой ф-ции
а просто писать ф-цию с входными параметрами МАССИВ и РАЗМЕР МАССИВА и получать В итоге новый массив по этому адресу. Ниже листинг очевидного варианта, но который не устраивает.
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
int* f(int * arr, int & a)
{
    int elm, flag = 1;
    while (flag)
    {
        std::cout << "\nVVedite unikalnij element, kotorij nujno dobavit k massivu : ";
        std::cin >> elm;
        for (int i = 0; i < a; i++)
        {
            if (elm == *(arr + i))
            {
                std::cout << "\nChislo ne unikalno ";
                flag = 1;
                break;
            }
            flag = 0;
        }
    }
    a+=1;
    int *pBuff = new int[a];
    for (int i = 0; i < (a - 1); i++)
    {
    pBuff[i]= arr[i];
    }
    delete[]arr;
    arr = pBuff;
    arr[a-1] = elm;
    for (int i = 0; i < a; i++)
    std::cout << arr[i];
    return arr;
}
 
//
 
...
myarray=f(myarray,n);
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.10.2016, 20:21
Ответы с готовыми решениями:

Глобальная переменная после вызова функции меняет значение
До flag = 0; odnorod_pril(buffer1); После int odnorod_pril(char *buffer) { flag точно равен...

После выполнения (завершения) функции test переменная умрет, а что будет с переменной в Result?
class abc { public: int argc; char **argv; char **azColName; }; std::list&lt;abc&gt;...

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

Запуск функции после завершения предыдущей
Подскажите, как можно реализовать в таком алгоритме запуск функции после завершения предыдущей?...

3
Комп_Оратор)
Эксперт по математике/физике
9005 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
17.10.2016, 21:40 2
o4enslabijcoder, вот это
Цитата Сообщение от o4enslabijcoder Посмотреть сообщение
получать В итоге новый массив по этому адресу.
невозможно в общем случае. Например, если новый массив больше старого, то OS просто не сможет его воткнуть на место старого, когда за ним уже занят хоть один машинный байт. То есть, сам вопрос неверен. А вот по переданному указателю можно создать новый массив. Тогда переменная будет "старая" (из области вызова), а адрес в ней - новый. Тот что new даст. Только передать нужно по указателю f(int ** arr, int & n) или ссылке f(int *& arr, int & n) иначе будет как сейчас. Функция получит копию, что-то под этот указатель выделит, и оно потеряется после возврата из функции.
Вообще, выделять в одной области, а освобождать в другой это не хорошо. Если это только не метод класса, где всё учтено могучим ураганом деструктором, например.
1
0 / 0 / 0
Регистрация: 31.08.2016
Сообщений: 38
17.10.2016, 22:12  [ТС] 3
ну я не правильно описал)) и имелось ввиду что мы просто указатель на новый адрес перекидываем а старый удаляем)))
сейчас попробую через двойные конструкции
0
Диссидент
Эксперт C
27707 / 17325 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
17.10.2016, 23:09 4
Цитата Сообщение от o4enslabijcoder Посмотреть сообщение
через двойные конструкции
Не знаю, что ты имеешь в виду, но возможно, ты на правильном пути. Если ты в функции собираешься менять указатель, то передавать надо Указатель на Указатель.
1
17.10.2016, 23:09
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.10.2016, 23:09
Помогаю со студенческими работами здесь

Запуск функции после завершения предыдущей
Знаю что такие темы уже были и гугл не помог ( Есть две функции посимвольного вывода текста ...

Запуск jQuery Функции повторно после ее завершения
Есть функция Online() Которая в себе содержит Ajax запрос на сервер. И запускает себя повторно,...

Не закрывать(уничтожать) объект после завершения функции
Использую GUIDE и пишу функцию обработчик. При этом созданные мною переменные не видны в...

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Администрирован­­­ие Git, продвинутые техники работы с Git
InfoMaster 11.01.2025
Основы управления репозиторием Эффективное управление Git-репозиторием требует глубокого понимания механизмов контроля доступа и инструментов администрирования. Рассмотрим ключевые аспекты. . .
Что такое HCL Notes и как с ним работать
InfoMaster 10.01.2025
HCL Notes (ранее известный как IBM Notes и Lotus Notes) представляет собой комплексную платформу для совместной работы и обмена информацией в корпоративной среде. Это многофункциональное решение,. . .
Как работать с Git из Windows и Visual Studio
InfoMaster 10.01.2025
Работа с Git в Windows Работа с Git в операционной системе Windows может быть осуществлена с помощью различных инструментов, каждый из которых обладает своими уникальными возможностями и. . .
Аналог оператора switch case в Python
InfoMaster 10.01.2025
Оператор switch case используется в программировании для выбора одного из нескольких вариантов исполнения кода. Однако в языке Python этот оператор отсутствует. Понимание аналогов switch case в. . .
Отличия абстрактного класса от интерфейса
InfoMaster 10.01.2025
В современной разработке программного обеспечения существуют два основных механизма реализации абстракции: абстрактные классы и интерфейсы. Эти инструменты, хотя и схожи в своей основной цели -. . .
Как работать в Git
InfoMaster 10.01.2025
Git — это одна из наиболее популярных систем контроля версий, которая активно используется разработчиками по всему миру. Она позволяет эффективно управлять изменениями в коде, координировать работу. . .
Реализация передвижения персонажа в Unity3d на C#
InfoMaster 10.01.2025
Реализация передвижения персонажа в Unity3D начинается с правильной настройки проекта. Этот этап критически важен для создания отзывчивого и плавного управления. Рассмотрим основные шаги для создания. . .
Docker: руководство для начинающих
InfoMaster 10.01.2025
В современном мире разработки программного обеспечения контейнеризация стала неотъемлемой частью процесса создания и развертывания приложений. Docker, как ведущая платформа контейнеризации, произвела. . .
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru