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

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

Войти
Регистрация
Восстановить пароль
 
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 726
#1

Большой динамический массив - C++

22.05.2013, 23:31. Просмотров 495. Ответов 5
Метки нет (Все метки)

Столкнулся с проблемой, имеется большой массив создаваемый динамически (~1000000 ячеек) и примерно на 350000 на одной и тойже ячейке кидается исключение "чтение памяти невозможно", каковы причины могу этого ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.05.2013, 23:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Большой динамический массив (C++):

Один большой динамический массив вместо нескольких меньшего размера - C++
Уважаемые форумчане, Прошу помочь советом. Интересует ответы на вопросы: Возможно ли? Если да, то как реализовать? ...

очень большой массив - C++
Здравстуйте! Необходимо решить физическую задачку явной схемой, однако столкнулся с проблемой : нужен очень большой трехмерный массив и...

Большой двумерный массив - C++
Нужен массив 999999996 на 999999997, но компилятор ругается! Заранее спасибо!

Можно ли в классе создавать массив переменной длинны. Например динамический массив? - C++
Динамические массивы привлекают больше. :)

динамический массив (Целое число разложить на массив простых множителей) - C++
Доброго времени суток всем. Целое число необходимо разложить на массив простых множителей. Столкнулся с проблемой, мне нужно, чтобы...

Написать функцию принимающую массив и возвращающую указатель на динамический массив - C++
Написать функцию принимающую массив и возвращающую указатель на динамический массив содержащий первые n нaибольших чисел. Как сделать...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
WolondeWord
6 / 6 / 1
Регистрация: 06.05.2013
Сообщений: 18
23.05.2013, 03:22 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <conio.h>
using namespace std;
 
void main()
{
    float **M;
    int m = 1000;
    int n = 1000;
    M = new float *[m];
    for(int i = 0; i < m; i++)
    {
        M[i] = new float [n];
    }
    for(int i = 0; i < m; i++)
        for(int j = 0; j < n; j++)
            M[i][j] = rand() % 10;
    getch();
}
Вот код. Программа создает динамический массив 1000*1000 элементов. То бишь 1000000 ячеек. Читает все нормально. Проходит по каждой ячейке.

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <conio.h>
using namespace std;
 
void main()
{
    float *M;
    int m = 1000000;
    M = new float [m];
    
    for(int i = 0; i < m; i++)
            M[i] = rand() % 10;
    getch();
}
Здесь одномерный массив который имеет размерность 1000000. То же самое. Работает нормально.
Может быть у тебя ошибка в коде?
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 726
23.05.2013, 10:27  [ТС] #3
WolondeWord, неисключено, вот код функция:
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
bool LoadPlaceFromFile(char* FileName, int SizeMap, IDirect3DDevice9 *device)
{
    ifstream  file;
    file.open(FileName, ios::binary);
 
    if(!file)
    {
        MessageBox(NULL, L"OpenFilePlace - faile", NULL, NULL);
        return 0;
    }
        
    BYTE B;
           int *massByte;
           massByte = new int[SizeMap*SizeMap];
    for(int j = 0; j < SizeMap*SizeMap; j++)
    {
        file >> B;
        massByte[j] = B;
    }
 
    massVertex = new MassVertex*[SizeMap];
    
    for(int j = 0; j < SizeMap; j++)
        massVertex[j] = new MassVertex[SizeMap];
 
    int i(0);
    for(int j = 0; j < SizeMap; j++)
        for(int k = 0; k < SizeMap; k++)
        {
            massVertex[j][k].x = k;
            massVertex[j][k].y = massByte[i];
            massVertex[j][k].z = -j;
            i++;
        }
 
    int size = (SizeMap*2)*(SizeMap*2);
    massPolygons = new MassPolygons[size];
    int k(0), w(1);
           //вот в этом цикле вылетает 
    for(int i = 0; i < SizeMap-1; i++)
        for(int j = 0; j < SizeMap-1; j++)
        {
            if(w%2)
            {
                massPolygons[k].x = massVertex[i][j].x;
                massPolygons[k].y = massVertex[i][j].y;
                massPolygons[k].z = massVertex[i][j].z;
                massPolygons[k+1].x = massVertex[i+1][j+1].x;
                massPolygons[k+1].y = massVertex[i+1][j+1].y;
                massPolygons[k+1].z = massVertex[i+1][j+1].z;
                massPolygons[k+2].x = massVertex[i+1][j].x;
                massPolygons[k+2].y = massVertex[i+1][j].y;
                massPolygons[k+2].z = massVertex[i+1][j].z;
            }
            w++;
            if(!(w%2))
            {
                massPolygons[k+3].x = massVertex[i][j].x;
                massPolygons[k+3].y = massVertex[i][j].y;
                massPolygons[k+3].z = massVertex[i][j].z;
                massPolygons[k+4].x = massVertex[i][j+1].x;
                massPolygons[k+4].y = massVertex[i][j+1].y;
                massPolygons[k+4].z = massVertex[i][j+1].z;
                massPolygons[k+5].x = massVertex[i+1][j+1].x;
                massPolygons[k+5].y = massVertex[i+1][j+1].y;
                massPolygons[k+5].z = massVertex[i+1][j+1].z;
            }
            w++;
            k += 6;
        }
 
    file.close();
 
    return 1;
 
}
Вот структуры:
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct MassVertex
        {
            float x;
            float y;
            float z;
        } **massVertex;
        struct MassPolygons
        {
            float x;
            float y;
            float z;
        } *massPolygons;
причем заметил что если посылаю размер 512 то вылетает где-то при обращении к 350000 ячейке, пробовал посылать 128, вылетает там же только где-то 2при обращении к 22000 ячейке, видать косяк в коде, но пока не вижу где(
в качестве размера в функцию посылается количество пикселей с одной стороны квадратного изображения типа *.RAW
WolondeWord
6 / 6 / 1
Регистрация: 06.05.2013
Сообщений: 18
23.05.2013, 10:35 #4
С индексами где-то намутил в цикле. Начинаешь обращаться на недоступное место в памяти. Перепроверь цикл с упором на индексы.

Мне кажется ошибка именно в индексах.
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 726
23.05.2013, 11:27  [ТС] #5
WolondeWord, в массиве massVertex все отлично, говорит что чтение памяти невозможно в массиве massPolygons при обращении к ячейке [k+4] причем это далеко не последний элемент массива
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.05.2013, 12:02 #6
NEvOl, в 38 строке Вы выделяете (4*SizeMap^2) элементов, а в цикле обращаетесь к ячейке с индексом k, который принимает значения от 0 до ((SizeMap-2)^2)*6 + 5. Получаем выход за пределы диапазона.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2013, 12:02
Привет! Вот еще темы с ответами:

Заполнить динамический массив из файла и записать массив обратно в файл - C++
Подскажите пожалуйста функцию которая будет заполнять Динамический массив из файла и обратную которая этот массив запишет в файл=)

Массив: передать динамический массив в функцию и записать в каждый элемент строку из файла - C++
задача: передать динамический массив в функцию, и записать в каждый элемент строку из файла. количество строк известно вот что у меня...

Как преобразовать массив в динамический? Массив вычисляет сумму элементов каждой диагонали матрицы - C++
Ошибка : Вызвано исключение по адресу 0x00BB2F4F в Проект6.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFDFDFE05. #...

Создать динамический массив (Если чётных чисел больше, то массив должен быть укорочен на 2 элемента) - C++
Создать динамический массив из 8 случайных целых чисел из отрезка и вывести его на экран . Если в массиве чётных чисел оказалось...


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

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

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