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

Access violation reading location - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
NEvOl
12 / 11 / 0
Регистрация: 13.08.2012
Сообщений: 616
06.02.2014, 12:55     Access violation reading location #1
Уважаемые знатоки, подскажите пожалуйста в чем проблема или хотя бы типовые причины возникновения, данного исключения (см. заголовок). На сколько я понимаю причина в том что пытаюсь прочитать данные в "закрытом" участке памяти.
вот сам код:
C++
1
2
3
4
5
6
7
8
9
10
    for(UINT i = 0; i <= numMipLevel; i++)
    {
        D3D11_MAPPED_SUBRESOURCE ms;
        if(FAILED(g_pd3d11DeviceContext->Map(g_pMassTextures[i], 0, D3D11_MAP_READ, 0, &ms)))
            break;
        
        g_pd3d11DeviceContext->UpdateSubresource(textArray, D3D11CalcSubresource(0, i, 1), 0, ms.pData, ms.RowPitch, ms.DepthPitch);//тут на 2-ой итерации вскакиева исключение
 
        g_pd3d11DeviceContext->Unmap(g_pMassTextures[i], 0);
    }
суть программы заключается в загрузке текстуры, программной генерации мип уровней и создании массива текстур из сгенерированных текстур + исходная текстура(0-ой элемент), для текстур небольших размеров 512х512 - 1024 х 1024 работает адекватно если размер покрупнее к примеру 1200 х 1960 и больше начинается такая проблема, подскажите пожалуйста.

Добавлено через 1 час 46 минут
как вообще исправлять такие ошибки ? а то пол дня маюсь толку нет, указывает адрес по которому не может произвести чтение, может как-то с помощью этого адреса можно найти объект который является причиной возникновения исключения и уже смотреть его ?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
06.02.2014, 12:59     Access violation reading location #2
попробуйте
C++
1
for(UINT i = 0; i <= numMipLevel; i++)
заменить на
C++
1
for(UINT i = 0; i < numMipLevel; i++)
NEvOl
12 / 11 / 0
Регистрация: 13.08.2012
Сообщений: 616
06.02.2014, 13:06  [ТС]     Access violation reading location #3
вроде нет выхода за границу, проверил
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
06.02.2014, 13:07     Access violation reading location #4
Вы попробовали заменить или что?
массив g_pMassTextures, как я понял имеет размер numMipLevel, тогда посл элемент там numMipLevel-1
NEvOl
12 / 11 / 0
Регистрация: 13.08.2012
Сообщений: 616
06.02.2014, 13:27  [ТС]     Access violation reading location #5
g_pMassTextures имеет размер numMipLevel + 1,
можно даже вот так вот записать:
C++
1
2
3
4
5
6
7
8
9
10
11
    for(UINT i = 0; i < g_pMassTextures.size(); i++)
    {
        D3D11_MAPPED_SUBRESOURCE ms;
        ZeroMemory(&ms, sizeof(ms));
        if(FAILED(g_pd3d11DeviceContext->Map(g_pMassTextures[i], 0, D3D11_MAP_READ, 0, &ms)))
            break;
        
        g_pd3d11DeviceContext->UpdateSubresource(textArray, D3D11CalcSubresource(0, i, 1), 0, ms.pData, ms.RowPitch, ms.DepthPitch);
 
        g_pd3d11DeviceContext->Unmap(g_pMassTextures[i], 0);
    }
т.к. g_pMassTextures - вектор, всеравно выскакиевает(

Добавлено через 14 минут
при попытке проверить содержимое переменных пишет:Error reading register value.
DrOffset
6426 / 3800 / 880
Регистрация: 30.01.2014
Сообщений: 6,594
06.02.2014, 13:28     Access violation reading location #6
Маловато кода для анализа. Если включить телепатию, то подозреваю, что проблема выходе за границу в textArray. Надо повыводить индексы D3D11CalcSubresource(0, i, 1) в лог перед передачей в функцию и проследить где идет выход за пределы.
NEvOl
12 / 11 / 0
Регистрация: 13.08.2012
Сообщений: 616
06.02.2014, 13:47  [ТС]     Access violation reading location #7
с индексами вроде все нормально, проверил, вот полный код:
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
D3DX11_IMAGE_LOAD_INFO ili;
    ZeroMemory(&ili, sizeof(ili));
    ili.BindFlags = 0;
    ili.Height = D3DX11_FROM_FILE;
    ili.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    ili.Width = D3DX11_FROM_FILE;
    ili.Depth = D3DX11_FROM_FILE;
    ili.FirstMipLevel = 0;
    ili.MipLevels = 1;
    ili.BindFlags = 0;
    ili.CpuAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
    ili.Usage = D3D11_USAGE_STAGING;
    ili.MiscFlags = 0;
    ili.Filter = D3DX11_FILTER_NONE;
    ili.MipFilter =  D3DX11_FILTER_NONE;
    ili.pSrcInfo = 0;
    
    ID3D11Resource *g_text;
    ID3D11Texture2D *pSrcText2D;
 
    if(FAILED(D3DX11CreateTextureFromFile(g_pd3d11Device, L"1.jpg", &ili, NULL, (ID3D11Resource**)&pSrcText2D, NULL)))
        return 0;
 
    
 
    int numMipLevel = CreateMipMap(pSrcText2D);
 
    D3D11_TEXTURE2D_DESC td;
    pSrcText2D->GetDesc(&td);
 
    ID3D11Texture2D *textArray = 0;
    D3D11_TEXTURE2D_DESC tdArray;
 
    ZeroMemory(&tdArray,sizeof(tdArray));
    tdArray.ArraySize = numMipLevel+1;
    tdArray.Format = td.Format;
    tdArray.Height = td.Height;
    tdArray.Width = td.Width;
    tdArray.CPUAccessFlags = 0;
    tdArray.MiscFlags = 0;
    tdArray.SampleDesc.Count = 1;
    tdArray.SampleDesc.Quality = 0;
    tdArray.Usage = D3D11_USAGE_DEFAULT;
    tdArray.BindFlags = D3D11_BIND_SHADER_RESOURCE;
    tdArray.MipLevels = td.MipLevels;
 
    if(FAILED(g_pd3d11Device->CreateTexture2D(&tdArray, NULL, &textArray)))
        return 0;
 
    for(UINT i = 0; i <= numMipLevel; i++)
    {
        D3D11_MAPPED_SUBRESOURCE ms;
        ZeroMemory(&ms, sizeof(ms));
        if(FAILED(g_pd3d11DeviceContext->Map(g_pMassTextures[i], 0, D3D11_MAP_READ, 0, &ms)))
            break;
    
        g_pd3d11DeviceContext->UpdateSubresource(textArray, D3D11CalcSubresource(0, i, 1), 0, ms.pData, ms.RowPitch, ms.DepthPitch);
 
        g_pd3d11DeviceContext->Unmap(g_pMassTextures[i], 0);
    }
функция
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
int CreateMipMap(ID3D11Texture2D *texture)
{
    D3D11_TEXTURE2D_DESC td;
 
    texture->GetDesc(&td);
 
    UINT width = td.Width;
    UINT height = td.Height;
 
    float numMipLevel = (int)(log10((float)width)/log10((float)2));
 
    if((int)(log10((float)height)/log10((float)2)) > numMipLevel)
        numMipLevel = (int)log10((float)height)/log10((float)2);
 
 
    
    numMipLevel = 1;//специально поставил ограничения пока что
    g_pMassTextures.push_back(texture);
 
 
    for(int i = 1; i <= numMipLevel; i++)
        g_pMassTextures.push_back(CreateTexture2D(g_pd3d11Device, g_pMassTextures[i-1]));
    
 
 
        
    return numMipLevel;
}
еще функция, подозреваю что именно в ней косяк:
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
ID3D11Texture2D* CreateTexture2D(ID3D11Device *pDevice, ID3D11Texture2D *srcText)
{
    D3D11_TEXTURE2D_DESC srcTD;//описание исходной текстуры
    srcText->GetDesc(&srcTD);
 
    UINT width = srcTD.Width/2;//ширина новой текстуры
    if(!width)
        width = 1;
    UINT height = srcTD.Height/2;//высота новой текстуры
    if(!height)
        height = 1;
    float stepU = srcTD.Width/(float)width;//ширина участка выборки цветов для новой текстуры
    float stepV = srcTD.Height/(float)height;//высота участка выборки цветов для новой текстуры
    float sUV = stepU*stepV;//площадь участка выборки цветов для новой текстуры
 
    int sizeVBox = ceil(stepV);//высота участва(количество текселей)
    int sizeUBox = ceil(stepU);//ширина участка(количество текселей)
    struct ColorTexels
    {
        XMCOLOR color;
        float weight;
        ColorTexels()
        {
            weight = 0;
        }
    };
    ColorTexels **colorBox = new ColorTexels*[sizeVBox];//участок старой текстуры с цветами
    for(int i = 0; i < sizeVBox; i++)
        colorBox[i] = new ColorTexels[sizeUBox];
 
    XMCOLOR *dstBuffTexels = new XMCOLOR[width * height];//буфер текселей новой текстуры
 
    D3D11_MAPPED_SUBRESOURCE ms;
    ZeroMemory(&ms, sizeof(ms));
 
    if(FAILED(g_pd3d11DeviceContext->Map(srcText, 0, D3D11_MAP_READ, 0, &ms)))
        return 0;
 
    XMCOLOR *srcBuffTexels = new XMCOLOR[srcTD.Width * srcTD.Height];//данные цветов исходной текстуры
    
    memcpy(srcBuffTexels, ms.pData, ms.RowPitch * srcTD.Height);
 
    g_pd3d11DeviceContext->Unmap(srcText, 0);
 
    for(int i = 0; i < height; i++)
        for(int j = 0; j < width; j++)
        {
            float bU = stepU * j;//определяем границы участка для выборки текселей из старой текстуры
            float eU = bU + stepU;
 
            float bV = stepV * i;
            float eV = bV + stepV;
 
            float sumU = bU, sumV = bV;
            float sU, sV;
            dstBuffTexels[width*i+j] = 0;
            
            for(int k = 0; k < sizeVBox; k++)
            {
                for(int q = 0; q < sizeUBox; q++)
                {
                    colorBox[k][q].color = srcBuffTexels[srcTD.Width*((int)bV+k) + (int)bU+q];//выбираем цвет пикселя из старой текстуры
                    
                    if((int)(bU+q) + 1 <= stepU + bU)
                        sU = (int)(bU+q) + 1 - sumU;//определяем ширину части пикселя в области выборки
                    else
                        sU = eU - (int)eU;
 
                    if((int)(bV+k) + 1 <= stepV+ bV)
                        sV = (int)(bV+k) + 1 - sumV;//определяем высоту части пикселя в области выборки
                    else
                        sV = eV - (int)eV;
 
                    sumU += sU;
 
                    colorBox[k][q].weight = (sU*sV)/sUV;//определяем "вес" пикселя
 
                }
                sumU = bU;
                sumV += sV;
            }
            for(int e = 0; e < sizeVBox; e++)
                for(int r = 0; r <sizeUBox; r++)
                {
                    colorBox[e][r].color.b *= colorBox[e][r].weight;
                    colorBox[e][r].color.r *= colorBox[e][r].weight;
                    colorBox[e][r].color.g *= colorBox[e][r].weight;
                    dstBuffTexels[width*i+j] = dstBuffTexels[width*i+j] + colorBox[e][r].color;
                }
             
        }
 
    delete  []srcBuffTexels;
 
    ID3D11Texture2D *text;
    
    D3D11_SUBRESOURCE_DATA sd;
    ZeroMemory(&sd, sizeof(sd));
    sd.pSysMem = (void*)dstBuffTexels;
    sd.SysMemPitch = width*4;
    sd.SysMemSlicePitch = width*height*4;
 
    D3D11_TEXTURE2D_DESC td;
    ZeroMemory(&td, sizeof(td));
    td.Width = width;
    td.Height = height;
    td.MipLevels = 1;
    td.ArraySize = 1;
 
    td.SampleDesc.Count = 1;
    td.SampleDesc.Quality = 0;
    td.Usage = D3D11_USAGE_STAGING;
    td.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    td.BindFlags = 0;
 
    td.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
    td.MiscFlags = 0;
 
    for(int i = 0; i < sizeVBox; i++)
            delete []colorBox[i];
    delete []colorBox;
 
    if(FAILED(pDevice->CreateTexture2D(&td, &sd, &text)))
    {
        delete []dstBuffTexels;
        return 0;
    }
    else
    {
        delete []dstBuffTexels;
        return text;
    }
}
Добавлено через 11 минут
т.е. получается что из загруженной текстуры он нормально данные считывает, а с той что сгенерирована с помощью CreateTexture2D не может считать данные
DrOffset
6426 / 3800 / 880
Регистрация: 30.01.2014
Сообщений: 6,594
07.02.2014, 00:08     Access violation reading location #8
Цитата Сообщение от NEvOl Посмотреть сообщение
вот полный код
В общем посмотрел код, хотел тебе вопросов позадавать наводящих, но что-то их слишком много получилось.
Вы под отладчиком код запускали, что он говорит?
А вообще, заочно тяжело диагностировать, хоть и можно попробовать телепатировать. Но гадать не хочется, если есть возможность можно прислать мне проект целиком, я посмотрю.

Добавлено через 59 минут
C++
1
2
3
XMCOLOR *srcBuffTexels = new XMCOLOR[srcTD.Width * srcTD.Height];//данные цветов исходной текстуры
    
memcpy(srcBuffTexels, ms.pData, ms.RowPitch * srcTD.Height);
Ну ладно, тогда буду телепатировать.
А вот тут размеры точно соотносятся? Не может ли тут ms.RowPitch * srcTD.Height в какой-то момент быть больше чем srcTD.Width * srcTD.Height? Из справки по D3D11_MAPPED_SUBRESOURCE, например, это не очевидно.
NEvOl
12 / 11 / 0
Регистрация: 13.08.2012
Сообщений: 616
07.02.2014, 05:59  [ТС]     Access violation reading location #9
ну по идее ms.RowPitch = srcTD.Width * 4 т.к. ms.RowPitch указывается в байтах

Добавлено через 7 минут
вроде все нормально ms.RowPitch * srcTD.Height = srcTD.Width * 4 * srcTD.Height

Добавлено через 6 минут
вот что лог выдает:
First-chance exception at 0x0FB120E9 (igd10umd32.dll) in Filtering.exe: 0xC0000005: Access violation reading location 0x0ABF8000.
Unhandled exception at 0x0FB120E9 (igd10umd32.dll) in Filtering.exe: 0xC0000005: Access violation reading location 0x0ABF8000.
DrOffset
6426 / 3800 / 880
Регистрация: 30.01.2014
Сообщений: 6,594
07.02.2014, 09:27     Access violation reading location #10
Цитата Сообщение от NEvOl Посмотреть сообщение
First-chance exception at 0x0FB120E9 (igd10umd32.dll) in Filtering.exe: 0xC0000005: Access violation reading location 0x0ABF8000.
Unhandled exception at 0x0FB120E9 (igd10umd32.dll) in Filtering.exe: 0xC0000005: Access violation reading location 0x0ABF8000.
Это все хорошо, но все-таки. Что говорит отладчик? Stack trace удалось получить? (я не про dx debug, хоть ее и надо использовать в отладочной сборке, я про отладчик в вашей IDE. Я так понимаю это Visual Studio).
NEvOl
12 / 11 / 0
Регистрация: 13.08.2012
Сообщений: 616
07.02.2014, 12:54  [ТС]     Access violation reading location #11
вот что выдает MVS
Миниатюры
Access violation reading location  
DrOffset
6426 / 3800 / 880
Регистрация: 30.01.2014
Сообщений: 6,594
07.02.2014, 14:03     Access violation reading location #12
Цитата Сообщение от NEvOl Посмотреть сообщение
вот что выдает MVS
Еще бы окошко Locals полностью заскринить. Но вообще похоже проблема в чтении из ms.pData.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2014, 14:53     Access violation reading location
Еще ссылки по теме:

ошибка Access violation reading location 0x00000066 C++
C++ Ошибка Access violation writing location
C++ Массивы указателей и ошибка Access violation reading location

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

Или воспользуйтесь поиском по форуму:
NEvOl
12 / 11 / 0
Регистрация: 13.08.2012
Сообщений: 616
07.02.2014, 14:53  [ТС]     Access violation reading location #13
в Locals данные недоступны(
Yandex
Объявления
07.02.2014, 14:53     Access violation reading location
Ответ Создать тему
Опции темы

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