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

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

Войти
Регистрация
Восстановить пароль
 
Sov3117
0 / 0 / 0
Регистрация: 12.09.2009
Сообщений: 10
#1

Проблему с двумерным динамическим массивов - C++

13.09.2009, 00:20. Просмотров 523. Ответов 7
Метки нет (Все метки)

Написал программку. Считает правильно, но в конце выдаётся ошибка.
Цель такая:В массив А(N,М) вставить одномерный массив В(N), расположив его перед последним столбцом, содержащим нулевой элемент. Если такого столбца не окажется, то вставить массив В(N) после последнего столбца. Ввод, вывод элементов двумерного массива и его обработку оформить в виде функций.
Вот программа
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
134
135
136
137
138
#include <iostream.h>
#include <stdlib.h> 
#include <conio.h>
void EnterArray(int **, int, int, int );
void Vvod(int *, int, int);
void reshenie(int**, int* , int, int);
void  Vyvod1(int **, int  ,int );
void Vyvod2(int *, int );
int main()
{
  int N, M, z;
  while (true)
    {
        cout << "Vvedite kolvo strok (N):";
        cin >> N;
        cout << "Vvedite kolvo stolbcob (M):";
        cin >> M;
        if (N!=0 && M!=0) break;
        {
          cout << "Nekorrectnie dannie, porobuyte esto!\n";
          system("pause");
        }
    }
     cout <<"\n\tIshodniy massiv A\n";
     int **A=new int* [N];
     for(int i=0; i<N; i++)
     A[i]=new int [M];
     EnterArray(A, N, M,z);
     Vyvod1(A, N, M);
     cout << "\n\tIshodniy massiv B\n";
     int *B=new int [N];
     Vvod(B, N, z);
     Vyvod2(B, N);
     cout <<"Noviy massiv chisel \n";
     reshenie(A, B, N, M);
     Vyvod1(A, N, M+1);
     cout<<endl;
      system("pause");
       system("pause");
     for(int i=0; i<N; i++)
     delete []A[i];
     delete []A;
     delete []B;
     system("pause");
     return 0;
 }
  void EnterArray(int **A, int N, int M, int z)
  {
   cout<<"Viberete sposob vvoda 1-sluchaynie, 0-consol:";
     cin >> z;
     if (z==1)
     {
        for(int i = 0; i < N ; i++)
        {
          for(int j = 0; j <M ; j++)
          {
           A[i][j] =random(100);
          }
        }
     }
     else
     {
       cout <<" Vvedite massiv chisel \n";
       for(int i=0; i<N; i++)
           for (int j = 0; j < M; j++)
           {
             cout << "A[" << i << "][" << j << "]=";
             cin >> A[i][j];
           }
 
      }
   }
  void  Vvod(int*B, int N, int z)
   {
   cout<<"Viberete sposob vvoda 1-sluchaynie, 0-consol:";
     cin >> z;
     if (z==1)
     {
        for(int i = 0; i < N; i++)
        B[i] = random(100);
 
     }
    else
    {
       cout <<" Vvedite massiv chisel \n";
       for(int i=0; i<N; i++)
         cin >>B[i];
    }
  }
   void reshenie(int**A, int* B, int N, int M)
   {
     int flagg=0;
     for(int j=M-1; j >= 0;  j--)
     { int flag=0;
       for(int i = 0; i<N;  i++)
           if (A[i][j]==0)
           {
            flag=1;
           break;
           }
       if (flag)
       {
             for(int k=0; k<M-j ;k++)
             for(int l= 0; l < N ; l++)
              A[l][M-k]=A[l][M-k-1];
              for(int k=0; k<N; k++)
              A[k][j]=B[k];
              flagg=1;
              break;
       }
 
      }
     if (flagg==0)
             for(int k=0; k<N; k++)
             A[k][M]=B[k];
 
    }
    void  Vyvod1(int **A, int N,int M)
    {
       for(int i=0; i<N; i++)
       {
           for (int j = 0; j < M; j++)
           {
             cout.width(6);
             cout << A[i][j];
           }
           cout << endl;
        }
     }
     void Vyvod2(int *B, int N)
     {
      for(int i=0; i<N; i++)
       {
         cout.width(6);
         cout << B[i] << ' ';
         cout <<endl;
        }
     }

Ошибка такая:
Project Project1.exe raised exceptionclass EaccessViolation with message ‘Access violation at address 32609998. Write to address 00000059’. Process stopped. Use Step or Run to continue.

Ошибка выскакивает (как я понял ) при удалении любого из массивов. Если массивы не удалять ошибки не выскакивает. 2 system("pause") перед удалением массивов поставил потому, что при первой попытке выключить программу выполняется следующее действие по программе.
В понедельник зачёт по матанализу, из-за этой задачи не могу сконцентрироваться на последнем, блин.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.09.2009, 00:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проблему с двумерным динамическим массивов (C++):

Работа с динамическим двумерным массивом - C++
Написал код. В двумерном массиве 5х5 находится максимальное значение каждой строки и затем минимальное из них. Необходимо указывать...

Ошибка с памятью при работе с динамическим двумерным массивом - C++
Вроде всё правильно, но в ходе работы программа выдаёт ошибку(на скрине). Дело в двумерном динамическом массиве. Ниже код с функцией, куда...

Создать класс для работы с двумерным динамическим массивом чисел - C++
Создать класс для работы с двумерным динамическим массивом чисел. Методы: -заполнить массив рандомно. -вывести массив. И...

Передача функции с двумерным массивов в качестве параметра - C++
Всем доброго времени суток. У меня проблема следующего плана. Есть некая функция void Get_from_file(Rect rectangle, int sizeY) из...

Помогите найти проблему в коде - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;cmath&gt; #include &lt;clocale&gt; using namespace std; int main () { ...

Решить проблему с деструктором класса Student - C++
Добрый день! Хотел написать простенький класс, но возникла проблема с деструктором. Подскажите, пожалуйста, в чём ошибка. Если деструктор...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
M128K145
Эксперт С++
8286 / 3505 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
13.09.2009, 00:46 #2
Выкинь переменную z, параметром ее нет смысла передавать, просто в теле функции обьяви ее как локальную переменную. По правилам хорошего тона, чем меньше параметров передается тем лучше. Ошибка вылетает на 41 строке, при этом массив B удаляется корректно и без проблем(если его раньше удалить). В общем завтра попробую исправить
Sov3117
0 / 0 / 0
Регистрация: 12.09.2009
Сообщений: 10
13.09.2009, 02:56  [ТС] #3
массив B (если ставить delete []B до удаления массива А) без ошибки удаляется не всегда. Причём если задаю оба массива случайных и выдаёт ошибку из C++Builder 6 выйти могу только через диспетчер задач и, когда снова запускаю C++Builder открываю-запускаю программу, снова указываю случайные массивы : массивы выводятся те же что и первый раз.
M128K145
Эксперт С++
8286 / 3505 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
13.09.2009, 12:48 #4
Случайные числа
Вот решение
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
#include <iostream.h>
#include <stdlib.h> 
#include <conio.h>
using namespace std;
void EnterArray(int **, int, int);
void Vvod(int *, int);
void reshenie(int**, int* , int, int);
void  Vyvod1(int **, int  ,int );
void Vyvod2(int *, int );
int main()
{
    int N, M, i;
    while (true)
    {
        cout << "Vvedite kolvo strok (N):";
        cin >> N;
        cout << "Vvedite kolvo stolbcob (M):";
        cin >> M;
        if (N!=0 && M!=0)
            break;
        cout << "Nekorrectnie dannie, porobuyte esto!\n";
    }
    cout <<"\n\tIshodniy massiv A\n";
    int **A=new int* [N];
    for(i=0; i<N; i++)
        A[i]=new int [M+1];
    EnterArray(A, N, M);
    Vyvod1(A, N, M);
    cout << "\n\tIshodniy massiv B\n";
    int *B=new int [N];
    Vvod(B, N);
    Vyvod2(B, N);
    cout <<"Noviy massiv chisel \n";
    reshenie(A, B, N, M);
    Vyvod1(A, N, M+1);
    cout<<endl;
    for(i=0; i<N; ++i)
        delete []A[i];
    delete []A;
    delete []B;
    system("pause");
    return 0;
}
void EnterArray(int **A, int N, int M)
{
    int z;
    cout<<"Viberete sposob vvoda 1-sluchaynie, 0-consol:";
    cin >> z;
    if (z==1)
        for(int i = 0; i < N ; i++)
            for(int j = 0; j <M ; j++)
                A[i][j] =random(100);
    else
    {
        cout <<" Vvedite massiv chisel \n";
        for(int i=0; i<N; i++)
            for (int j = 0; j < M; j++)
            {
                cout << "A[" << i << "][" << j << "]=";
                cin >> A[i][j];
            }
 
    }
}
void  Vvod(int*B, int N)
{
    int z;
    cout<<"Viberete sposob vvoda 1-sluchaynie, 0-consol:";
    cin >> z;
    if (z==1)
        for(int i = 0; i < N; i++)
            B[i] = random(100);
    else
    {
        cout <<" Vvedite massiv chisel \n";
        for(int i=0; i<N; i++)
            cin >>B[i];
    }
}
void reshenie(int**A, int* B, int N, int M)
{
    int flagg=0;
    for(int j=M-1; j >= 0;  j--)
    { 
        int flag=0;
        for(int i = 0; i<N;  i++)
            if (A[i][j]==0)
            {
                flag=1;
                break;
            }
            if (flag)
            {
                for(int k=0; k<M-j ;k++)
                    for(int l= 0; l < N ; l++)
                        A[l][M-k]=A[l][M-k-1];
                for(int k=0; k<N; k++)
                    A[k][j]=B[k];
                flagg=1;
                break;
            }
    }
    if (flagg==0)
        for(int k=0; k<N; k++)
            A[k][M]=B[k];
}
void  Vyvod1(int **A, int N,int M)
{
    for(int i=0; i<N; i++)
        for (int j = 0; j < M; j++)
        {
            cout.width(6);
            cout << A[i][j];
        }
        cout << endl;
}
void Vyvod2(int *B, int N)
{
    for(int i=0; i<N; i++)
    {
        cout.width(6);
        cout << B[i] << ' ';
        cout <<endl;
    }
}
Sov3117
0 / 0 / 0
Регистрация: 12.09.2009
Сообщений: 10
13.09.2009, 14:28  [ТС] #5
Спасибо. Поменять A[i]=new int [M] на A[i]=new int [M+1] достаточно чтобы прога работала. Я так понял ошибка была в том, что удалял массив длиннее чем задавал?
M128K145
Эксперт С++
8286 / 3505 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
13.09.2009, 14:35 #6
Можно и так сказать. Просто выделял массив на M элементов, а потом сделав это
C++
1
A[k][M]=B[k];
ты как увеличил на 1 количество столбцов. И вот удаляя так
C++
1
delete []A[i];
ты по прежнему пытался удалить M элементов, но все же A[i] указывал на строку с M+1 элементом, поэтому программа и вылетала. Лучше в будущем таких фокусов не делать, а выделять массив реально необходимой длинны(с учетом того, что он точно потом увеличится в размерах)
Sov3117
0 / 0 / 0
Регистрация: 12.09.2009
Сообщений: 10
13.09.2009, 14:58  [ТС] #7
Понимаю. Ещё раз сэнкс.

Я так понимаю закрыть тему я не могу.
M128K145
Эксперт С++
8286 / 3505 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
13.09.2009, 15:10 #8
Sov3117, я могу, но в этом нет необходимости
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.09.2009, 15:10
Привет! Вот еще темы с ответами:

Как побороть проблему множественного определения? - C++
В многофайловом проекте использую конструкцию #ifndef-#define в h файлах, но все равно появляется проблема множественного определения. Как...

в Dev C++ 5 Win7 жалуется на возникшую проблему и просит закрыть программу. - C++
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int main () { setlocale(LC_ALL, &quot;Russian&quot;); ...

Двумерным массив - C++
Помогите разобраться, почему не работает? Вылетает с ошибкой: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFDFDFDFD.Указывает...

Сумма ряда: Программа выдает пустую консоль. Как решить проблему? - C++
Доброго времени суток. Написан код для вычисления суммы бесконечного ряда. Ряд выглядит следующим образом: ...


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

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

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