0 / 0 / 0
Регистрация: 03.03.2019
Сообщений: 7
1

Двумерный динамический массив (поиск ошибки)

03.03.2019, 11:24. Показов 1068. Ответов 12
Метки нет (Все метки)

Не могу найти ошибку. Думаю, что она заключается в неправильном изменении индексации. Есть еще один интересный момент. Если запускать отладку в 64 битной конфигурации, то возникает ошибка на этапе вывода массива на экран (создание точки останова (выхожу за границы? как это исправить?)), а если установить 86 битную, то возникает ошибка "Кадр не находится в модуле". Можете объяснить на что конкретно влияет конфигурация? я не до конца понимаю этот момент, только на размер памяти в типах данных?.
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
/*Дан двумерный массив из N строк и M столбцов.
Определить для каждой строки минимальный элемент.
Среди этих элементов найти максимальный.*/
 
#include "stdafx.h"
#include <iostream>
#include "stdio.h"
#include <time.h>
#include <stdlib.h>
 
using namespace std;
 
int main()
{
    srand(time(0));
    setlocale(LC_ALL, "Russian");
    int n, m, elem;
    const int index = 1;
    cout << "Введите количество строк массива: ";
    cin >> n;
    cout << "Введите количество столбцов массива: ";
    cin >> m;
    /*int **p = new int *[n];*/
    int **p = (int**)malloc(n * sizeof(int));
    for (int i = 0; i < n; i++)
    {
        p[i] -= index;
    }
    p -= index;
    for (int i = index; i < n + index; i++)
    {
        p[i] = (int*)malloc(m * sizeof(int));
        for (int j = index; j < m+index; j++)
        {
            elem = rand() % 10;
            p[i][j] = elem;
            cout << p[i][j] << " ";
        }
        cout << endl;
    }
    int min, max = -1, k;
    for (int i = index; i < n + index; i++)
    {
        for (int j = index; j < m + index; j++)
        {
            min = p[i][j];
            if (p[i][j] < min)
            {
                min = p[i][j];
            }
        }
        if (min > max)
        {
            max = min;
            k = i;
        }
        cout << "Минимальный элемент в " << i << "-ой строке: " << min << endl;
    }
    cout << "Максимальный среди минимальных находится в " << k << "-ой строке: " << max << endl;
 
    for (int i = 0; i < n; i++)
    {
        p[i] += index;
    }
    p += index;
    for (int i = 0; i <= n; i++)
    {
        free(p[i]);
        p[i] = NULL;
    }
    free(p);
    p = NULL;
    /*for (int i = 0; i < n; i++)
    {
    p[i]-=index;
    delete[](p[i]);
    }
    p-=index;
    delete[](p);*/
    system("pause");
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.03.2019, 11:24
Ответы с готовыми решениями:

Добавление строки в двумерный динамический массив (исправить ошибки)
Выкладываю лаб. Помогите исправить ошибки в функции с добавлением строки в двумерный динамический...

Объявить и заполнить двумерный динамический массив случайными числами от 10 до 50 - исправить ошибки в коде
Здравствуйте есть задача 3:http://http://purecodecpp.com/archives/1284 #include&lt;iostream&gt; using...

Найти причины возникновения ошибок в коде и исправить эти ошибки (динамический двумерный массив)
Подскажите пожалуйста,что я упустила, где шибка? #include &lt;iostream&gt; using namespace std; ...

Динамический двумерный массив строк и операции со строками (поиск, обрезка, слияние)
Создать динамический двумерный массив на 10 ячеек (для десяти строк). Заполнить его строчками...

12
1468 / 927 / 280
Регистрация: 25.01.2019
Сообщений: 2,339
03.03.2019, 11:37 2
Цитата Сообщение от Debug_ Посмотреть сообщение
C++
1
p -= index;
Цитата Сообщение от Debug_ Посмотреть сообщение
C++
1
p[i] -= index;
это зачем?
0
0 / 0 / 0
Регистрация: 03.03.2019
Сообщений: 7
03.03.2019, 11:43  [ТС] 3
сдвиг индексации
0
215 / 162 / 52
Регистрация: 09.12.2017
Сообщений: 520
03.03.2019, 11:45 4
Если решать задачу в лоб, то так. for'ы можете скомбинировать.
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
int n; cout << " Enter n = "; cin >> n;
int m; cout << " Enter m = "; cin >> m;
 
int **p = new int *[n];
 
for (int i = 0; i < n; i++)
    p[i] = new int[m];
    
for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
        p[i][j] = rand() % 10;
 
for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
        cout << " " << p[i][j];
    }
    cout << endl;
}
 
int *min = new int[n];
for (int i = 0; i < n; i++) {
    min[i] = p[i][0];
    for (int j = 0; j < m; j++) {
        if (p[i][j] < min[i])
            min[i] = p[i][j];
    }
}
 
for (int i = 0; i < n; i++)
    cout << " " << min[i];
cout << endl;
 
int max = min[0];
for (int i = 0; i < n; i++)
    if (min[i] > max)
        max = min[i];
 
cout << " max : " << max << endl;
 
for (int i = 0; i < n; i++)
    delete[] p[i];
delete[] p;
0
0 / 0 / 0
Регистрация: 03.03.2019
Сообщений: 7
03.03.2019, 11:49  [ТС] 5
Цитата Сообщение от JohnBlack123 Посмотреть сообщение
Если решать задачу в лоб, то так. for'ы можете скомбинировать.
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
int n; cout << " Enter n = "; cin >> n;
int m; cout << " Enter m = "; cin >> m;
 
int **p = new int *[n];
 
for (int i = 0; i < n; i++)
    p[i] = new int[m];
    
for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
        p[i][j] = rand() % 10;
 
for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
        cout << " " << p[i][j];
    }
    cout << endl;
}
 
int *min = new int[n];
for (int i = 0; i < n; i++) {
    min[i] = p[i][0];
    for (int j = 0; j < m; j++) {
        if (p[i][j] < min[i])
            min[i] = p[i][j];
    }
}
 
for (int i = 0; i < n; i++)
    cout << " " << min[i];
cout << endl;
 
int max = min[0];
for (int i = 0; i < n; i++)
    if (min[i] > max)
        max = min[i];
 
cout << " max : " << max << endl;
 
for (int i = 0; i < n; i++)
    delete[] p[i];
delete[] p;
Но моя проблема заключается именно в изменении индексации, программа задачу выполняет, но следом выдает ошибку "Dinam_MASSIVE.exe вызвал срабатывание точки останова." находится она в строке вывода массива на экран, при этом в консоли выводятся все элементы массива
0
215 / 162 / 52
Регистрация: 09.12.2017
Сообщений: 520
03.03.2019, 11:54 6
Debug_, я проверял Ваш код, мой отладчик падал на моменте освобождения памяти. Вполне возможно, что именно Ваша "индексация" и нарубила дров.
0
1468 / 927 / 280
Регистрация: 25.01.2019
Сообщений: 2,339
03.03.2019, 11:55 7
Цитата Сообщение от Debug_ Посмотреть сообщение
Но моя проблема заключается именно в изменении индексации
У тебя порнография с указателями.
1
1966 / 1093 / 465
Регистрация: 11.10.2018
Сообщений: 5,586
03.03.2019, 11:56 8
Цитата Сообщение от Debug_ Посмотреть сообщение
C++
1
2
3
4
for(int i = 0; i < n; i++)
{
* * p[i] -= index;
}
- вот это зачем делать? Вам выделили память. Вы от адресов отнимаете по 1. Это зачем? Это ошибка, на мой взгляд. Правильно?
0
1468 / 927 / 280
Регистрация: 25.01.2019
Сообщений: 2,339
03.03.2019, 11:58 9
Лучший ответ Сообщение было отмечено Debug_ как решение

Решение

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
int main()
{
    srand(time(0));
    setlocale(LC_ALL, "Russian");
    int n, m, elem;
    const int index = 1;
    cout << "Введите количество строк массива: ";
    cin >> n;
    cout << "Введите количество столбцов массива: ";
    cin >> m;
    /*int **p = new int *[n];*/
    int **p = (int**)malloc(n * sizeof(int));
   /* for (int i = 0; i < n; i++)
    {
        p[i] -= index;
    }
    p -= index;*/
    for (int i = 0/*index*/; i < n/* + index*/; i++)
    {
        p[i] = (int*)malloc(m * sizeof(int));
        for (int j = 0/*index*/; j < m/*+index*/; j++)
        {
            elem = rand() % 10;
            p[i][j] = elem;
            cout << p[i][j] << " ";
        }
        cout << endl;
    }
    int min, max = -1, k;
    for (int i = 0/*index*/; i < n /*+ index*/; i++)
    {
        for (int j =0/* index*/; j < m/* + index*/; j++)
        {
            min = p[i][j];
            if (p[i][j] < min)
            {
                min = p[i][j];
            }
        }
        if (min > max)
        {
            max = min;
            k = i;
        }
        cout << "Минимальный элемент в " << i << "-ой строке: " << min << endl;
    }
    cout << "Максимальный среди минимальных находится в " << k << "-ой строке: " << max << endl;
 /*
    for (int i = 0; i < n; i++)
    {
        p[i] += index;
    }
    p += index;*/
    for (int i = 0; i </*=*/ n; i++)
    {
        free(p[i]);
        p[i] = NULL;
    }
    free(p);
    p = NULL;
    /*for (int i = 0; i < n; i++)
    {
    p[i]-=index;
    delete[](p[i]);
    }
    p-=index;
    delete[](p);*/
    system("pause");
    return 0;
}
1
1966 / 1093 / 465
Регистрация: 11.10.2018
Сообщений: 5,586
03.03.2019, 11:58 10
Да и что от new создание двухмерного динамического массива не заработало? Всю жизнь нормально работало, а тут раз - и не заработало.
0
0 / 0 / 0
Регистрация: 03.03.2019
Сообщений: 7
03.03.2019, 12:04  [ТС] 11
Требование преподавателя

Добавлено через 2 минуты
нужно решить задачу двумя способами, что я и делаю. Да, проблема с индексацией, появилась она после того, как преподаватель сказал вернуть индексацию к исходной (0;0) перед очисткой памяти
Вот эта часть кода
C++
1
2
3
4
5
for (int i = 0; i < n; i++)
    {
        p[i] += index;
    }
    p += index;
0
1468 / 927 / 280
Регистрация: 25.01.2019
Сообщений: 2,339
03.03.2019, 12:44 12
Ну и извращение, честное слово.

вот со сменой индексации и правильным поиском:

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
int main()
{
    srand(time(0));
    setlocale(LC_ALL, "Russian");
    int n, m, elem;
    const int index = 1;
    cout << "Введите количество строк массива: ";
    cin >> n;
    cout << "Введите количество столбцов массива: ";
    cin >> m;
    /*int **p = new int *[n];*/
    int **p = (int**)malloc(n * sizeof(int));
    /*
    for (int i = 0; i < n; i++)
    {
        p[i] -= index;
    }*/
    p -= index;
    for (int i = index; i < n + index; i++)
    {
        p[i] = (int*)malloc(m * sizeof(int));
 
        p[i] -= index; ///
    
 
        for (int j = index; j < m+index; j++)
        {
            elem = rand() % 10;
            p[i][j] = elem;
            cout << p[i][j] << " ";
        }
        cout << endl;
    }
    int min, max = -1, k;
    for (int i = index; i < n + index; i++)
    {
        min = p[i][1]; //
        for (int j = index; j < m + index; j++)
        {
          //  min = p[i][j];
            if (p[i][j] < min)
            {
                min = p[i][j];
            }
        }
        if (min > max)
        {
            max = min;
            k = i;
        }
        cout << "Минимальный элемент в " << i << "-ой строке: " << min << endl;
    }
    cout << "Максимальный среди минимальных находится в " << k << "-ой строке: " << max << endl;
 
 
    p += index; ///
    for (int i = 0; i < n; i++)
    {
        p[i] += index;
    }
    
 
    for (int i = 0; i </*=*/ n; i++)
    {
        free(p[i]);
        p[i] = NULL;
    }
    free(p);
    p = NULL;
    /*for (int i = 0; i < n; i++)
    {
    p[i]-=index;
    delete[](p[i]);
    }
    p-=index;
    delete[](p);*/
    system("pause");
    return 0;
}
0
0 / 0 / 0
Регистрация: 03.03.2019
Сообщений: 7
03.03.2019, 13:44  [ТС] 13
Цитата Сообщение от Folian Посмотреть сообщение
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
int main()
{
    srand(time(0));
    setlocale(LC_ALL, "Russian");
    int n, m, elem;
    const int index = 1;
    cout << "Введите количество строк массива: ";
    cin >> n;
    cout << "Введите количество столбцов массива: ";
    cin >> m;
    /*int **p = new int *[n];*/
    int **p = (int**)malloc(n * sizeof(int));
   /* for (int i = 0; i < n; i++)
    {
        p[i] -= index;
    }
    p -= index;*/
    for (int i = 0/*index*/; i < n/* + index*/; i++)
    {
        p[i] = (int*)malloc(m * sizeof(int));
        for (int j = 0/*index*/; j < m/*+index*/; j++)
        {
            elem = rand() % 10;
            p[i][j] = elem;
            cout << p[i][j] << " ";
        }
        cout << endl;
    }
    int min, max = -1, k;
    for (int i = 0/*index*/; i < n /*+ index*/; i++)
    {
        for (int j =0/* index*/; j < m/* + index*/; j++)
        {
            min = p[i][j];
            if (p[i][j] < min)
            {
                min = p[i][j];
            }
        }
        if (min > max)
        {
            max = min;
            k = i;
        }
        cout << "Минимальный элемент в " << i << "-ой строке: " << min << endl;
    }
    cout << "Максимальный среди минимальных находится в " << k << "-ой строке: " << max << endl;
 /*
    for (int i = 0; i < n; i++)
    {
        p[i] += index;
    }
    p += index;*/
    for (int i = 0; i </*=*/ n; i++)
    {
        free(p[i]);
        p[i] = NULL;
    }
    free(p);
    p = NULL;
    /*for (int i = 0; i < n; i++)
    {
    p[i]-=index;
    delete[](p[i]);
    }
    p-=index;
    delete[](p);*/
    system("pause");
    return 0;
}
Спасибо большое
все работает и уже понятно, что не так в моем коде
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.03.2019, 13:44
Помогаю со студенческими работами здесь

Динамический двумерный массив
Если число находится в интервале от 100 до 110, то используя подпрограмму, в матрицах Р(N,M),...

Двумерный динамический массив
Необходимо ввести с клавиатуры количество строк и столбцов массива(матрица размером N*M), ввести...

Вывести четные элементы матрицы
Здравствуйте, задание такое: &quot;Описать двумерный массив R целых чисел, размерностью NхM элементов,...

Динамический двумерный массив
Здравствуйте, начал недавно учить с++, смотрю видеоуроки. Дошел до этой темы и столкнулся с...


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

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

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