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

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

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

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

04.12.2012, 02:08. Просмотров 6234. Ответов 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();
}
Пока находишься в теле функции - работает, выходишь - "не работает"... Натолкните на правильную мысль, пожалуйста.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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;; ..... Ну и в...

17
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 секунд
нужны будут объяснения - пиши
1
OdessaNA
19 / 19 / 0
Регистрация: 10.01.2011
Сообщений: 241
04.12.2012, 10:09  [ТС] #3
ps10n1ck, спасибо.

А если не использовать новый конструкций. Т.е. только чуть-чуть подправить мой код. Ведь так можно же?
0
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
04.12.2012, 10:28 #4
Цитата Сообщение от OdessaNA Посмотреть сообщение
А если не использовать новый конструкций. Т.е. только чуть-чуть подправить мой код. Ведь так можно же?
ar - локальная переменная функции, после выполнения которой, данная переменная будет уничтожена вместе со своим содержимым. Вам нужно либо передавать указатель по ссылке, либо возвращать указатель на новый массив из функции.
2
OdessaNA
19 / 19 / 0
Регистрация: 10.01.2011
Сообщений: 241
04.12.2012, 11:21  [ТС] #5
kazak, спасибо! Мои мысли возле "этого" и летали!
0
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();
}
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
06.12.2012, 18:45 #7
функция должна быть не void, а возвращать int*, а именно return NewArray. копировать в старый ar смысла нет.
0
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;
}
0
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;
но для данной задачи это не удачное решение (чревато утечками памяти), просто было приведено как пример
лучше использовать вариант, написанный выше
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
07.12.2012, 01:51 #10
зачем в 4й строчке int?
Ты определись, pNewArray это аргумент или локальная переменная?
0
ps10n1ck
54 / 48 / 2
Регистрация: 10.11.2010
Сообщений: 132
07.12.2012, 19:53 #11
это аргумент, просто скопировал со старого кода и забыл удалить int
0
Avazart
Эксперт С++
7213 / 5385 / 286
Регистрация: 10.12.2010
Сообщений: 23,808
Записей в блоге: 17
07.12.2012, 19:56 #12
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
функция должна быть не void, а возвращать int*, а именно return NewArray. копировать в старый ar смысла нет.
Ну собственно не копировать, а изменить указатель, да и так лучше нужно будет только один массив потом удалять...
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
07.12.2012, 20:32 #13
Цитата Сообщение от Avazart Посмотреть сообщение
Ну собственно не копировать, а изменить указатель
указатель изменять смысла нет. Значение указателя передаётся в функцию по значению. И в этом плане ничем не отличается от других аргументов функции, ты же знаешь, функция не может изменить оригиналы аргументов, переданные ей.
0
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;
}
или я неверно понял вышеописанное?
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 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 и смысла его изменять нет, 
//  т.к. в функцию передаётся копия.
/********************************/
/*...........и.т.д...........*/
}
0
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 =...


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

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

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