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

Почему без "статик" не работает? - C++

Восстановить пароль Регистрация
 
Refery
0 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 16
28.11.2012, 00:14     Почему без "статик" не работает? #1
Дело в том что без него (без static) программка не работает корректно.
по задумке (а оно так и выходит) в открывающемся окошке фоновый цвет задаваемый с помощью функции библиотеки OpenGL glClear(GL_COLOR_BUFFER_BIT); должен плавно меняться с черного на красный-оранжевый-желтый-белый...
так и происходит, но если убрать "static" и объявить переменную
C++
1
unsigned long color = 0;
а не
C++
1
static unsigned long color = 0;
то код работать не будет. т.е. программка конечно скомпелируется и запустится, но фон будет постоянно черным.
на сколько я знаю static используется для скрытия глобальных переменных от видимости их другими срр файлами...
так что логику использования здесь static я абсолютно не вижу =(

вот код:

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
#include <glut.h>
#include <glaux.h>
#include <Windows.h>
#include <math.h>
#include <stdlib.h> 
#include <iostream>
 
GLfloat colors1[]={0.9f,0.5f,0.1f};             
BOOL colorUp[]={TRUE,TRUE,TRUE};
 
void init(void)
{
    glClearColor(0.0,0.0,0.0,0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0,1.0,0.0,1.0,-1.0,1.0);
}
 
void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    static unsigned long color = 0;
    if( ++color >= 0x00ffffff ) color = 0;  
    if( color >= 0xff ) color |= 0xff;
    if( color >= 0xffff ) color |= 0xffff;
    const unsigned char * rgba = (const unsigned char *)&color;
    printf( "red=%u green=%u blue=%u\n", rgba[0], rgba[1], rgba[2] );
    glClearColor( rgba[0] / 255.0f, rgba[1] / 255.0f, rgba[2] / 255.0f, 1 );
    glutSwapBuffers();
    glutPostRedisplay();
}
 
int main(int argc, char **argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
    glutInitWindowSize(250,250);
    glutInitWindowPosition(100,100);
    glutCreateWindow("color changing");
    init();
    glutDisplayFunc(display);
    glutMainLoop();
    srand( GetTickCount() );
    return 0;
}
P.S. возможно тут лишние заголовки, но негативно ни на что это не должно повлиять.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2012, 00:14     Почему без "статик" не работает?
Посмотрите здесь:

C++ почему в scanf("%s",ss) имя ss пишется без амперсанта?
Подскажите почему может появляться ошибка: "неразрешенный внешний символ "_SDL_..."" C++
C++ Сдающий карты. "cards_remaining--" одинаково работает и с "--", и без
C++ Игра "Крестики нолики", почему не работает проверка окончания?
C++ Почему тип "bool" работает в файле с расширением .cpp и не работает в файле с расширением .c?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
28.11.2012, 00:22     Почему без "статик" не работает? #2
Если не ошибаюсь, то при бесконечном цикле (glutMainLoop) display будет много раз вызываться, соответственно эта переменная, не будь она static, будет каждый раз создаваться и ей будет присваиваться 0. static накладывает на нее такое свойство, что эта переменная будет жить на протяжении всей работы программы и каждый раз присваиваться 0 ей тоже не будет.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
28.11.2012, 00:22     Почему без "статик" не работает? #3
Потому что без static переменная создаётся(и инициализируется нулём) при каждом входе в display и удаляется по завершению, значение, соответственно, не сохраняется.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,897
Записей в блоге: 2
Завершенные тесты: 1
28.11.2012, 00:23     Почему без "статик" не работает? #4
Значит переменная будет инициализирована один раз и не будет каждый раз "создаваться" при вызове функции
Refery
0 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 16
28.11.2012, 00:55  [ТС]     Почему без "статик" не работает? #5
все понял! спасибо большое!))

я одному человеку проспорил что и так и так будет работать))
теперь понял в чем тут дело)

Добавлено через 31 минуту
еще хотел спросить, вот в этих строках
C++
1
2
 if( color >= 0xff ) color |= 0xff;
 if( color >= 0xffff ) color |= 0xffff;
что означает оператор
C++
1
|=
явно же не смайлик?))
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,897
Записей в блоге: 2
Завершенные тесты: 1
28.11.2012, 00:58     Почему без "статик" не работает? #6
Цитата Сообщение от Refery Посмотреть сообщение
что означает оператор
C++
1
color = color | 0xff;
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
28.11.2012, 00:59     Почему без "статик" не работает? #7
побитовое ИЛИ
в данном конкретном случае, побитовое ИЛИ на число из 8ми и 16ти двоичных единиц устанавливает 8мь или 16ть младших двоичных разрядов в единицы соответственно
Refery
0 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 16
28.11.2012, 01:01  [ТС]     Почему без "статик" не работает? #8
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
color = color | 0xff;
а вот это | оператор "или"?
если да, то что-то не могу уловить смысл(

Добавлено через 54 секунды
а кажется вспомнил где про это можно почитать, я эту тему бегло просмотрел - думал не пригодится
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11836 / 6815 / 770
Регистрация: 27.09.2012
Сообщений: 16,897
Записей в блоге: 2
Завершенные тесты: 1
28.11.2012, 01:02     Почему без "статик" не работает? #9
Цитата Сообщение от Refery Посмотреть сообщение
если да, то что-то не могу уловить смысл(
Kuzia domovenok Вам написал смысл
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2012, 01:57     Почему без "статик" не работает?
Еще ссылки по теме:

C++ Структура "Владелец автомобиля". Почему не работает?
Патерн "прототип" не работает, выдаёт ошибку "недопустимый вызов нестатической ф-ции", где я в коде ошибка? C++
C++ Почему не работает "system("pause")"?

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

Или воспользуйтесь поиском по форуму:
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
28.11.2012, 01:57     Почему без "статик" не работает? #10
суть в том, что пока color меньше числа 0xff; он изменяется медленно, увеличиваясь каждый кадр на единицу,
когда достигает 0xFF и
находится в диапазоне от 0xFF до 0xFFFF (от 255 до 65535) он изменяется быстрее, т.к. увеличивается каждый раз на 256 (т.к. помимо 1 к нему каждый раз битово прибавляют FF или 255)
находится в диапазоне от 0xFFFF (от 65535 и выше) он изменяется ещё быстрее, т.к. увеличивается каждый раз на 65536 (т.к. помимо 1 к нему каждый раз битово прибавляют FFFF или 65535)

Добавлено через 20 минут
Цитата Сообщение от Refery Посмотреть сообщение
если да, то что-то не могу уловить смысл(
вот и весь смысл. уловил?
Yandex
Объявления
28.11.2012, 01:57     Почему без "статик" не работает?
Ответ Создать тему
Опции темы

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