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

Динамическое выделение памяти new - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
12.03.2010, 22:51     Динамическое выделение памяти new #1
Доброго времени.
У меня в программе есть два двумерных динамических массива. Код компилируется, но возникает ошибка времени выполнения: "Инструкция по адресу "..." обратилась к памяти по адресу "...". Память не может быть "read"".
если закоментировать выделение памяти под второй массив то программа работает без ошибок.
Если попробовать выделить под второй массив совсем чуть-чуть памяти - один байт, все равно появляется ошибка времени выполененя. Что-то совсем не могу разобраться, почему процессу нельзя выделить память под второй массив? ведь под первый все выделяется...
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
//синтез комбинационных схем с помощю карт Вейча
#include <iostream>
#include <math.h>
using namespace std;
 
int main()
{
    FILE *f=fopen("table.txt","r");
    if (!f)return 1;
    int k;//количество разрядов в регистре
    int n;//кол-во столбцов в таблице
    fscanf(f,"%d",&k);
    if (k>16)return 2;
    n=2*k;
    cout << "n=" << n << endl;
 
    int m=(int)exp(k*log(2))+1;//кол-во строк
    bool **matr; //таблица
    matr=new bool*[m];
    for (int i=0;i < m;i++) matr[i]=new bool[n];
    //рисуем шапку таблицы
    for (int i=n/2 - 1;i>=0;i--)cout << 'Q' << i << ' ';
    cout <<'|';
    for (int i=n/2 - 1;i>=0;i--)cout << 'D' << i << ' ';
    cout << endl;
    //заполняем таблицу из файла
    for (int i=0;i < m;i++)
    {
        for (int j=0;j < n;j++)
        {
            fscanf(f,"%d",&matr[i][j]);
            printf("%2d ",matr[i][j]);
            if (j==(n/2-1) )printf("|");
        }
        cout << endl;
    }
    fclose(f);
    bool **KartaVeicha;
    KartaVeicha=new bool*[k];
    //строчка ниже и есть причина ошибки :(
    for (int i=0;i<k;i++) KartaVeicha[i]=new bool[m]; //m - количество наборов
    /*
    //составляем карту вейча
    for (int i=0;i<k;i++) //i - номер разряда D.
    {
        printf("for D%d\n",i);
        for (int j=0;j<m*n;j++) KartaVeicha[i][j]=matr[j][n-1-i];
    }
    for (int i=0;i<k;i++)
    {
        for (int j=0;j<n*m;j++) printf("%2d",KartaVeicha[i][j]);
        cout << endl;
    }*/
    //освобождение памяти
    for (int i=0;i<k;i++) delete [] KartaVeicha[i];
    delete [] KartaVeicha;
 
    for (int i=0;i<n;i++) delete [] matr[i];
    delete [] matr;
    return 0;
}
файл table.txt:
3
0 0 0 0 0 1
0 0 1 0 1 0
0 1 0 0 1 1
0 1 1 1 0 0
1 0 0 1 0 1
1 0 1 1 1 0
1 1 0 1 1 1
1 1 1 0 0 0
среда Code::Blocks 8.02
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.03.2010, 22:51     Динамическое выделение памяти new
Посмотрите здесь:

C++ динамическое выделение памяти
Динамическое выделение памяти C++
Динамическое выделение памяти C++
C++ Динамическое выделение памяти
Динамическое выделение памяти! C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Darky
Быдлокодер
 Аватар для Darky
507 / 294 / 45
Регистрация: 22.11.2009
Сообщений: 892
Завершенные тесты: 1
13.03.2010, 06:25     Динамическое выделение памяти new #2
Все-таки интересно знать, почему вместо int в данном случае используется bool?
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
13.03.2010, 10:36  [ТС]     Динамическое выделение памяти new #3
Спасибо! поменял на int помогло ))), а было bool, потому что в жизни эта таблица содержит логические занчия, я думал так память сэкономить. И все же, можно узнать причина ошибки в чем?
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
13.03.2010, 10:59     Динамическое выделение памяти new #4
Aye Aye:
В чём ошибка не знаю.
Но допустим файловые потоки ofstream и ifstream c bool не умеют работать вообще.
Как насчет C я не знаю.

Добавлено через 14 минут
я думал так память сэкономить
Делаем так:
C++
1
typedef unsigned char BYTE;
Попробуй с этим типом поработать, вроде 1 байт, экономия.
Darky
Быдлокодер
 Аватар для Darky
507 / 294 / 45
Регистрация: 22.11.2009
Сообщений: 892
Завершенные тесты: 1
13.03.2010, 14:29     Динамическое выделение памяти new #5
Aye Aye, Я так подозреваю потому, что в дальнейшем шло присвоение bool переменной значение элемента матрицы.
C++
1
KartaVeicha[i][j]=matr[j][n-1-i]
Yandex
Объявления
13.03.2010, 14:29     Динамическое выделение памяти new
Ответ Создать тему

Метки
динамические массивы
Опции темы

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