Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
 Аватар для TierX
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138

Использование указателя AP в main.cpp крашит приложение

02.09.2014, 16:38. Показов 2951. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
System.h
 
class System
{...};
 
static LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
 
static System *AP = NULL;
 
static void DrawScene();
C++
1
2
3
4
5
6
7
8
9
10
11
System.cpp
 
#include "System.h"
 
System::System()
{AP=this;}
 
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    return AP->MSG_Proc(hwnd, msg, wParam, lParam); // работает ок во всех случаях.
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
main.cpp
 
#include "System.h"
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow)
{...}
 
void DrawScene()
{
    float bgColor[4] = { 0.1f, 0.3f, 0.4f, 0.7f };
    AP->m_11Context->ClearRenderTargetView(AP->m_RenderTarget_View, bgColor);   
    AP->m_11Context->ClearDepthStencilView(AP->m_DepthStencil_View, D3D11_CLEAR_DEPTH|
D3D11_CLEAR_STENCIL, 1.0f, 0);
 
    // Present as fast as possible.
    AP->m_11SwapChain->Present(0, 0);
 
Необработанное исключение по адресу 0x01115D1B в MDX11.exe: 0xC0000005:
нарушение прав доступа при чтении по адресу 0x00000008. Везде где применяеться AP.
 
}
Вобщем беда. Почему-то использование указателя AP в main.cpp крашит (хотя компаил ОК).
Если переношу определение конструктора класа в main.cpp AP - пашет. Причём AP пашет и в System.cpp где уже соответственно отсутствует определение конструктора класа.
Ваще магия.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.09.2014, 16:38
Ответы с готовыми решениями:

Main.cpp: In function ‘int main()’: main.cpp:10:1: error: ‘then’ was not declared in this scope
Написал программу и выдает ошибку. #include <iostream> #include <math.h> using namespace std; int main() {double a, b, x; ...

Main.cpp In file included from main.cpp
//class.cpp #include "class.h" Ticket::Ticket() { prise = 0; marshrut = "none"; time = "none"; ...

Есть три файла. файл main.cpp и Source.cpp знают только Header.h, так как он подключен. как же подключается Source.cpp
main.cpp #include <iostream> #include"Header.h" using namespace std; int main() { A ob; ob.f(); return...

33
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
02.09.2014, 21:29
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от TierX Посмотреть сообщение
DrOffset, MainWndProc используеться когда после открытия окна я жму Esc и окно закрывается. при этом идет сообщение WM_QUIT в MainWndProc так как она обозначена оконной процедурой обработки сообщений при созданиии окна. Которая в свою очередь через AP указатель прередает ее в MSG_Proc (функцию класа).
Где она используется-то? Эту функцию надо где-то зарегистрировать, чтобы она начала вызываться. В твоем коде никакой регистрации я не вижу. Просто объявить ее недостаточно.
Цитата Сообщение от TierX Посмотреть сообщение
Одна и таже адреса во всех вызовах всех файлов идентичны конкретно в одном запуске 0x004df88c во всех трех файлах.
100% неправильно смотришь.
0
 Аватар для TierX
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138
02.09.2014, 21:30  [ТС]
Точнее идет сообщение о нажатии Esc а потом разрушение окна.
Вот регистрация
C++
1
2
3
4
5
6
7
8
9
10
11
bool System::Init_Win()
{
//
    //  W I N D O W
    ///////////////
 
    WNDCLASS wc;
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = MainWndProc; 
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
На счет адреса щас даже скрины запилю . Может я правда неправильно смотрю...
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
02.09.2014, 21:31
TierX, или ты опять сбросил неполный код.
0
 Аватар для TierX
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138
02.09.2014, 21:40  [ТС]
[cut]
блин чото ссылка на картинку не хочет поститься

 Комментарий модератора 
Специально.
Чтобы загрузить изображение на форум воспользуйтесь вот этой рекомендацией: Расширенный режим.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
02.09.2014, 21:44
Лучший ответ Сообщение было отмечено TierX как решение

Решение

Цитата Сообщение от TierX Посмотреть сообщение
wc.lpfnWndProc = MainWndProc;
Ага, ну вот. А в исходном варианте этого не было. Телепаты в отпусках все.

Окей, новые вводные. Функция вызывается.
Идем дальше. Глобальные статические переменные всегда инициализируются нулем по умолчанию.
В С++ вот такая запись:
C++
1
((SomeClass*)0)->someMethod();
скорее всего не будет приводить к ошибке до тех пор, пока в этом самом someMethod не будет обращения к каким либо данным SomeClass.
В общем, чтобы получить падение, просто обратись из MSG_Proc к каким-либо данным класса.
Чистой воды UB.
1
 Аватар для TierX
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138
02.09.2014, 21:57  [ТС]
DrOffset, Ага лягло. А как мне правильно глянуть адреса одновременно в разных частях кода тогда? потому что так видимо не правильно...
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
02.09.2014, 22:01
Цитата Сообщение от TierX Посмотреть сообщение
А как мне правильно глянуть адреса одновременно в разных частях кода тогда? потому что так видимо не правильно...
Ну в этом случае я бы просто вывел его в лог-файл. Значение &AppHandle из MainWndProc и из WinMain. Я в студии и под виндой обычно не работаю, поэтому ничего более умного не подскажу.
1
 Аватар для TierX
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138
02.09.2014, 22:17  [ТС]
ща попробую консоль подключить

Добавлено через 15 минут
Да адреса разные. Теперь уже сходиться с реальностью все. Но эта проблема как оказалось не в обычном статик итд а в этом :

Код C++
1 ((SomeClass*)0)->someMethod();

Уж почему так происходит я не прошу пояснять. Потому что, я не понимаю , что тут даже написано . Разыменованый Нуль как указатель на клас ? Но в принципе по своему примеру какуето логику уже наблюдаю...
Короче я напоролся на какойто странный случай. + Я еще лашпед не умею смотреть адреса в студии.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
02.09.2014, 22:25
Цитата Сообщение от TierX Посмотреть сообщение
Но эта проблема как оказалось не в обычном статик итд а в этом
Нет не в этом - это только следствие. Если ты так думаешь, значит ты ничего не понял. Иди еще раз читай мой большой пост про связывание и компиляцию в С++. Я серьезно
И убери ради бога все статик перед функциями и классами, иной компилятор такое вообще не обязан компилировать.

Цитата Сообщение от TierX Посмотреть сообщение
Потому что, я не понимаю , что тут даже написано
Я все-таки объясню. У тебя произошло ровно тоже самое. Это просто сокращенный пример.
Хочешь вот так напиши:
C++
1
2
SomeClass * p = 0;
p->someMethod();
Цитата Сообщение от TierX Посмотреть сообщение
Короче я напоролся на какойто странный случай
Простое правило: не уверен досконально в назначении той или иной возможности языка - не используй или разбирайся.
1
 Аватар для TierX
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138
03.09.2014, 01:21  [ТС]
так я вот и разбираюсь)

Добавлено через 7 минут
Пост я читал и в принципе я знал об этом .Збило с толку то , что это работало при вынесении конструктора. При этом адреса свопадали (хотя как я уже говорил просто я не правильно их выявлял ). Поэтому я говорю что для меня тут больше это роль сыграло. Код со статиками не мой а взятый с растертека . Я думаюю он использовал статики для того чтоб эти функции работали только в одном файле.
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
03.09.2014, 14:52
Цитата Сообщение от TierX Посмотреть сообщение
Но я то не инициализирую 2 раза указатель в cpp
Я тоже не инициализирую указатель 2 раза. (Иначе программу не удалось бы скомпилировать - я получил бы ошибку "error C2374: переопределение; множественная инициализация".)

TierX, что будет на экране в след. примере? Что изменится, если определение construct() перенести в main.cpp?

head.h
C++
1
2
3
4
// head.h 
static long p = 0;
void construct();
void example();
main.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// main.cpp
#include "head.h "
int main()
{
    std::cout << "\n\n main() :    ";
    std::cout <<  "     p : " << p << std::endl;
 
    construct();  // создаём 
    std::cout <<  "     p : " << p << std::endl; // что получилось? 
 
    example();  // попробуем использовать ... 
 
    system("pause");
    return 0;
}


test.cpp
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// test.cpp 
#include "head.h "
 
void construct() 
{
    p = 34567;
}
 
void example()
{
    std::cout << "\n\n example():   ";
    std::cout <<  "     p : " << p << std::endl;
}
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
03.09.2014, 14:59
Alex5, я извиняюсь, что влезаю, но проблему мы уже разобрали. Посмотри предыдущие ответы. У него все работало стандартно, было две переменные вкаждой единице трансляции, при переносе конструктора, переменная (указатель) в main.cpp работала штатно, а указатель, в system.cpp равнялся нулю, но из-за того, что вызывался метод класса, который вообще не обращается ни к каким данным класса, фактического разыменования нуля не происходило, и программа не падала. Т.е. это была лишь иллюзия работы.
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
03.09.2014, 15:53
Цитата Сообщение от DrOffset Посмотреть сообщение
У него все работало стандартно, было ..., а указатель, ... равнялся нулю, но ... это была лишь иллюзия работы.
Цитата Сообщение от DrOffset Посмотреть сообщение
но проблему мы уже разобрали. Посмотри предыдущие ответы
DrOffset, для кого Вы это написали? Мне это понятно. Как я могу судить по Вашим сообщениям и приведённой Вами ссылке , Вам тоже вполне ясно, в чём была проблема.

DrOffset, я читал предыдущие ответы. Код, приведённый в моём ответе - иллюстрация к обсуждению.
Цитата Сообщение от Tulosba Посмотреть сообщение
C++
1
static System *AP = NULL;
Т.е. такая запись в *.h файле и включение этого файла в несколько *.cpp приводит к созданию РАЗНЫХ переменных. AP в main.cpp и AP в system.cpp не одно и то же.
Цитата Сообщение от DrOffset Посмотреть сообщение
TierX, дам что ли еще раз эту ссылку. Чтобы хоть магия рассеялась немного
Цитата Сообщение от TierX Посмотреть сообщение
Но всетаки непонятно почему static пашет если конструктор в main.cpp перенести.
Цитата Сообщение от Denno Посмотреть сообщение
Уже писали.
Цитата Сообщение от TierX Посмотреть сообщение
переменная AP становиться одна и таже когда переносиш конструктор в другой cpp.
Цитата Сообщение от DrOffset Посмотреть сообщение
Не становится она одна и та же ...
Цитата Сообщение от DrOffset Посмотреть сообщение
Я все-таки объясню. У тебя произошло ровно тоже самое. Это просто сокращенный пример.
Хочешь вот так напиши:
C++
1
2
SomeClass * p = 0;
p->someMethod();
Цитата Сообщение от TierX Посмотреть сообщение
так я вот и разбираюсь)
0
03.09.2014, 16:07

Не по теме:

Цитата Сообщение от Alex5 Посмотреть сообщение
для кого Вы это написали? Мне это понятно.
Было не вполне ясно, что это так. Сложилось впечаление, что ответ был написан сразу же на возражение ТС без прочтения остальной ветки, поэтому мне показалось не лишенным смысла указать, что ТС вроде как уже разобрался и задавать ему наводящие вопросы уже не нужно. Если какой-то план испортил этим замечанием, то, необессудь, не хотел ничего плохого.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.09.2014, 16:07

Как передать переменные и массивы из main.cpp в mainwindow.cpp?
Как передать переменные и массивы из main.cpp в mainwindow.cpp? main.cpp #include &quot;mainwindow.h&quot; #include &lt;QApplication&gt; ...

Включение библиотек в main.cpp и my_func.cpp
Здравствуйте, Подскажите пожалуйста, ни как не могу понять, вот если: //main.cpp #include &lt;iostream&gt; int main() ...

Подключение файлов main.cpp some.cpp some.h
Всем привет, программа разделенна на три файла poly.cpp main.cpp poly.h Кто мог бы объяснить как происходит подключение этих файлов, и как...

Вот: source_file.cpp: In function 'int main()': source_file.cpp:10:12: error: 'strlen' was not declared in this scope
#include&lt;iostream&gt; using namespace std; int main() { char a,b; int i,j; cout&lt;&lt;&quot;Напишите слово:&quot;; cin&gt;&gt;a; i=0; ...

DownloadString крашит приложение
Всем привет! Уже прошло очень много времени но я так и не понял из за чего у некоторых людей данная функция крашит приложение. Моим...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru