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

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

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

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

04.12.2012, 02:08. Просмотров 5977. Ответов 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++ Определение размера динамического массива
C++ Изменение размера динамического массива
C++ Измерение размера динамического массива
Увелечение размера динамического массива C++
Динамическое увеличение размера динамического массива C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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,401
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
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 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
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 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
Эксперт С++
7115 / 5292 / 273
Регистрация: 10.12.2010
Сообщений: 23,386
Записей в блоге: 17
07.12.2012, 19:56     Функция изменения размера динамического массива #12
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
функция должна быть не void, а возвращать int*, а именно return NewArray. копировать в старый ar смысла нет.
Ну собственно не копировать, а изменить указатель, да и так лучше нужно будет только один массив потом удалять...
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 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
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 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 и смысла его изменять нет, 
//  т.к. в функцию передаётся копия.
/********************************/
/*...........и.т.д...........*/
}
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
08.12.2012, 00:46     Функция изменения размера динамического массива #16
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void foo( int **ptr ) {
   if ( *ptr == 0 )
      *ptr = new int( 123 );
}
 
int main() {
   int *ptr = 0;
   
   foo( &ptr );
   
   std::cout << *ptr << std::endl;
   
   return 0;
}
или
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void foo( int *&ptr ) {
   if ( ptr == 0 )
      ptr = new int( 123 );
}
 
int main() {
   int *ptr = 0;
   
   foo( ptr );
   
   std::cout << *ptr << std::endl;
   
   return 0;
}
Avazart
Эксперт С++
7115 / 5292 / 273
Регистрация: 10.12.2010
Сообщений: 23,386
Записей в блоге: 17
08.12.2012, 00:48     Функция изменения размера динамического массива #17
Собственно да не обратил внимание на реализацию автора...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2014, 16:28     Функция изменения размера динамического массива
Еще ссылки по теме:
C++ Изменение размера динамического массива (resize)
Определение размера динамического массива строк C++
Изменение размера динамического массива объектов класса C++
C++ Double free or corruption при изменении размера динамического массива
C++ Написать программу изменения порядка следования элементов динамического массива в обратном порядке

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

Или воспользуйтесь поиском по форуму:
fil1190
Сообщений: n/a
10.05.2014, 16:28     Функция изменения размера динамического массива #18
доброго времени суток всем!
Ребят вопрос похожий, только у меня двумерный динамический массив.
Функция возвращает мусор. Не могу понять почему не работает
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <vector>
#include <iostream>
using namespace std;
 
        int** matrixNew (int M, int N,  int **matrix)
{
    int mNew=0;
    mNew = M + 10;
    
    // создание
    int** newMatrix;
 
    newMatrix = new int*[mNew]; 
 
    for ( int i = 0; i < mNew; i++) 
    {
        newMatrix[i] = new int[N];
    }
 
 for (int i = 0; i < mNew; i++)
    { 
        for (int n=0; i < n; n++)
        {
                if(i < M)
                    newMatrix[i][n] = matrix[i][n];
                else
                    newMatrix[i][n] = 0;
        }
    }
 for (int i=0;i<M; i++)
 {
    delete [] matrix[i];
 }
        M=mNew;
        matrix = new int*[M];
           for ( int i = 0; i < mNew; i++) 
    {
        matrix[i] = new int[N];
    }
 
    
 
 printf ("HELLO");
 
 
 
    /* for (int i = 0; i < M; i++)
    { 
        for (int n=0; i < N; n++)
        {
                
            matrix[i][n] = newMatrix[i][n];
                
        }
    }*/
    
    return newMatrix;
 }
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    
    int M = 3, N = 5; // размеры
 
    int i=0, j, s=0; 
 
 
 
 
    // создание
        int** matrix;
 
      matrix = new int*[M]; 
 
    for ( i = 0; i < M; i++) 
    {
        matrix[i] = new int[N];
    }
    
    i=0;
 
    // ввод 
do
{
        if (i == M)
        {
            matrix = matrixNew( M, N, matrix);
        }
        for ( j = 0; j < N; j++) 
        { 
            cout << "Inter element " << "[" << i << "][" << j << "]  "; 
            cin >> matrix[i][j]; 
             if (matrix[i][j]==0) 
                    {
                        s++;
                    }
        }   
 
 
 i++;
 
} while(s<1);
 
        
 
        std::cout << std::endl; // вывод
        for ( i = 0; i < M; i++) 
        {
            for (  j = 0; j < N; j++) 
            { 
                cout <<  matrix[i][j];  
              
            } 
            printf("\n");
        }
 
 
 cout<< "END";
     cin>>s;
// Удаление
     for (int i=0; i<M; i++)
     {
        delete [] matrix[i];
     }
    return 0;
}
Программирую недавно, потому прошу строго не судить

Добавлено через 2 часа 13 минут
Спасибо всем кто мне не ответил. Проблему решил сам
Может кому-то пригодится код
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include "stdafx.h"
#include <iostream>
#include "matrixNew.h"
 
 
using namespace std;
// функция увелечения размера двумерного динамического массива 
int** matrixNew (int M, int N,  int **matrix)
{
 
    printf("\n");
       
    // создание нового массива для копирования
    int** newMatrix;
 
    newMatrix = new int*[M]; 
 
    for ( int i = 0; i < M; i++) 
    {
        newMatrix[i] = new int[N];
    }
    
 
// копирование элементов старого массива в новый
    // и приравнивание оставшейся части нового массива 0
for (int i = 0; i < M; i++)
    { 
        for (int n=0; n < N; n++)
        {
            if (i<(M-10)) {
                    newMatrix[i][n] = matrix[i][n];
            }
            else {
                newMatrix[i][n]=0;
            }
            
        }
    }
 
// удаление старого массива
 for (int i=0;i<(M-10); i++)
 {
    delete [] matrix[i];
 }
        
// создание старого массива с новой размерностью            
        matrix = new int*[M];
 
        for ( int i = 0; i < M; i++) 
    {
        matrix[i] = new int[N];
    }
        
// вывод нового массива
        for (int i = 0; i < M; i++) 
        {
            for (int  j = 0; j < N; j++) 
            { 
                cout <<  newMatrix[i][j];  
              
            } 
            printf("\n");
        }
    
        // возвращение значения нового массива
    return newMatrix;
 }
 
int _tmain(int argc, _TCHAR* argv[])
{
    
    int M = 3, N = 5; // размеры матрицы
 
    int i=0, j, s=0; 
 
    // создание матрицы
        
    int** matrix 
    matrix = new int*[M]; 
 
    for ( int i = 0; i < M; i++) 
    {
        matrix[i] = new int[N];
    }
    i=0;
 
    // ввод 
do
{
        if (i == M)
        {
            M+=10;
            matrix = matrixNew( M, N, matrix);
        }
        for ( j = 0; j < N; j++) 
        { 
            cout << "Inter element " << "[" << i << "][" << j << "]  "; 
            cin >> matrix[i][j]; 
             if (matrix[i][j]<0) 
                    {
                        s++;
                        break;
                    }
        }   
 
 
 i++;
 
} while(s<1);
 
        
 
        std::cout << std::endl; // вывод
        for ( i = 0; i < M; i++) 
        {
            for (  j = 0; j < N; j++) 
            { 
                cout <<  matrix[i][j];  
              
            } 
            printf("\n");
        }
 
 
 cout<< "END";
     cin>>s;
// Удаление массива
     for (int i=0; i<M; i++)
     {
        delete [] matrix[i];
     }
    return 0;
}
Yandex
Объявления
10.05.2014, 16:28     Функция изменения размера динамического массива
Ответ Создать тему
Опции темы

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