Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 05.10.2018
Сообщений: 22
1

Переменные в поле #define

05.10.2018, 19:09. Показов 2528. Ответов 31

Author24 — интернет-сервис помощи студентам
Здравствуйте. Возник такой вопрос: как ведут себя переменные в поле #ifdef?
Допустим, я создаю класс и в нём прописываю такие строки:

C++
1
2
3
4
5
6
7
8
9
10
#ifdef SHADER_LIGHT
        glm::vec3 COLOR = glm::vec3(1.0, 1.0, 1.0);
 
    glm::vec3& GetColor() { return COLOR; }
 
    void SetLightPosition(glm::vec3& position)
    {
        glUniform3fv(glGetUniformLocation(shaderID, "lightPosition"), 1, glm::value_ptr(position));
    }
#endif
Но программа просто игнорирует переменную COLOR и подставляет значение по умолчанию. Я так понимаю, что методы класса в поле #ifdef игнорируют переменные и ищут их вне поля? Если вынести "glm::vec3 COLOR = glm::vec3(1.0, 1.0, 1.0);" из #ifdef, то он видит эту переменную.
Можете, пожалуйста, объяснить мне, как это работает?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.10.2018, 19:09
Ответы с готовыми решениями:

Почему нельзя использовать в операторе case переменные, которые определены как #define
Я не понимаю, почему Visual Studio ругается на строку с case в коде. Вроде все правильно. Если там...

Как реализовать директиву #define для создания шаблона отпределения #define ?
Здравствуйте уважаемые. При написании программы появилась необходимость задать шаблон создания...

Скрытие столбцов. Ошибка App-define od obj-define error
Привет) помогите, пожалуйста, ответить на следующие вопросы: 1) выскакивает ошибка: App-define...

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

31
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
06.10.2018, 18:07 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Natatem00 Посмотреть сообщение
как ведут себя переменные в поле #ifdef?
Отвечая на исходный вопрос, если из предыдущих ответов это было не понятно, они ведут себя точно так же, как и вне его - никакого подобного магического влияния, описываемого в стартовом топике оно не оказывает. Более того, языковые конструкции ничего не знают про препроцессор, а препроцессор ничего не знает про них. А магическое поведение обусловлено чем-то другим. И до тех пор, пока автор не оставит соблазнительный путь свалить все на препроцессор, он проблему не решит.
0
0 / 0 / 0
Регистрация: 05.10.2018
Сообщений: 22
06.10.2018, 18:17  [ТС] 22
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Так а чему равно значение поля COLOR именно внутри конструктора класса, где оно только-только инициализировалось?
Я пытаюсь сделать так, что переменная COLOR должна создаваться в #indef и там же она получает своё значение.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
между public и private
Это здесь не важно, так как переменная используется только внутри класса. Что в private, что в public - эффект одинаковый.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Потенциальный вылет за пределы памяти хорошо виден и на вашем скриншоте (если i вдруг превысит 9)
Кстати да, спасибо. Не заметил этой глупой ошибка. Но этот код никак не влияет на код после цикла. Там просто загружаются текстуры(если их несколько). Это, конечно, костыль и один объект должен иметь одну текстуру, ведь так тратится меньше памяти и процессорного времени, но это был эксперимент "А СМОГУ ЛИ Я СДЕЛАТЬ".
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Смущает также тот факт, что вы передаете этот COLOR по указателю
Я все значения в uniform передаю по указатель, и все они работают.

Я уже кое-как решил эту проблему. Просто сделал сеттер uniform прямо в классе.

Добавлено через 55 секунд
Цитата Сообщение от DrOffset Посмотреть сообщение
путь свалить все на препроцессор
Я не сваливаю, а спрашиваю: почему так происходит? Где вы вообще заметили, что я виню препроцессор?)

Добавлено через 42 секунды
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
короче, возвращай из GetColor константную ссылку и проверяй. Что попусту гадать по полдня?
Можно не гадать, а, как нормальные люди, использовать отладчик для этого
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
06.10.2018, 18:20 23
Цитата Сообщение от Natatem00 Посмотреть сообщение
Я не сваливаю, а спрашиваю: почему так происходит?
Мало информации даете.
Пока что только можно сказать, что ваша гипотеза не верна. Если препроцессор в этом и задействован, то только лишь косвенно, а не описываемым вами образом.
0
0 / 0 / 0
Регистрация: 05.10.2018
Сообщений: 22
06.10.2018, 18:22  [ТС] 24
Цитата Сообщение от DrOffset Посмотреть сообщение
Мало информации даете.
А какая информация ещё нужна? Меня попросили дать нужную информацию - я и дал. Что ещё нужно?
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
06.10.2018, 18:25 25
Цитата Сообщение от Natatem00 Посмотреть сообщение
А какая информация ещё нужна?
Т.к. совершенно очевидно, что проблема комплексная, а источник ее возможно находится совсем в другом месте от места проявления, то было бы неплохо предоставить полный код вместе с файлами проекта, чтобы можно было проанализировать что на что влияет. Скриншотами кусочков кода этого точно не выяснить...
0
0 / 0 / 0
Регистрация: 05.10.2018
Сообщений: 22
06.10.2018, 18:31  [ТС] 26
Цитата Сообщение от DrOffset Посмотреть сообщение
Т.к. совершенно очевидно, что проблема комплексная, а источник ее возможно находится совсем в другом месте от места проявления, то было бы неплохо предоставить полный код вместе с файлами проекта, чтобы можно было проанализировать что на что влияет. Скриншотами кусочков кода этого точно не выяснить...
Я мог бы скинуть код, но:
1. Есть ли в этой теме человек, который знает OpenGL?
2. Проблема уже, частично, решена с помощью сетера uniform
0
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
06.10.2018, 18:37 27
Цитата Сообщение от Natatem00 Посмотреть сообщение
Я мог бы скинуть код, но
Понимаете ли что... заставлять вас, конечно, это делать никто не будет.
Если вы считаете, что лучше справитесь с диагностикой проблемы - это очень хорошо, только зачем тогда писать на форум?
Если вы уверены, что абсолютно все правильно сделали - это еще лучше!
Я лишь только сказал, что знающие люди, коих тут достаточно много, могли бы посмотреть ваш проект и указать вам на ошибки, если таковые имеются. Единственное, что вы должны тут понять - по скриншотам код отладить можно только случайно. Если вы пришли на форум с комплексной проблемой, то нужно либо потратить некоторое свое время и написать демонстрационный пример, с которым можно задать вопрос о странном, на ваш взгляд, поведением, либо, если времени и\или навыков выделить важное нет, то скинуть код проекта. Остальные, даже успешные прецеденты помощи по фотографии, можно считать счастливой случайностью.
1
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,059
06.10.2018, 18:42 28
Цитата Сообщение от Natatem00 Посмотреть сообщение
Я пытаюсь сделать так, что переменная COLOR должна создаваться в #indef и там же она получает своё значение.
Нет, нет, нет. Это совсем не так работает. Определение полей класса - это не исполнимый код. Там никто не может "создаваться" и не может "получать значение".

Когда вы указываете инициализатор для поля класса прямо в определении класса - как в вашем случае - этот инициализатор является не более чем указанием компилятору, что делать потом в конструкторе класса. Ваше

C++
1
glm::vec3 COLOR = glm::vec3(1.0, 1.0, 1.0);
- это не более чем просто "синтаксический сахар". Все это будет на самом деле неявно превращено компилятором в

C++
1
2
3
4
Shader::Shader() : COLOR( 1.0, 1.0, 1.0 )
{
  shaderID = 0;
}
то есть фактическая инициализация поля COLOR произойдет именно в конструкторе класса. Поэтому я советую вам пойти именно в конструктор класса и проверить значение поля COLOR там. Если инициализация выполняется корректно, т.е. внутри конструктора значение действиельно равно (1.0, 1.0, 1.0), то это будет означать, что С++ сторона вопроса работает правильно. А поле COLOR превращается в нули где-то позже, по каким-то совершенно посторонним причинам ("затирание" или какая-то другая модификация).
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
06.10.2018, 18:56 29
TheCalligrapher, чаю этому господину
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
06.10.2018, 19:35 30
Цитата Сообщение от Natatem00 Посмотреть сообщение
1. Есть ли в этой теме человек, который знает OpenGL?
Считаете, что Вы один знакомы с OpenGL?
0
0 / 0 / 0
Регистрация: 05.10.2018
Сообщений: 22
07.10.2018, 18:57  [ТС] 31
Цитата Сообщение от Croessmah Посмотреть сообщение
Считаете, что Вы один знакомы с OpenGL?
Я считаю, что здесь многие люди задают слишком глупые вопросы)
Дело в том, что С++ - это не только OpenGL. И, возможно, что тот, кто мне пытается помочь - не знаком с этой библиотекой.

Добавлено через 11 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Определение полей класса - это не исполнимый код. Там никто не может "создаваться" и не может "получать значение".
Хорошо, спасибо за ответ. Но он всё равно возвращает нули. Ладно, в любом случае мне эта переменная больше не нужна: теперь можно просто настраивать свет через сетеры.
Ещё раз спасибо, за потраченное время
0
Вездепух
Эксперт CЭксперт С++
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,059
07.10.2018, 20:42 32
Цитата Сообщение от Natatem00 Посмотреть сообщение
И, возможно, что тот, кто мне пытается помочь - не знаком с этой библиотекой.
Вопрос, который вы задали изначально, не относится к OpenGL никаким боком вообще, а является чисто и исключительно С++ вопросом.

Привносить в эту тему OpenGL и его особенности имеет смысл только в том случае, если мы уже окончательно установили, что изначальная инициализация переменной прошла успешно, а дальнейшее "странное" нулевое значение - это результат последующего "затирания".

Цитата Сообщение от Natatem00 Посмотреть сообщение
Но он всё равно возвращает нули.
Кто "он"? Конструктор? Вы видите нули в COLOR даже в конструкторе класса, несмотря на объявление с инициализатором?
0
07.10.2018, 20:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.10.2018, 20:42
Помогаю со студенческими работами здесь

Внутриблочные переменные не могут иметь те же имена, что и переменные из блока верхнего уровня
program matr; uses crt; const n = 5; m = 5; var

Создать программу обработки массивов структур используя структурные переменные и переменные типа объеденения
Создать массив структур, каждая из которых состоит из следующих елементов: факультет, курс, группа,...

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

Запись из формы данных в переменные php файла, данные из переменные используются в других файлах сайта
Всем привет! Ребят, подскажите пожалуйста! Есть один файл с обычной html формой, в которой обычные...

Переменные экземпляра, класса, константы и переменные readonly
Как эту задачу записать в C#? Переменные экземпляра, класса, константы и переменные readonly:...

Переменные,значение функции,вспомогательные переменные.
1)Даны переменные A,B,C.Изменить их значения,переместив их содержимое из A-в B,B-в C,C-в A,и...


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

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