Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/169: Рейтинг темы: голосов - 169, средняя оценка - 4.91
 Аватар для OdessaNA
19 / 19 / 6
Регистрация: 10.01.2011
Сообщений: 241

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

04.12.2012, 02:08. Показов 34628. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.12.2012, 02:08
Ответы с готовыми решениями:

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

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

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

17
 Аватар для ps10n1ck
56 / 50 / 11
Регистрация: 10.11.2010
Сообщений: 132
04.12.2012, 02:32
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 / 6
Регистрация: 10.01.2011
Сообщений: 241
04.12.2012, 10:09  [ТС]
ps10n1ck, спасибо.

А если не использовать новый конструкций. Т.е. только чуть-чуть подправить мой код. Ведь так можно же?
0
 Аватар для kazak
3599 / 2741 / 354
Регистрация: 11.03.2009
Сообщений: 6,298
04.12.2012, 10:28
Цитата Сообщение от OdessaNA Посмотреть сообщение
А если не использовать новый конструкций. Т.е. только чуть-чуть подправить мой код. Ведь так можно же?
ar - локальная переменная функции, после выполнения которой, данная переменная будет уничтожена вместе со своим содержимым. Вам нужно либо передавать указатель по ссылке, либо возвращать указатель на новый массив из функции.
2
 Аватар для OdessaNA
19 / 19 / 6
Регистрация: 10.01.2011
Сообщений: 241
04.12.2012, 11:21  [ТС]
kazak, спасибо! Мои мысли возле "этого" и летали!
0
 Аватар для OdessaNA
19 / 19 / 6
Регистрация: 10.01.2011
Сообщений: 241
06.12.2012, 18:10  [ТС]
Итак, вот:
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
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
06.12.2012, 18:45
функция должна быть не void, а возвращать int*, а именно return NewArray. копировать в старый ar смысла нет.
0
 Аватар для OdessaNA
19 / 19 / 6
Регистрация: 10.01.2011
Сообщений: 241
06.12.2012, 20:08  [ТС]
Цитата Сообщение от 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
56 / 50 / 11
Регистрация: 10.11.2010
Сообщений: 132
07.12.2012, 01:40
функцию можно сделать так, что она будет возвращать и 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
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
07.12.2012, 01:51
зачем в 4й строчке int?
Ты определись, pNewArray это аргумент или локальная переменная?
0
 Аватар для ps10n1ck
56 / 50 / 11
Регистрация: 10.11.2010
Сообщений: 132
07.12.2012, 19:53
это аргумент, просто скопировал со старого кода и забыл удалить int
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.12.2012, 19:56
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
функция должна быть не void, а возвращать int*, а именно return NewArray. копировать в старый ar смысла нет.
Ну собственно не копировать, а изменить указатель, да и так лучше нужно будет только один массив потом удалять...
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
07.12.2012, 20:32
Цитата Сообщение от Avazart Посмотреть сообщение
Ну собственно не копировать, а изменить указатель
указатель изменять смысла нет. Значение указателя передаётся в функцию по значению. И в этом плане ничем не отличается от других аргументов функции, ты же знаешь, функция не может изменить оригиналы аргументов, переданные ей.
0
 Аватар для ps10n1ck
56 / 50 / 11
Регистрация: 10.11.2010
Сообщений: 132
08.12.2012, 00:13
Цитата Сообщение от 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
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
08.12.2012, 00:30
Я скорее об этом
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
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
08.12.2012, 00:46
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;
}
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.12.2012, 00:48
Собственно да не обратил внимание на реализацию автора...
0
fil1190
10.05.2014, 16:28
доброго времени суток всем!
Ребят вопрос похожий, только у меня двумерный динамический массив.
Функция возвращает мусор. Не могу понять почему не работает
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;
}
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.05.2014, 16:28
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru