19 / 19 / 6
Регистрация: 10.01.2011
Сообщений: 241
1

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

04.12.2012, 02:08. Показов 33158. Ответов 17

Author24 — интернет-сервис помощи студентам
Здравия желаю, Друзья.
Застрял вот на чем:
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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.12.2012, 02:08
Ответы с готовыми решениями:

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

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

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

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

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

А если не использовать новый конструкций. Т.е. только чуть-чуть подправить мой код. Ведь так можно же?
0
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
04.12.2012, 10:28 4
Цитата Сообщение от OdessaNA Посмотреть сообщение
А если не использовать новый конструкций. Т.е. только чуть-чуть подправить мой код. Ведь так можно же?
ar - локальная переменная функции, после выполнения которой, данная переменная будет уничтожена вместе со своим содержимым. Вам нужно либо передавать указатель по ссылке, либо возвращать указатель на новый массив из функции.
2
19 / 19 / 6
Регистрация: 10.01.2011
Сообщений: 241
04.12.2012, 11:21  [ТС] 5
kazak, спасибо! Мои мысли возле "этого" и летали!
0
19 / 19 / 6
Регистрация: 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
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,485
Записей в блоге: 1
06.12.2012, 18:45 7
функция должна быть не void, а возвращать int*, а именно return NewArray. копировать в старый ar смысла нет.
0
19 / 19 / 6
Регистрация: 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
56 / 50 / 11
Регистрация: 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
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,485
Записей в блоге: 1
07.12.2012, 01:51 10
зачем в 4й строчке int?
Ты определись, pNewArray это аргумент или локальная переменная?
0
56 / 50 / 11
Регистрация: 10.11.2010
Сообщений: 132
07.12.2012, 19:53 11
это аргумент, просто скопировал со старого кода и забыл удалить int
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.12.2012, 19:56 12
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
функция должна быть не void, а возвращать int*, а именно return NewArray. копировать в старый ar смысла нет.
Ну собственно не копировать, а изменить указатель, да и так лучше нужно будет только один массив потом удалять...
0
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,485
Записей в блоге: 1
07.12.2012, 20:32 13
Цитата Сообщение от Avazart Посмотреть сообщение
Ну собственно не копировать, а изменить указатель
указатель изменять смысла нет. Значение указателя передаётся в функцию по значению. И в этом плане ничем не отличается от других аргументов функции, ты же знаешь, функция не может изменить оригиналы аргументов, переданные ей.
0
56 / 50 / 11
Регистрация: 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
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,485
Записей в блоге: 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
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
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;
}
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.12.2012, 00:48 17
Собственно да не обратил внимание на реализацию автора...
0
fil1190
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;
}
10.05.2014, 16:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.05.2014, 16:28
Помогаю со студенческими работами здесь

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

Изменение размера динамического массива
вводится числовой массив неизвестной длинны, каждое число заносится в динамический массив. using...

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

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

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

Метод для изменения значений двумерного динамического массива
Здравствуйте, на курсах задали такое задание: &quot;Создайте метод, который для двумерного динамического...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru