Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 559
1

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

17.09.2013, 17:41. Показов 1376. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть класс, в котором определен объект типа 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"
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.09.2013, 17:41
Ответы с готовыми решениями:

Функция не возвращает значение
#include "stdafx.h" #include <iostream> #include <conio.h> using namespace std; int ca(int a)...

Функция не возвращает значение
Добрый день, уважаемые форумчане. Имеется вот такой кусок программы, и он работает, но не так, как...

Функция не возвращает значение
Функция ничего не возвращает: int Return(int s) { return s; } Передаю в аргумент S...

Функция не возвращает значение
#include <iostream> #include <fstream> #include <iomanip> #include "stdafx.h" using namespace...

16
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.09.2013, 19:44 2
а где инициализация image/sreen?

Цитата Сообщение от dimakozyr Посмотреть сообщение
C++
1
2
3
B object;
* * object.blittingImage(0, 0, image, object.getScreen());
* * if(object.getScreen() == NULL)
у класса В вообще нет метода getScreen
0
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 559
17.09.2013, 19:53  [ТС] 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"
}
0
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 559
18.09.2013, 23:22  [ТС] 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
}
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.09.2013, 00:00 5
Кода мало.
1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
19.09.2013, 00:01 6
Ты уверен, что SDL_SetVideoMode возвращает не NULL ?
1
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 559
19.09.2013, 00:42  [ТС] 7
Цитата Сообщение от castaway Посмотреть сообщение
Ты уверен, что SDL_SetVideoMode возвращает не NULL ?
Да, только что на всякий случай протестил

Цитата Сообщение от alsav22 Посмотреть сообщение
Кода мало.
0
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 559
19.09.2013, 00:47  [ТС] 8
Цитата Сообщение от castaway Посмотреть сообщение
Ты уверен, что SDL_SetVideoMode возвращает не NULL ?
Да, только что на всякий случай протестил

Цитата Сообщение от alsav22 Посмотреть сообщение
Кода мало.
Если скажете, чего именно не хватает, добавлю, на всякий случай выложил весь проект
Вложения
Тип файла: 7z Bober.7z (1.61 Мб, 5 просмотров)
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.09.2013, 01:35 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.
1
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 559
19.09.2013, 08:38  [ТС] 10
Цитата Сообщение от alsav22 Посмотреть сообщение
Тут не этот screen инициализируется, а тот, который находится в объекте C_MainClass::o_scenes.
В смысле не этот? Он у меня всего один в программе объявлен. При старте программы появляется черное окно, это говорит о том, что screen проинициализирован.

А вот в функции void C_DrawScene_1::scene_1_draw() функция o_scenesC_DrawScene_1.getScreen() почему-то работает неправильно. Она должна на плоскость screen загружать другие изображения.
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
19.09.2013, 09:18 11
не дублируй темы
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.09.2013, 11:21 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();
}
1
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 559
19.09.2013, 11:33  [ТС] 13
Ага, я понял. Вообще идея была. проинициализировать screen в отдельном классе

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

А что если проинициализировать screen внутри конструктора, в классе, в котором он объявлен?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.09.2013, 14:05 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
    ...
}
1
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 559
19.09.2013, 16:14  [ТС] 15
Хорошо, спасибо
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
19.09.2013, 16:35 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 из него.
1
162 / 29 / 3
Регистрация: 17.08.2013
Сообщений: 559
19.09.2013, 16:39  [ТС] 17
Хорошо, так и сделаю, спасибо
0
19.09.2013, 16:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.09.2013, 16:39
Помогаю со студенческими работами здесь

Почему функция не возвращает значение?
По заданию из учебника, нужно написать небольшую поисковую систему, используя все полученные...

Функция неправильно возвращает значение
double SparseMatrix::get(int i, int j)const { if (rows != nullptr && cols != nullptr) {...

Функция не возвращает значение (консолька, си++)
Функция не возвращает значение, но указывает по какому if'у она прошла. Почему не...

Функция возвращает неправильное значение
Нужно выполнить 3 задачи с веденным с клавиатуры массивом. Первая и третья работают нормально, а...

Функция возвращает странное значение
Да, понимаю, что скорее всего ошибка глупая, но голова разбитая и найти не могу. Прилагаю полный...

Функция возвращает неверное значение
Здравствуйте. Подскажите, пожалуйста, почему одна из двух функций возвращает неверное значение,...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru