Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.51/37: Рейтинг темы: голосов - 37, средняя оценка - 4.51
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
1

Access violation reading location

06.02.2014, 12:55. Показов 7113. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Уважаемые знатоки, подскажите пожалуйста в чем проблема или хотя бы типовые причины возникновения, данного исключения (см. заголовок). На сколько я понимаю причина в том что пытаюсь прочитать данные в "закрытом" участке памяти.
вот сам код:
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 минут
как вообще исправлять такие ошибки ? а то пол дня маюсь толку нет, указывает адрес по которому не может произвести чтение, может как-то с помощью этого адреса можно найти объект который является причиной возникновения исключения и уже смотреть его ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.02.2014, 12:55
Ответы с готовыми решениями:

Access violation reading location
Помогите пожалуйста! Создаю программу, которая ведет учет данных. В бинарный dat-файл записываются...

Access violation reading location
добрый вечер , что может означать ошибка ? &quot;Exception thrown at 0x00B427CD in...

access violation reading location
access violation reading location такая проблема если вести информацию про двух и больше студентов...

ошибка Access violation reading location 0x00000066
Ошибка : Unhandled exception at 0x100e14cf (msvcr100d.dll) in 3.4.exe: 0xC0000005: Access violation...

12
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
06.02.2014, 12:59 2
попробуйте
C++
1
for(UINT i = 0; i <= numMipLevel; i++)
заменить на
C++
1
for(UINT i = 0; i < numMipLevel; i++)
0
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
06.02.2014, 13:06  [ТС] 3
вроде нет выхода за границу, проверил
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
06.02.2014, 13:07 4
Вы попробовали заменить или что?
массив g_pMassTextures, как я понял имеет размер numMipLevel, тогда посл элемент там numMipLevel-1
0
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
06.02.2014, 13:27  [ТС] 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.
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
06.02.2014, 13:28 6
Маловато кода для анализа. Если включить телепатию, то подозреваю, что проблема выходе за границу в textArray. Надо повыводить индексы D3D11CalcSubresource(0, i, 1) в лог перед передачей в функцию и проследить где идет выход за пределы.
0
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
06.02.2014, 13:47  [ТС] 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 не может считать данные
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
07.02.2014, 00:08 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, например, это не очевидно.
0
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
07.02.2014, 05:59  [ТС] 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.
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
07.02.2014, 09:27 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).
0
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
07.02.2014, 12:54  [ТС] 11
вот что выдает MVS
Миниатюры
Access violation reading location  
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
07.02.2014, 14:03 12
Цитата Сообщение от NEvOl Посмотреть сообщение
вот что выдает MVS
Еще бы окошко Locals полностью заскринить. Но вообще похоже проблема в чтении из ms.pData.
0
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
07.02.2014, 14:53  [ТС] 13
в Locals данные недоступны(
0
07.02.2014, 14:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.02.2014, 14:53
Помогаю со студенческими работами здесь

Массивы указателей и ошибка Access violation reading location
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; class Number { public: int...

Помогите с ошибкой Access violation reading location 0x1ed1d9f8.
Не могу разобраться с VS.... У меня был хороший, проверенный проект, в котором все хорошо работало...

Exception thrown at 0x77D75BCA (ntdll.dll): 0xC0000005: Access violation reading location 0x0000
Есть задача Есть решение Основное приложение: #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt;...

Ошибка Unhandled exception at 0x001EB509 in Gauss1.exe: 0xC0000005: Access violation reading location 0xCCCCCCD4
Программа должна генерировать и выводить на экран матрицу n x n. Однако, вылетает исключение:...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru