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

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

Восстановить пароль Регистрация
 
NEvOl
12 / 11 / 0
Регистрация: 13.08.2012
Сообщений: 616
22.05.2013, 23:31     Большой динамический массив #1
Столкнулся с проблемой, имеется большой массив создаваемый динамически (~1000000 ячеек) и примерно на 350000 на одной и тойже ячейке кидается исключение "чтение памяти невозможно", каковы причины могу этого ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
12 / 11 / 0
Регистрация: 13.08.2012
Сообщений: 616
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
12 / 11 / 0
Регистрация: 13.08.2012
Сообщений: 616
23.05.2013, 11:27  [ТС]     Большой динамический массив #5
WolondeWord, в массиве massVertex все отлично, говорит что чтение памяти невозможно в массиве massPolygons при обращении к ячейке [k+4] причем это далеко не последний элемент массива
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
23.05.2013, 12:02     Большой динамический массив #6
NEvOl, в 38 строке Вы выделяете (4*SizeMap^2) элементов, а в цикле обращаетесь к ячейке с индексом k, который принимает значения от 0 до ((SizeMap-2)^2)*6 + 5. Получаем выход за пределы диапазона.
Yandex
Объявления
23.05.2013, 12:02     Большой динамический массив
Ответ Создать тему
Опции темы

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