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

Функция get() не возвращает значение - C++

Восстановить пароль Регистрация
 
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
17.09.2013, 17:41     Функция get() не возвращает значение #1
Есть класс, в котором определен объект типа SDL_Surface*.
Пытаюсь передать его в сторонний класс с помощью метода getScreen(),
но он по неизвестной причине не передается

Файл A.h:
C++
1
2
3
4
5
6
class A {
    SDL_Surface* getScreen() { return screen; }
    blittingImage(int, int, SDL_Surface*, SDL_Surface*);
  private:
    SDL_Surface* screen;
};
Файл B.h:
C++
1
2
3
4
5
6
class B {
  public:
    void drawScene();
  private:
    SDL_Surface* image;
};
Файл B.cpp
C++
1
2
3
4
5
6
7
8
#include "A.h"
#include "B.h"
void A::drawScene() {
    B object;
    object.blittingImage(0, 0, image, object.getScreen());
    if(object.getScreen() == NULL)
        SDL_WM_SetCaption("Test", NULL);    // Выводит "Test"
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.09.2013, 19:44     Функция get() не возвращает значение #2
а где инициализация image/sreen?

Цитата Сообщение от dimakozyr Посмотреть сообщение
C++
1
2
3
B object;
* * object.blittingImage(0, 0, image, object.getScreen());
* * if(object.getScreen() == NULL)
у класса В вообще нет метода getScreen
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
17.09.2013, 19:53  [ТС]     Функция get() не возвращает значение #3
Инициализация есть и проходит нормально, протестировал.
Не стал включать, чтобы не усложнять пример.

Цитата Сообщение от Jupiter Посмотреть сообщение
у класса В вообще нет метода getScreen
Сорри, ошибся

Файл A.h:
C++
1
2
3
4
5
6
class A {
    SDL_Surface* getScreen() { return screen; }
    blittingImage(int, int, SDL_Surface*, SDL_Surface*);
  private:
    SDL_Surface* screen;
};
Файл B.h:
C++
1
2
3
4
5
6
class B {
  public:
    void drawScene();
  private:
    SDL_Surface* image;
};
Файл B.cpp
C++
1
2
3
4
5
6
7
8
#include "A.h"
#include "B.h"
void B::drawScene() {     // Ошибка была здесь
    A object;                   // и здесь
    object.blittingImage(0, 0, image, object.getScreen());
    if(object.getScreen() == NULL)
        SDL_WM_SetCaption("Test", NULL);    // Выводит "Test"
}
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
18.09.2013, 23:22  [ТС]     Функция get() не возвращает значение #4
Есть переменная SDL_Surface* screen. Она почему-то не передается в функцию, не пойму почему.

Файл C_DrawScene_1.h:
C++
1
2
3
4
5
6
7
#include "SDL.h"
class C_DrawScene_1 {
  public:
      void scene_1_draw();
  private:
      SDL_Surface* img_background_1;
};
Файл C_DrawScene_1.cpp:
C++
1
2
3
4
5
6
7
#include "C_DrawScene_1.h"
#include "C_Scenes.h"
C_Scenes o_scenesC_DrawScene_1;
void C_DrawScene_1::scene_1_draw() {
    if(o_scenesC_DrawScene_1.getScreen() == NULL)
        SDL_WM_SetCaption("222", NULL);              // Здесь значение истинно, т.е. screen не передается
}
Файл C_Scenes.h:
C++
1
2
3
4
5
6
7
8
9
#include "SDL.h"
#include "C_Button.h"
class C_Scenes {
  public:     
      inline SDL_Surface* getScreen() { return screen; }      // Здесь screen почему-то не возвращается
          inline void setScreen(SDL_Surface* variable) { screen = variable; }  
  private:        
      SDL_Surface* screen;
};
Файл C_MainClass.cpp
C++
1
2
3
4
#include "C_DrawScene_1.h"
void C_MainClass::initSDL() {    
    o_scenes.setScreen(SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE)); // Здесь инициализируется тот самый screen
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.09.2013, 00:00     Функция get() не возвращает значение #5
Кода мало.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
19.09.2013, 00:01     Функция get() не возвращает значение #6
Ты уверен, что SDL_SetVideoMode возвращает не NULL ?
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
19.09.2013, 00:42  [ТС]     Функция get() не возвращает значение #7
Цитата Сообщение от castaway Посмотреть сообщение
Ты уверен, что SDL_SetVideoMode возвращает не NULL ?
Да, только что на всякий случай протестил

Цитата Сообщение от alsav22 Посмотреть сообщение
Кода мало.
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
19.09.2013, 00:47  [ТС]     Функция get() не возвращает значение #8
Цитата Сообщение от castaway Посмотреть сообщение
Ты уверен, что SDL_SetVideoMode возвращает не NULL ?
Да, только что на всякий случай протестил

Цитата Сообщение от alsav22 Посмотреть сообщение
Кода мало.
Если скажете, чего именно не хватает, добавлю, на всякий случай выложил весь проект
Вложения
Тип файла: 7z Bober.7z (1.61 Мб, 4 просмотров)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.09.2013, 01:35     Функция get() не возвращает значение #9
У вас, в этом объекте: C_Scenes o_scenesC_DrawScene_1, screen не инициализирован.

C++
1
2
3
4
#include "C_DrawScene_1.h"
void C_MainClass::initSDL() {    
    o_scenes.setScreen(SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE)); // Здесь инициализируется тот самый screen
}
Тут не этот screen инициализируется, а тот, который находится в объекте C_MainClass::o_scenes.
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
19.09.2013, 08:38  [ТС]     Функция get() не возвращает значение #10
Цитата Сообщение от alsav22 Посмотреть сообщение
Тут не этот screen инициализируется, а тот, который находится в объекте C_MainClass::o_scenes.
В смысле не этот? Он у меня всего один в программе объявлен. При старте программы появляется черное окно, это говорит о том, что screen проинициализирован.

А вот в функции void C_DrawScene_1::scene_1_draw() функция o_scenesC_DrawScene_1.getScreen() почему-то работает неправильно. Она должна на плоскость screen загружать другие изображения.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.09.2013, 09:18     Функция get() не возвращает значение #11
не дублируй темы
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.09.2013, 11:21     Функция get() не возвращает значение #12
Цитата Сообщение от dimakozyr Посмотреть сообщение
В смысле не этот? Он у меня всего один в программе объявлен.
В прямом смысле. Где вы его объявляете? Это поле класса C_Scenes, которое инициализируется нолём при создании объектов этого класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class C_Scenes: protected C_Button {
 
  public:
      
      C_Scenes() : img_background_3(0), screen(0) {} // инициализация screen нолём
 
      void loadImages();
      void cleanMemory();
      void blittingImage(int, int, SDL_Surface*, SDL_Surface*);
      void keyEvents();
      void sceneDraw_3();
      void sceneDraw_4();
 
      inline SDL_Surface* getScreen()              { return screen; }
      inline void setScreen(SDL_Surface* variable) { screen = variable; }  
      
  private:
          
      SDL_Surface* img_background_3;
      SDL_Surface* screen;  // вот он
};
Один объет этого класса создаётся при создании объекта класса C_MainClass, в начале работы программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class C_MainClass {
 
  public:
 
      C_Scenes o_scenes; // тут есть screen, который будет инициализирован нолём при создании объекта
          
      void initSDL();
      void startAllMethods();  
 
  private:
          
      enum {_screenWidth     = 960,
            _screenHeigth    = 640,
            _screenColorBits = 32};
};
Потом, при вызове метода startAllMethods(), в котором делается вызов initSDL(), полю screen этого объекта (o_scenes) присваивается значение:
C++
1
2
3
4
C_MainClass::initSDL() {    
    SDL_Init(SDL_INIT_EVERYTHING);
    o_scenes.setScreen(SDL_SetVideoMode(_screenWidth, _screenHeigth, 
                                        _screenColorBits, SDL_SWSURFACE));
Кроме этого объекта (в классе C_MainClass), у вас, в файле C_DrawScene_1.cpp, объявлен глобальный объект класса C_Scenes, по имени o_scenesC_DrawScene_1, в котором тоже есть screen, инициализируемый нолём, при создании этого объекта:
C++
1
2
3
4
5
6
#include "C_DrawScene_1.h"
#include "C_Scenes.h"
#include "C_Button.h"
 
C_Scenes o_scenesC_DrawScene_1;
...
Но screen этого объекта так и остаётся равен NULL.
Потом в методах, в файле C_DrawScene_1.cpp, происходит попытка обращения по нулевому указателю:
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
void C_DrawScene_1::scene_1_events() {
    C_Button o_buttonC_DrawScene_1;
 
    C_Button o_button_1_play    (150, 100, 650, 218);
    C_Button o_button_1_sound   (200, 400, 106, 106);
    C_Button o_button_1_facebook(400, 400, 106, 106);
    C_Button o_button_1_twitter (600, 400, 106, 106);
    scene_1_loadImages();
    int isCicleEnd = 0;
    while(isCicleEnd == 0)
        if(SDL_PollEvent(&o_buttonC_DrawScene_1.getEvent())) {
            o_button_1_play.    buttonEvents(&o_buttonC_DrawScene_1.getEvent(), 0);
            o_button_1_sound.   buttonEvents(&o_buttonC_DrawScene_1.getEvent(), 1);
            o_button_1_facebook.buttonEvents(&o_buttonC_DrawScene_1.getEvent(), 2);
            o_button_1_twitter. buttonEvents(&o_buttonC_DrawScene_1.getEvent(), 3);
            
            if(o_buttonC_DrawScene_1.getEvent().type == SDL_QUIT)
                isCicleEnd = 1;
            //if(o_buttonC_DrawScene_1.getEvent().type = SDL_KEYDOWN &&
              // o_buttonC_DrawScene_1.getEvent().key.keysym.sym == SDLK_ESCAPE)
                //isCicleEnd = 1;
            SDL_Flip(o_scenesC_DrawScene_1.getScreen()); // !!! первая попытка обращения
        }
    scene_1_clean();
}
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
19.09.2013, 11:33  [ТС]     Функция get() не возвращает значение #13
Ага, я понял. Вообще идея была. проинициализировать screen в отдельном классе

C++
1
o_scenes.setScreen(SDL_SetVideoMode(_screenWidth, _screenHeigth, _screenColorBits, SDL_SWSURFACE));
После чего использовать этот-же screen в других классах.
Не учел, что он будет каждый раз при создании объекта обнуляться конструктором.

А что если проинициализировать screen внутри конструктора, в классе, в котором он объявлен?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.09.2013, 14:05     Функция get() не возвращает значение #14
Цитата Сообщение от dimakozyr Посмотреть сообщение
Не учел, что он будет каждый раз при создании объекта обнуляться конструктором.
Кто он? У каждого объекта свой screen, поэтому ничего обнуляться, у других объектов, не будет. Тут дело, как раз, не в начальной инициализации нолём, а в том, что после этого, дальше в коде, он не получает значение. Эту библиотеку я не знаю, как там что должно быть - тоже. Углубляться в ваш код - желания нет. Но если создаёте объект (C_Scenes o_scenesC_DrawScene_1) и в нём есть указатель screen, то позаботьтесь о том, чтобы задать ему значение (через setScreen()), отличное от NULL. Чем, где, как - это я не знаю, думайте. Например, перед первым обращением по значению screen (файл C_DrawScene_1.cpp):
C++
1
2
3
4
5
6
7
8
9
C_Scenes o_scenesC_DrawScene_1;
...
void C_DrawScene_1::scene_1_events() 
{
    ...
    o_scenesC_DrawScene_1.setScreen(....); // задаётся значение screen
    SDL_Flip(o_scenesC_DrawScene_1.getScreen()); // первое обращение к screen объекта o_scenesC_DrawScene_1
    ...
}
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
19.09.2013, 16:14  [ТС]     Функция get() не возвращает значение #15
Хорошо, спасибо
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
19.09.2013, 16:35     Функция get() не возвращает значение #16
Цитата Сообщение от dimakozyr Посмотреть сообщение
Вообще идея была. проинициализировать screen в отдельном классе
Цитата Сообщение от dimakozyr Посмотреть сообщение
После чего использовать этот-же screen в других классах.
Раз вы хотите действовать через глобальный объект o_scenesC_DrawScene_1, тогда (в начале программы) и присваивайте значение screen из этого объекта, а не из o_scenes (который в C_MainClass).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "C_MainClass.h"
#include "C_DrawScene_1.h"
 
extern C_Scenes o_scenesC_DrawScene_1; // глобальный объект
 
void C_MainClass::initSDL() {   
    SDL_Init(SDL_INIT_EVERYTHING);
    //o_scenes.setScreen(SDL_SetVideoMode(_screenWidth, _screenHeigth, 
                                        //_screenColorBits, SDL_SWSURFACE));
 
    o_scenesC_DrawScene_1.setScreen(SDL_SetVideoMode(_screenWidth, _screenHeigth, 
                                        _screenColorBits, SDL_SWSURFACE));
    
    SDL_WM_SetCaption("Beaver Game", NULL);
}
Раз объект глобальный, то его можно сделать видимым (через extern) в других файлах, и использовать screen из него.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.09.2013, 16:39     Функция get() не возвращает значение
Еще ссылки по теме:

Функция не возвращает значение C++
Функция не возвращает значение C++
C++ Рекурсивная функция не возвращает ожидаемое значение

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

Или воспользуйтесь поиском по форуму:
dimakozyr
 Аватар для dimakozyr
157 / 24 / 1
Регистрация: 17.08.2013
Сообщений: 461
19.09.2013, 16:39  [ТС]     Функция get() не возвращает значение #17
Хорошо, так и сделаю, спасибо
Yandex
Объявления
19.09.2013, 16:39     Функция get() не возвращает значение
Ответ Создать тему
Опции темы

Текущее время: 16:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru