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

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

Войти
Регистрация
Восстановить пароль
 
inhalesulfur
0 / 0 / 0
Регистрация: 30.06.2013
Сообщений: 6
#1

Нарушение прав доступа при записи - C++

30.06.2013, 07:15. Просмотров 411. Ответов 4
Метки нет (Все метки)

Пытаюсь написать класс, который бы выполнял инициализацию шрифта в directx и печатал строку на экран.
Написал рабочий вариант, где инициализация Direct3D и шрифтов происходит в одном классе, помогите, пожалуйста теперь разделить их по разным классам.

cFont.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma once
//-----------------------------------------------------------------------------------
// Инициализация шрифтов
//-----------------------------------------------------------------------------------
#include "../include/cGlobal.h"
#include "../include/cGraphics.h"
//-----------------------------------------------------------------------------------
class cFont
{
private:
    
    RECT            Rec;
    CGraphics*      cGraphics;          // Указатель на класс, инициализирующий устройство Direct3D
 
public:
    cFont();
    ~cFont();
    BOOL            InitFont();
    LPD3DXFONT      GetFont()   { return pFont; }
 
};
cFont.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "../include/cFont.h"
 
cFont::cFont()
{
    pFont               = NULL;
    hFont               = NULL;
};
cFont::~cFont()
{
    SAFE_RELEASE( pFont );
};
BOOL cFont::InitFont()
{
    // Создаем шрифт
    if(NULL == (hFont = CreateFont(30,10,0,0,FW_NORMAL,FALSE,FALSE,0,1,0,0,0,DEFAULT_PITCH | FF_MODERN,"Arial")))
        return FALSE;   
    // Инициализируем шрифт
    if(FAILED(D3DXCreateFont(cGraphics->GetDevice(),30,10,0,0,FALSE,1,0,0,DEFAULT_PITCH|FF_MODERN, "Arial", &pFont)))
        return FALSE;
     return TRUE;
};
при обращении к методу InitFont() в 15 строке выдает ошибку
Кликните здесь для просмотра всего текста
Необработанное исключение в "0x002cb083" в "LostDevice.exe": 0xC0000005: Нарушение прав доступа при записи "0xcdcdcdd1".


Никак не могу понять, почему метод класса не может записать значение в переменную hFont того же класса.
Пытаюсь вызвать его из другого класса, объявив указатель cFont* m_pFont; m_pFont->InitFont( );
Кому не сложно, напишите как должен выглядеть класс, из которого я вызываю InitFont();

Добавлено через 13 минут
В похожей теме нашел ответ, что проблема может быть в том, что не вызывается конструктор и соответственно не инициализируется переменная hFont, и действительно оказалось, что программа не заходит в тело конструктора. В чем может быть причина? Остальные конструкторы, тысячи их, вызываются автоматически ^.^
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2013, 07:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нарушение прав доступа при записи (C++):

Нарушение прав доступа при записи - C++
#include <iostream> void testfunc(char*& test) { test = 's'; } int main() { char* test = "Test";

Нарушение прав доступа при записи - C++
Привет всем! Извините за тупизм но у меня проблема. #include <iostream> using namespace std; void f(char* str) { int length =...

Нарушение прав доступа при записи - C++
Всем привет, нужно было сделать справочник, atoi(a) выделяет как ошибку, ЧЯДНТ? #include <iostream> #include <fstream> #include...

Нарушение прав доступа при записи - C++
Доброго времени суток всем! Перечитал много тем на форуме и в интернете. Никак не могу решить свою проблему. Мне нужно сравнить символ...

Нарушение прав доступа при записи - C++
void FilterStamp() { char ch; cout<<"Введите Да или Нет: "; scanf_s("%s",ch); cout<<endl; l1=first; while(l1!=0)...

Нарушение прав доступа при записи - C++
Создаю свой класс ошибок следующим образом: class SecureTransportException { private: SecureLibraryErrorCode errorCode_; ...

4
Croessmah
Эксперт CЭксперт С++
13411 / 7561 / 855
Регистрация: 27.09.2012
Сообщений: 18,611
Записей в блоге: 3
Завершенные тесты: 1
30.06.2013, 07:16 #2
Цитата Сообщение от inhalesulfur Посмотреть сообщение
В чем может быть причина?
как создается объект?
0
inhalesulfur
0 / 0 / 0
Регистрация: 30.06.2013
Сообщений: 6
30.06.2013, 07:23  [ТС] #3
Добавил вызов конструктора перед проблемной строкой, ошибка не исчезла =\

Добавлено через 5 минут
Цитата Сообщение от Croessmah Посмотреть сообщение
как создается объект?
Я просто создаю указатель на класс и через него обращаюсь к методу. Не создавая объектов. По крайней мере основные функции визуализации работают таким макаром.
0
Croessmah
Эксперт CЭксперт С++
13411 / 7561 / 855
Регистрация: 27.09.2012
Сообщений: 18,611
Записей в блоге: 3
Завершенные тесты: 1
30.06.2013, 07:28 #4
Цитата Сообщение от inhalesulfur Посмотреть сообщение
Я просто создаю указатель на класс и через него обращаюсь к методу. Не создавая объектов.
Нет объекта - нет вызова конструктора и нет переменных этого объекта!!!
А указатель можно хоть на валенки поставить, только валенки от этого не скатаются
0
inhalesulfur
0 / 0 / 0
Регистрация: 30.06.2013
Сообщений: 6
30.06.2013, 07:43  [ТС] #5
Цитата Сообщение от Croessmah Посмотреть сообщение
Нет объекта - нет вызова конструктора и нет переменных этого объекта!!!
А указатель можно хоть на валенки поставить, только валенки от этого не скатаются
Ясно.
Я пока плохо представляю себе структуру ООП.)

Допустим у меня есть класс cGraphics, отвечающий за подключение графического устройства. В нем есть переменная pDevice, содержащая адрес устройства, метод Init(), подключающий устройство и метод GetDevice(), возвращающий адрес устройства.
Потом в классе cApp я создаю объект класса cGraphics и подключаю устройство.
Выходит, чтобы обратиться к устройству из класса cFont я должен передать ему адрес объекта, объявленного в cApp, а не адрес класса сGraphics? И вызвать cApp->GetDevice(), чтобы получить устройство, а не cGraphics->GetDevice()?
Помогите вникнуть плз)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.06.2013, 07:43
Привет! Вот еще темы с ответами:

Нарушение прав доступа при записи - C++
Есть следующий код: class A { public: virtual someFuncA() = 0; }; class B : public A

Нарушение прав доступа при записи по адресу - C++
Нужно просуммировать двухмерный динамический массив. Если я ввожу a1 >= b1 то программа работает, а если ввожу a1< b1 например 1,3...

Нарушение прав доступа при записи по адресу - C++
Здрасте :) Такая задача, нужно генерировать 2d массив с входных параметров(размер). Я делаю так: Обьявление private:

Нарушение прав доступа при записи по адресу - C++
#include "stdafx.h" #include <iostream> #include <cstdlib> using namespace std; struct worker { char *fio; char *dolzh; ...


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

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

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