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

Нарушение прав доступа в многомерном массиве - C++

Восстановить пароль Регистрация
 
nokados
27 / 27 / 5
Регистрация: 30.04.2012
Сообщений: 132
09.11.2013, 22:38     Нарушение прав доступа в многомерном массиве #1
Написал функцию, которая находит в массиве элемент, который встречается в нем чаще остальных. Вот код:
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
int frequent(int**arr,int nRows, int nCols)
{
    int l=0,n;
    int max=0,maxI=0;
 
    int** frequency = (int**)new int[nRows*nCols][2];
    
    for (int i=0; i<nRows; i++)
        for (int j=0; j<nCols; j++)
        {
            n=-1;
            for (int k=0;k<l;k++)
                if (frequency[k][0]==arr[i][j])
                {
                    n=k;
                    break;
                }
            if (n==-1)
            {
                n=l;
                frequency[l][0]=arr[i][j];
                frequency[l][1]=1;
                l++;
            }
            else
            {
                frequency[n][0]++;
            }
            if(frequency[n][1]>max)
            {
                maxI=frequency[n][0];
                max=frequency[n][1];
            }
        }
    return maxI;
}
здесь
  • arr - массив по которому осуществляется поиск
  • frequency - массив в котором хранится количество элемента в массиве. в frequency[i][0] хранится число из arr, а в frequency[i][1] сколько раз frequency[i][0] встречается в arr.
  • l - длина frequency
остальное должно быть понятно.

на строчке
C++
1
frequency[l][0]=arr[i][j];
вылетает с ошибкой:Необработанное исключение в "0x00c846cb" в "tests.exe": 0xC0000005: Нарушение прав доступа при записи "0xcdcdcdcd".

Microsoft Visual Studio 2010 Ultimate
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2013, 22:38     Нарушение прав доступа в многомерном массиве
Посмотрите здесь:

C++ Ошибка: Нарушение прав доступа
Указатель на структуру (нарушение прав доступа) C++
Динамический список (нарушение прав доступа) C++
указатель (нарушение прав доступа) C++
C++ Нарушение прав доступа при записи
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
reckless91
30 / 30 / 1
Регистрация: 01.11.2013
Сообщений: 63
09.11.2013, 23:27     Нарушение прав доступа в многомерном массиве #2
Цитата Сообщение от nokados Посмотреть сообщение
вылетает с ошибкой:Необработанное исключение в "0x00c846cb" в "tests.exe": 0xC0000005: Нарушение прав доступа при записи "0xcdcdcdcd"
Измените инициализацию двумерного динамического массива:
C++
1
2
3
int** frequency = new int*[nRows*nCols];
    for(int i = 0; i < nRows*nCols; i++)
        frequency[i] = new int[2];
И не забывайте о delete[], когда работаете с памятью
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
09.11.2013, 23:41     Нарушение прав доступа в многомерном массиве #3
reckless91Ерунда какая-то! При чем тут new int[2] ?? Может все же так?!!
C++
1
2
3
4
int** a=new int*[nRows];
*a=new int[nRows*nCols];
for(int i=1; i<nRows; i++)
  a[i]=a[i-1]+nCols;
nokados
27 / 27 / 5
Регистрация: 30.04.2012
Сообщений: 132
09.11.2013, 23:49  [ТС]     Нарушение прав доступа в многомерном массиве #4
reckless91, Спасибо, помогло(хотя там еще 1 ошибка была). А почему
C++
1
int** frequency = (int**)new int[nRows*nCols][2];
не работает?

Добавлено через 2 минуты
Цитата Сообщение от reckless91 Посмотреть сообщение
И не забывайте о delete[], когда работаете с памятью
И внутри функции тоже что ли надо? Они как локальные, я думаю, сами удалятся..

Добавлено через 2 минуты
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
reckless91Ерунда какая-то! При чем тут new int[2]
Нет тут другой массив. размерами (nRows*nCols) шириной и 2 высотой. (или наоборот, но не суть)
А Ваш создает массив размерами nRows высотой и nCols шириной.
reckless91
30 / 30 / 1
Регистрация: 01.11.2013
Сообщений: 63
10.11.2013, 00:00     Нарушение прав доступа в многомерном массиве #5
Цитата Сообщение от nokados Посмотреть сообщение
И внутри функции тоже что ли надо? Они как локальные, я думаю, сами удалятся..
Да, надо). Все таки динамическая память, удаляются только локальные указатели на выделенную память, но очистка памяти при этом не происходит. Так что ручками, ручками.
nokados
27 / 27 / 5
Регистрация: 30.04.2012
Сообщений: 132
10.11.2013, 00:21  [ТС]     Нарушение прав доступа в многомерном массиве #6
reckless91, а если передаются, как аргумент (в данном случае arr) тоже надо?

Добавлено через 7 минут
Я разобрался - не надо. Всем спасибо!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.11.2013, 00:24     Нарушение прав доступа в многомерном массиве
Еще ссылки по теме:

C++ Нарушение прав доступа
C++ Нарушение прав доступа при чтении
C++ Ошибка: нарушение прав доступа по адресу

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

Или воспользуйтесь поиском по форуму:
reckless91
30 / 30 / 1
Регистрация: 01.11.2013
Сообщений: 63
10.11.2013, 00:24     Нарушение прав доступа в многомерном массиве #7
Цитата Сообщение от nokados Посмотреть сообщение
а если передаются, как аргумент (в данном случае arr) тоже надо?
C++
1
2
3
4
5
6
7
8
9
10
11
int ** arr = new int*[10];
    for(i = 0; i < 10; i++)
        arr[i] = new int[10];
    
    for(i = 0; i < 10; i++)
        for(j = 0; j < 10; j++)
            arr[i][j] = 1;
 
    int nRows = 10, nCols = 10;
 
    count = frequent(arr, nRows, nCols);
Цитата Сообщение от nokados Посмотреть сообщение
int** frequency = (int**)new int[nRows*nCols][2];
не работает?
new возвращает указатель, а не указатель на указатель
Yandex
Объявления
10.11.2013, 00:24     Нарушение прав доступа в многомерном массиве
Ответ Создать тему
Опции темы

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