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

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

Войти
Регистрация
Восстановить пароль
 
Progers
New to C++
83 / 44 / 5
Регистрация: 14.01.2013
Сообщений: 258
#1

Ошибка с пустыми указателями - C++

30.06.2014, 23:35. Просмотров 274. Ответов 2
Метки нет (Все метки)

Здравствуйте! Пытаюсь написать простую игру, используя библиотеку SDL.
Написал отдельный класс для загрузки текстур, и внёс туда вот такой код:
Это заголовок
Кликните здесь для просмотра всего текста
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
#pragma once
 
#include <string>
#include <vector>
class LoadMedia
{
private:
    //DATA
    std::string Path;
    bool success = true;
    std::vector<SDL_Texture*> Texture_Container;
 
    //Functions
    void Free();
    void ImageInit();
    void PushTextureToContainer();
    bool LoadSurface();
    bool CreateTexture();
    //SDL
    SDL_Surface* MainSurface = nullptr;
    SDL_Texture* MainTexture = nullptr;
    SDL_Texture* Temp_Texture = nullptr;
    SDL_Renderer* LocalRender = nullptr;
public:
    
    LoadMedia();
    ~LoadMedia();
 
    void PushTexture(std::string Surface_Path);
    void GetRenderer(SDL_Renderer* MainRender);
    
    //SDL
    SDL_Texture* Get_Texture(int Texture_Index);
};

И реализация
Кликните здесь для просмотра всего текста
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
#include "stdafx.h"
#include "LoadMedia.h"
 
 
LoadMedia::LoadMedia()
{
    Texture_Container.resize(10);
}
 
 
LoadMedia::~LoadMedia()
{
    Free();
}
 
void LoadMedia::PushTexture(std::string Path_To_Surface)
{
    Path = Path_To_Surface;
    if (!LoadSurface())
    {
        std::cerr << "Failed to push texture at LoadSurface" << std::endl;
    }
    else if (!CreateTexture())
    {
        std::cerr << "Failed to push texture at CreateTexture" << std::endl;
    }
}
 
void LoadMedia::ImageInit()
{
    if (IMG_Init(IMG_INIT_PNG) < 0)
    {
        std::cerr << "Could not Init PNG! " << IMG_GetError() << std::endl;
 
    }
    else
    {
        std::cout << "PNG Init Success!" << std::endl;
    }
}
 
void LoadMedia::PushTextureToContainer()
{
    Texture_Container.push_back(MainTexture);
}
 
void LoadMedia::Free()
{
    SDL_DestroyTexture(MainTexture);
    SDL_DestroyTexture(Temp_Texture);
    SDL_FreeSurface(MainSurface);
    
    MainTexture = nullptr;
    Temp_Texture = nullptr;
    MainSurface = nullptr;
}
 
void LoadMedia::GetRenderer(SDL_Renderer* MRender)
{
    LocalRender = MRender;
    if (LocalRender == NULL)
    {
        std::cerr << "ERROR! Could not import MainRender to LocalRender" << std::endl;
    }
}
 
bool LoadMedia::LoadSurface()
{
    MainSurface = IMG_Load(Path.c_str());
    if (MainSurface == NULL)
    {
        std::cerr << "Could not load surface! " << SDL_GetError() << std::endl;
        success = false;
    }
    return success;
}
 
bool LoadMedia::CreateTexture()
{
    MainTexture = SDL_CreateTextureFromSurface(LocalRender, MainSurface);
    if (MainTexture == NULL)
    {
        std::cerr << "Could not create texture from surface! " << SDL_GetError << std::endl;
        success = false;
    }
    else
    {
        PushTextureToContainer();
        Free();
    }
    return success;
}
 
SDL_Texture* LoadMedia::Get_Texture(int Texture_Index)
{
    Free();
    Temp_Texture = Texture_Container[Texture_Index];
    if (Temp_Texture == NULL)
    {
        std::cerr << "Could not Get_Texture with Index " << Texture_Index << std::endl;
        return NULL;
    }
    else
    {
        return Temp_Texture;
    }
}

И другой класс для инициализации SDL.
Заголовок
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#pragma once
 
class Game
{
private:
 
 
    bool success = true;
    SDL_Window* MainWindow = nullptr;
public:
    Game();
    ~Game();
 
    //Data
    const int SCREEN_WIDTH = 600, SCREEN_HEIGHT = 800;
    SDL_Renderer* MainRender = nullptr;
    SDL_Event event;
    //Functions
    bool Game_Init();
    int Game_Quit();
};

Реализация
Кликните здесь для просмотра всего текста
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
#include "stdafx.h"
#include "Game.h"
 
 
Game::Game()
{
}
 
 
Game::~Game()
{
}
 
bool Game::Game_Init()
{
    if (SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        std::cerr << "Could not init video! " << SDL_GetError << std::endl;
        success = false;
    }
    else
    {
        MainWindow = SDL_CreateWindow("SecondGame(Rewrite)", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
        if (MainWindow == NULL)
        {
            std::cerr << "Could not create MainWindow! " << SDL_GetError() << std::endl;
            success = false;
        }
        else
        {
            MainRender = SDL_CreateRenderer(MainWindow, -1, SDL_RENDERER_ACCELERATED);
            if (MainRender == NULL)
            {
                std::cerr << "Could not create MainRender! " << SDL_GetError() << std::endl;
                success = false;
            }
            
        }
    }
    return success;
}
 
int Game::Game_Quit()
{
    SDL_DestroyWindow(MainWindow);
    SDL_DestroyRenderer(MainRender);
    MainWindow = nullptr;
    MainRender = nullptr;
    SDL_Quit();
    exit(0);
    return 0;
}

Как я думаю этого кода достаточно, но всё таки чтобы не засорять тему, дам на всякий случай ссылку на гитхаб:
Так вот, проблема заключается в том, что после того как MainRender берёт адрес из SDL_CreateRender() он берёт именно 0xcccccccc но по моим наблюдениям, в других проектах он другие берёт адреса.
Передача MainRender в класс LoadMedia происходит через класс GameOBJ
Заголовок:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#pragma once
#include "Game.h"
#include "LoadMedia.h"
class GameOBJ : protected Game
{
protected:
    LoadMedia LoadTextures;
    enum {MainCharcter,MainMap};
public:
    GameOBJ();
    ~GameOBJ();
    
    void InitTextures();
    void HandleEvent();
};

И реализация:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "stdafx.h"
#include "GameOBJ.h"
 
 
GameOBJ::GameOBJ()
{
}
 
 
GameOBJ::~GameOBJ()
{
}
 
void GameOBJ::InitTextures()
{
    LoadTextures.GetRenderer(Game::MainRender);
}

C++
1
LoadTextures.GetRenderer(Game::MainRender);
В этом месте MainRender почему то берёт нулевой адрес, то есть он становится пустым из 0xcccccccc в 0x00000000
Вопрос заключается в том, почему он берёт 0xcccccccc и почему превращается в 0x00000000?
Уже мучаюсь с ним 2-й день, не как не могу понять, в чём причина.

Добавлено через 1 час 17 минут
Решил проблему, путём создания объекта от класса GameOBJ, и взятием рендера оттуда.
Я просто думал, можно это реализовать путём наследования
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.06.2014, 23:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка с пустыми указателями (C++):

Ошибка с указателями - C++
Рад снова всех приветствовать. У меня появилась небольшая проблема. Изучаю C++ по книге Р. Лафоре &quot;ООП в C++&quot;. Так вот, в принципе, книга...

ошибка с указателями - C++
программа должна менять буквы местами в каждом слове введенной строки через указатели я все написал все работает, но есть большое НО,...

ошибка с указателями - C++
надо создать двусвязный список! во второй строке ошибка, как от неё избавиться? pt-&gt;prev=pg; pg-&gt;next=pt; pg=pt;

Ошибка с указателями - C++
Похоже у меня проблема с указателями, но что то я жутко торможу и не соображу как правильно сделать. Как минимум в 44 строке ошибка. ...

Непонятная ошибка с указателями - C++
Что можно с ними сделать? Не пойму // узел template&lt;typename T&gt; struct T_Node { T m_value; // значение ...

Знакомство с указателями. Синтаксическая ошибка. - C++
Доброго дня! В качестве учебного пособия использую &quot;С++ для чайников&quot; Тема: первое знакомство с указателями С++, ст.89 //Layout...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DrOffset
7141 / 4282 / 965
Регистрация: 30.01.2014
Сообщений: 7,084
01.07.2014, 17:18 #2
Цитата Сообщение от Progers Посмотреть сообщение
Вопрос заключается в том, почему он берёт 0xcccccccc и почему превращается в 0x00000000?
Game_Init() у GameOBJ не вызывается. По крайней мере в приведенном коде его не видно. Поэтому ноль.

Добавлено через 1 минуту
Цитата Сообщение от Progers Посмотреть сообщение
Я просто думал, можно это реализовать путём наследования
Я смутно догадываюсь что ты хотел получить. Мне кажется, ты неправильно понимаешь наследование.
0
Progers
New to C++
83 / 44 / 5
Регистрация: 14.01.2013
Сообщений: 258
02.07.2014, 01:37  [ТС] #3
DrOffset, Спасибо, но я уже 2 дня назад как решил эту проблему
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2014, 01:37
Привет! Вот еще темы с ответами:

MSVS ошибка setlocale при работе с указателями на массивы - C++
Ниже код, пытаюсь нарисовать умножение матриц. До самого умножения еще не дошел, пока только на заполнении матриц и вывод их на экран....

Вывести содержимое текстового файла с пустыми строками - C++
Задан текстовый файл с пустыми строками. Вывести содержимое файла с пустыми строками

Можно ли заполнить массив типа int пустыми значениями? - C++
.....

Контейнер с указателями на... - C++
Можно ли создать контейнер с указателями на функции, и если да, то как можно вызывать эти функции? Все функции с одим аргументом.


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

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