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

Как по скопировать обновленный двумерный динамический массив - C++

Восстановить пароль Регистрация
 
CheburatorUA
0 / 0 / 0
Регистрация: 27.03.2014
Сообщений: 24
18.04.2014, 14:43     Как по скопировать обновленный двумерный динамический массив #1
День добрый.
Третий день пытаюсь найти решение.
Необходимо создать матрицу и добавить в нее строку. В оригинале задача гораздо больше. Она должна быть - с меню и т.п., но я попытался выделить именно ошибку, на которой она глохнет у меня, может кто-то подскажет как решить.

Суть такова:
1. создаем первый двумерный динамический массив в виде матрицы, заполняем его случайными цифрами.
2. создаем такой же второй динамический массив и копируем в него данные первого массива.
3. удаляем первый динамический массив.
4. по тому же адресу, по которому был первый динамический массив создаем новый массив с таким же названием как и первый + 1строка.
5. копируем с второго массива данные в первый(обновленный) массив, а добавленную строку заполняем нулями.

Вот на 5 пункте выполнение виснет, хотя сама задача компилируется, я уже как не пробовал как не упрощал, не получается. Ошибка на 41 строке я уверен, но не могу понять как правильно сделать. Как мне кажется правильным программа не компилирует, методом научного тыка чтобы хоть скомпилировала получилось только так как внизу, но не работает. Как обновить первый динамический массив по ссылке? Если делать не по ссылке, то у меня появятся два массива с одним название, но по разным адресам, а мне так нельзя.


C++ (Qt)
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
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
void show(int** &,int*,int*);              //показ массива
 
void main ()
{
    setlocale (LC_CTYPE, "russian");
    srand(time(NULL));
    int a=1,
        i=0,
        d1=5,        //строки
        d2=5,
        d21=0,
        d22=0;
    int **mas1= new int *[d1];
    for(i=0; i<d1; i++)
    {
        mas1[i]=new int [d2];
    }
    for(i=0;i<d1;i++)                  
        for(int j=0;j<d2; j++)         // заполняем случайными цифрами от -99 до 99
            mas1[i][j]=rand()%198-99;
    show(mas1,&d1,&d2);
    if (a==1)
    {
        int NStr=2;
        d21=d1;                              // создаем указатели для второго массива
        d22=d2;
        int **mas2= new int *[d21];              //создаем копию массива для использования его данных в дальнейшем
        for(int i=0; i<d1; i++)
            mas2[i]=new int [d22];
        for(int i=0;i<d1;i++)                   //копируем первый массив во второй
            for(int j=0;j<d2; j++)
               mas2[i][j]=mas1[i][j];
        for (int i = 0; i < d1; i++)            // удаляем первый массив
              delete []mas1[i];
          delete []mas1;
        d1+=1;
        int *&mas1=new int [d1];          // создаем обновленный первый массив с удаленной или добавленной строкой
            for(int i=0; i<d1; i++)
                 mas1[i]=*new int [d2];  // вот где-то здесь ошибка
            for(int i=0; i<d1; i++)   //копируем массив 2 в массив 1.
        {
            for(int j=0;j<d2; j++)
            {
                if(i+1==NStr)
                    mas1[i][&j]=0;                //заполняем нулями добавленную строку
                if(i+1<NStr)
                    mas1[i][&j]=mas2[i][j];
                if(i+1>NStr)
                    mas1[i][&j]=mas2[i-1][j];    //поскольку первоначальный массив содержал на одну строку меньше или больше
            }                                   //то при копировании первоначальных данных в обновленный массив
                                                //необходимо учитывать разное количество строк
        }
    }
}
 
 
void show(int** &mas,int* n1,int* n2)
{
    for(int i=0;i<*n1;i++)
        {
            cout<<"\t";
            for(int j=0;j<*n2; j++)
                {
                    if(mas[i][j]>=10)
                        cout<<"  "<<mas[i][j];
                    if(mas[i][j]<10 && mas[i][j]>=0)
                        cout<<"   "<<mas[i][j];
                    if(mas[i][j]<0 && mas[i][j]>-10)
                        cout<<"  "<<mas[i][j];
                    if(mas[i][j]<=-10)
                        cout<<" "<<mas[i][j];
                }
            cout<<endl;
        }
}
Добавлено через 4 минуты

Добавлено через 1 минуту
Я ошибку допустил в названии темы, не могу понять как откорректировать само название темы после публикации на форуме.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2014, 14:43     Как по скопировать обновленный двумерный динамический массив
Посмотрите здесь:

как скопировать двумерный массив в vector C++
Как создать двумерный динамический массив C++
C++ Как создать динамический двумерный массив с использованием функции malloc?
C++ Как правильно записать двумерный динамический массив?
Как заполнить двумерный динамический массив? C++
C++ Как создать двумерный динамический массив (принцип лото)?
Как выделить память под динамический двумерный массив C++
Как передать в функцию двумерный динамический массив? C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 14:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru