Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Вопросы начинающих программистов
Перезагрузить страницу Создание функции динамических массивов в С++
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
ddo ddo вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.09.2004
По умолчанию Создание функции динамических массивов в С++ - 01.10.2004, 00:31

1) Никак не могу разобраться. Пытаюсь создать функцию, принимающую динамический массив (для простоты одномерный) и увеличивающую его длину на N новых элементов (для простоты N=1), т.е.:
Код:
int main() {
k=5;//например
int *mass=new int[k];//создается динамический массив:
for (int i=0;i<k;i++) // заполнение
mass[i]=i*2;

AddElement(mass,k);//вызов функции 
delete []mass;
return (0);
}

void AddElement (int *mass, int &k) {
/*здесь массив преобразуется таким образом:
k+=1;
int m=0;cin>>m;
mass[k]=m;
Написано коряво, но это для примера. Смысл в том, что к существующим элементам добавить новый, увеличивая длину массива в памяти*/
}
Это вообще возможно?

2) И вот еще. Это пересекается с 1 вопросом. Почему так происходит:
Код:
int *mass=new int[3];
for (int i=0;i<3;i++) 
mass[i]=i*2;

delete []mass;//!!!!!!

if (mass) {
cout<<"Still here"<<endl;
for (int i=0;i<3;i++) 
cout<<mass[i]<<endl;
}
При выполнении выдает: Stiil here, но вместо элементов мусор. Т.е. массив вроде удалился и доступа к элементам нет, но сам указатель есть и все еще указывает на место в памяти. Причем если попробовать пересоздать (int *mass=new int[3]), то выдает ошибку переопределения! Т.е. выходит не удален указатель на массив? Или как?

P.S. Основной вопрос 1. Со вторым просто интересно. В книгах не нашел ответ.
Ответить с цитированием
  (#2 (permalink)) Старый
Scorpion Scorpion вне форума
Member
 
Сообщений: 90
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.06.2003
По умолчанию Re: перераспределенние памяти динамического массива. - 01.10.2004, 03:46

Цитата:
Originally posted by ddo
[b]1)

void AddElement (int *mass, int &k) {
/*здесь массив преобразуется таким образом:
k+=1;
int m=0;cin>>m;
mass[k]=m;
Написано коряво, но это для примера. Смысл в том, что к существующим элементам добавить новый, увеличивая длину массива в памяти*/
}
Так нельзя. Можно, например, так:
Код:
void addElement(int *array, int &k)
{
    int *temp;
    temp = new int[k];
    for(int i = 0; i < k; i++)
    {
        temp[i] = array[i];
    }
    delete array;
    k++;
    array = new int  [k];
    for(i = 0; i < k - 1; i++)
    {
        array[i] = temp[i];
    }
    cin >>i;
    array[k] = i;
}
Ответить с цитированием
  (#3 (permalink)) Старый
ddo ddo вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 30.09.2004
По умолчанию 02.10.2004, 10:09

Да спасибо так работает, но приходиться делать возврат функции не void, а int* (если сам массив типа int). И вызывать mass=AddElement (mass,k). Т.е. она работает не с самим массивом а с копией. Отсюда вопрос: нельзя сделать чтоб функция работала напрямую с массивом в памяти?
Просто эта функция (AddElement) вызывается из другой, которая в свою очередь еще из одной (причем каждая из них по своему изменяет массив) и хотя все вроде работает, но мне всегда казалось, что работать лучше с паматью, чем со временными копиями.
Сам долго промучался, но так и не смог этого добиться. Там вроде как-то с приведением типов надо. Может кто-то уже делал просто и есть готовый вариант?
Tnx.
Ответить с цитированием
  (#4 (permalink)) Старый
kelz kelz вне форума
Member
 
Сообщений: 511
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 27.05.2004
По умолчанию 05.10.2004, 14:28

Попробуй так:
Код:
void AddElement(int** array,int& k)
{
    int i;
    int* temp = new int[++k];
    for (i=0;i<k-1;i++) temp[i] = (*array)[i];
    cin >> temp[i];
    delete *array;
    mass = &array;
}

AddElement(&mass,k);
А насчет второго вопроса могу сказать следующее, так и должно быть, память освобождается, но значение указателя не устанавливается в NULL, а int *mass=new int[3] и будет выдавать ошибку, ты второй раз определяешь переменную mass, поставь mass = new int[3] и ошибка пропадет
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание массивов большой размерности Kidu Visual C++ 13 16.01.2009 18:20
Создание и удаление динамически созданых массивов GrOb С/С++ 1 01.12.2008 01:09
Создание двух динамических массивов qqeeaaddzzcc С/С++ 6 23.05.2008 17:27
Передача массивов в аргументе функции eugira C++ Builder 7 07.07.2007 01:04
Создание списка с помощью массивов в C++ blur Вопросы начинающих программистов 3 06.05.2006 19:36
TFileStream создание двух динамических массивов Ал-леша C++ Builder 3 01.06.2005 10:38
Вывод динамических массивов imported_Elka Вопросы начинающих программистов 2 04.04.2005 14:48
CLASS & ARRAYS создание нескольких массивов с заполнением данных Wish Visual C++ 10 13.12.2004 13:34
Создание массивов в С++ Builder Olegg C++ Builder 1 24.06.2004 17:36
Функции оптимального, переопределения массивов, с сохранение данных в VC++ Rem Visual C++ 1 20.01.2004 15:20
Проектирование динамических массивов в С++ Anonymous Вопросы начинающих программистов 1 08.09.2003 23:30
Создание алгоритма различных массивов Форсаж Алгоритмы 3 03.08.2003 00:02



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов