Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.66
OdessaNA
19 / 19 / 0
Регистрация: 10.01.2011
Сообщений: 241
#1

Функция изменения размера динамического массива - C++

04.12.2012, 02:08. Просмотров 6077. Ответов 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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <conio.h>
using namespace std;
 
void Func(int *ar, const int Size, const int NewSize)
{
    int *NewArray = new int [NewSize];
 
    for (int i = 0; i < NewSize; i++)
    {
        if(i >= Size ) 
            NewArray[i] = 5;
        else
            NewArray [i] = ar[i];   
    }
 
    delete [] ar;   
 
    ar = new int [NewSize];
 
    for (int i = 0; i < NewSize; i++)
    {
        ar[i] = NewArray[i];
    }   
 
    delete [] NewArray;
 
    /*for (int i = 0; i < NewSize; i++)
    {
        cout << ar[i] << ' ';
    }*/ 
}
 
void main()
{
    int Size = 3;
    int *array = new int [Size];
 
    for (int i = 0; i < Size; i++)
    {
        array[i] = 1;
    }
 
    int NewSize = 6;
 
    Func(array, Size, NewSize);
 
    cout << endl;
 
    for (int i = 0; i < NewSize; i++)
    {
        cout << array[i] << ' ';
    }
 
    delete [] array;
    
    _getch();
}
Пока находишься в теле функции - работает, выходишь - "не работает"... Натолкните на правильную мысль, пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.12.2012, 02:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция изменения размера динамического массива (C++):

Подскажите простую реализацию динамического массива и его использование с возможностью изменения его размера - C++
Подскажите простую реализацию динамического масива и его использование с возможностью изменения его размера........спасибо))) ...

Изменения размерности динамического массива - C++
недавно задался вопросом, а можно как-то изменить размерность динамического массива ну например есть такой массив int n; n=5; int...

Увелечение размера динамического массива - C++
Добрый день! Итак, допустим есть массив: char *str = new char; Задача следующая: увеличить размер массива на 1 (то есть до 5...

Изменение размера динамического массива - C++
вводится числовой массив неизвестной длинны, каждое число заносится в динамический массив. using namespace std; int main() { ...

Определение размера динамического массива - C++
Вопрос может не много глупый, но я подзабыл с. Считаю размер динамического массива и результат получается неверный, логическую ошибку...

Измерение размера динамического массива - C++
Как можно изменять размер динамического массива? К примеру, сначала у меня: &lt;имя_класса&gt; *mas=new &lt;имя_класса&gt;; ..... Ну и в...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ps10n1ck
54 / 48 / 2
Регистрация: 10.11.2010
Сообщений: 132
04.12.2012, 02:32 #2
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
#include <iostream>
 
using std::cout;
using std::endl;
 
typedef unsigned int uint;
int* resize(int *pArray, uint OldSize, uint NewSize){
    if(OldSize > NewSize)
        return pArray;
    int *pNewArray = new int[NewSize];
    memcpy(pNewArray, pArray, sizeof(int) * OldSize);
    delete [] pArray;
    return pNewArray;
}
 
int main(){
 
    const uint Size = 5;
    const uint newSize = 7;
    int *pArr = new int[Size];
    for(uint i = 0; i < Size; ++i)
        pArr[i] = i;
    for(uint i = 0; i < Size; ++i)
        cout << pArr[i] << endl;
 
    cout << endl;
    
    pArr = resize(pArr, Size, newSize);
    for(uint i = Size; i < newSize; ++i)
        pArr[i] = i+100;
    for(uint i = 0; i < newSize; ++i)
        cout << pArr[i] << endl;
 
    delete [] pArr;
return 0;
}
Добавлено через 48 секунд
нужны будут объяснения - пиши
OdessaNA
19 / 19 / 0
Регистрация: 10.01.2011
Сообщений: 241
04.12.2012, 10:09  [ТС] #3
ps10n1ck, спасибо.

А если не использовать новый конструкций. Т.е. только чуть-чуть подправить мой код. Ведь так можно же?
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
04.12.2012, 10:28 #4
Цитата Сообщение от OdessaNA Посмотреть сообщение
А если не использовать новый конструкций. Т.е. только чуть-чуть подправить мой код. Ведь так можно же?
ar - локальная переменная функции, после выполнения которой, данная переменная будет уничтожена вместе со своим содержимым. Вам нужно либо передавать указатель по ссылке, либо возвращать указатель на новый массив из функции.
OdessaNA
19 / 19 / 0
Регистрация: 10.01.2011
Сообщений: 241
04.12.2012, 11:21  [ТС] #5
kazak, спасибо! Мои мысли возле "этого" и летали!
OdessaNA
19 / 19 / 0
Регистрация: 10.01.2011
Сообщений: 241
06.12.2012, 18:10  [ТС] #6
Итак, вот:
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
48
49
50
#include <iostream>
#include <conio.h>
using namespace std;
 
int* Func(const int Size, const int NewSize, int *ar)
{
    int *New = new int [NewSize];
 
    for (int i = 0; i < NewSize; i++)
    {
        if(i < Size)
            New[i] = ar[i];
        else
            New[i] = 1;
    }
 
    delete [] ar;
    ar = new int[NewSize];
 
    ar = New;   
 
    return ar;
}
 
void main()
{
    int Size = 3;
    int *array = new int[Size];
 
    for (int i = 0; i < Size; i++)
    {
        array[i] = 0;
        cout << array[i] << ' ';
    }
 
    int NewSize = 7; 
 
    array = Func(Size, NewSize, array);
 
    cout << endl;
 
    for (int i = 0; i < NewSize; i++)
    {
        cout << array[i] << ' ';
    }
 
    delete array;
 
    _getch();
}
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
06.12.2012, 18:45 #7
функция должна быть не void, а возвращать int*, а именно return NewArray. копировать в старый ar смысла нет.
OdessaNA
19 / 19 / 0
Регистрация: 10.01.2011
Сообщений: 241
06.12.2012, 20:08  [ТС] #8
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
функция должна быть не void, а возвращать int*,
- этот момент не совсем понятен...
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
копировать в старый ar смысла нет.
- а с этим полностью согласен:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int* Func(const int Size, const int NewSize, int *ar)
{
    int *New = new int [NewSize];
 
    for (int i = 0; i < NewSize; i++)
    {
        if(i < Size)
            New[i] = ar[i];
        else
            New[i] = 1;
    }
 
    delete [] ar;
    ar = new int[NewSize];
 
    return New;
}
ps10n1ck
54 / 48 / 2
Регистрация: 10.11.2010
Сообщений: 132
07.12.2012, 01:40 #9
функцию можно сделать так, что она будет возвращать и bool, если указатель на массив возвращать в передаваемый параметр:
к примеру:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool resize(int *pArray, uint OldSize, int*pNewArray, uint NewSize){
    if(OldSize > NewSize)
        return false;
    int *pNewArray = new int[NewSize];
    memcpy(pNewArray, pArray, sizeof(int) * OldSize);
return true;
}
 
где-то в main
int *pNewArray = 0;
int *pOldArray = new int[100];
if(resize(pOldArray, 100, pNewArray, 200))
std::cout << "размер массива изменен" << endl;
delete [] pOldArray;
delete [] pNewArray;
но для данной задачи это не удачное решение (чревато утечками памяти), просто было приведено как пример
лучше использовать вариант, написанный выше
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
07.12.2012, 01:51 #10
зачем в 4й строчке int?
Ты определись, pNewArray это аргумент или локальная переменная?
ps10n1ck
54 / 48 / 2
Регистрация: 10.11.2010
Сообщений: 132
07.12.2012, 19:53 #11
это аргумент, просто скопировал со старого кода и забыл удалить int
Avazart
Эксперт С++
7152 / 5329 / 278
Регистрация: 10.12.2010
Сообщений: 23,584
Записей в блоге: 17
07.12.2012, 19:56 #12
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
функция должна быть не void, а возвращать int*, а именно return NewArray. копировать в старый ar смысла нет.
Ну собственно не копировать, а изменить указатель, да и так лучше нужно будет только один массив потом удалять...
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
07.12.2012, 20:32 #13
Цитата Сообщение от Avazart Посмотреть сообщение
Ну собственно не копировать, а изменить указатель
указатель изменять смысла нет. Значение указателя передаётся в функцию по значению. И в этом плане ничем не отличается от других аргументов функции, ты же знаешь, функция не может изменить оригиналы аргументов, переданные ей.
ps10n1ck
54 / 48 / 2
Регистрация: 10.11.2010
Сообщений: 132
08.12.2012, 00:13 #14
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ты же знаешь, функция не может изменить оригиналы аргументов, переданные ей.
C++
1
2
3
4
5
6
7
8
9
10
void ChangeData(int *data){
    *(data+2) = 77;
}
 
int main(){
    int Data[3] = {1, 3, 5};
    cout << Data[2] << endl;
    ChangeData(Data);
    cout << Data[2] << endl;
}
или я неверно понял вышеописанное?
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
08.12.2012, 00:30 #15
Я скорее об этом
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
void ChangeData(int* data){
Data=NULL;
}
int main(){
    int Data[]={1, 3, 5};
    printf("%p ", Data);
    ChangeData(Data);//не может изменить Data
  // АРГУМЕНТОМ ФУНКЦИИ ЯВЛЯЕТСЯ data, А НЕ *data И НЕ data[0] И НЕ data[1] И НЕ data[2]
    printf("%p ", Data);//Data не равен 0
    return 0;
}
Добавлено через 5 минут
А вот пример автора
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void Func(int *ar, const int Size, const int NewSize)
{
    int *NewArray; = new int [NewSize];
 
 
    for (int i = 0; i < NewSize; i++)
    {
        if(i >= Size ) 
            NewArray[i] = 5;
        else
            NewArray [i] = ar[i];   
    }
 
    delete [] ar;   
 
    ar = new int [NewSize];// ar без звезды это такой же аргумент функции,
//переданный по значению, как и size и смысла его изменять нет, 
//  т.к. в функцию передаётся копия.
/********************************/
/*...........и.т.д...........*/
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.12.2012, 00:30
Привет! Вот еще темы с ответами:

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

Динамическое увеличение размера динамического массива - C++
Никак не могу понять как это исправить.. Помогите, пожалуйста, разобраться в чём дело: struct myPoint ...

Определение размера динамического массива строк - C++
Здравствуйте, столкнулся с проблемой предопределения размера массива строк. Проблема в том, что я не знаю, какой размер мне выделить при...

Изменение размера динамического массива объектов класса - C++
Всех приветствую! Нужно изменить размер динамического массива, в котором я храню созданные объекты. Делаю это так: Car *spis_temp =...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.12.2012, 00:30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru