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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.73
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 726
#1

Access violation reading location - C++

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

Уважаемые знатоки, подскажите пожалуйста в чем проблема или хотя бы типовые причины возникновения, данного исключения (см. заголовок). На сколько я понимаю причина в том что пытаюсь прочитать данные в "закрытом" участке памяти.
вот сам код:
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 минут
как вообще исправлять такие ошибки ? а то пол дня маюсь толку нет, указывает адрес по которому не может произвести чтение, может как-то с помощью этого адреса можно найти объект который является причиной возникновения исключения и уже смотреть его ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2014, 12:55     Access violation reading location
Посмотрите здесь:

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

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

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

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

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

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

Ошибка: Unhandled exception at 0x772115de in TimeShift.exe: 0xC0000005: Access violation reading location 0x00041000. - C++
всем привет! При использовании двумерного массива постоянно появляется ошибка :Unhandled exception at 0x772115de in TimeShift.exe:...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aLarman
642 / 563 / 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
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 726
06.02.2014, 13:06  [ТС]     Access violation reading location #3
вроде нет выхода за границу, проверил
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
06.02.2014, 13:07     Access violation reading location #4
Вы попробовали заменить или что?
массив g_pMassTextures, как я понял имеет размер numMipLevel, тогда посл элемент там numMipLevel-1
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 726
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
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
06.02.2014, 13:28     Access violation reading location #6
Маловато кода для анализа. Если включить телепатию, то подозреваю, что проблема выходе за границу в textArray. Надо повыводить индексы D3D11CalcSubresource(0, i, 1) в лог перед передачей в функцию и проследить где идет выход за пределы.
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 726
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
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
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
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 726
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
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
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
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 726
07.02.2014, 12:54  [ТС]     Access violation reading location #11
вот что выдает MVS
Миниатюры
Access violation reading location  
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
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"? - C++
Ситуация такая что имеется функция которая вызывается в цикле около 1 млн. раз, в какой-то из итераций выскакивает исключение &quot;access...

Access violation writing location - C++
Вылетает эта ошибка. В чём может быть проблема? Программа выполняется выводит результат, а после вылетает исключение. #include...

Access violation writing location - C++
#include &lt;iostream&gt; using namespace std; template &lt; typename t &gt; void QuickSort( t array, int left,int right) { int i = left; ...

Access violation writing location - C++
Добрый день! на строке ptr = ptr; бросает unhandeled exeption: Access violation writing location, не пойму почему, может уже туплю....

Ошибка Access violation writing location - C++
Структура и объявление массива: struct Particle { float X; float Y; float Dx; float Dy; float R; int SegCount; ...


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

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

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