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

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

Войти
Регистрация
Восстановить пароль
 
Refery
0 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 16
#1

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

28.11.2012, 00:14. Просмотров 457. Ответов 9
Метки нет (Все метки)

Дело в том что без него (без 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. возможно тут лишние заголовки, но негативно ни на что это не должно повлиять.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2012, 00:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему без "статик" не работает? (C++):

Почему не работает функция std::regex_replace(temp,"amp;",""); - C++
Пробую вызывать функцию std::regex_replace(temp,&quot;amp;&quot;,&quot;&quot;); Пишет ошибку: test_ok_ruDlg.cpp 1&gt;d:\visual studio...

Сдающий карты. "cards_remaining--" одинаково работает и с "--", и без - C++
Всем привет, возник вопрос по поводу программы &quot;сдающий карты&quot;, программа с книги &quot;С++ без страха&quot;, автора не помню, не столь важно) Вот...

Почему не работает "system("pause")"? - C++
Почему не останавливается программа в консоли в конце? #include&lt;iostream&gt; #include&lt;locale&gt; #include&lt;string&gt; #include&lt;time.h&gt; ...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

Почему в scanf("%s",ss) имя ss пишется без амперсанда? - C++
почему в scanf(&quot;%s&quot;,ss) имя ss пишется без амперсанта?

Игра "Крестики нолики", почему не работает проверка окончания? - C++
#include &lt;iostream&gt; using namespace std; int main () { int a,k=0; char mas; while(k&lt;10) { for(int...

9
BumerangSP
4287 / 1409 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
28.11.2012, 00:22 #2
Если не ошибаюсь, то при бесконечном цикле (glutMainLoop) display будет много раз вызываться, соответственно эта переменная, не будь она static, будет каждый раз создаваться и ей будет присваиваться 0. static накладывает на нее такое свойство, что эта переменная будет жить на протяжении всей работы программы и каждый раз присваиваться 0 ей тоже не будет.
1
NoMasters
Псевдослучайный
1764 / 1107 / 73
Регистрация: 13.09.2011
Сообщений: 3,143
28.11.2012, 00:22 #3
Потому что без static переменная создаётся(и инициализируется нулём) при каждом входе в display и удаляется по завершению, значение, соответственно, не сохраняется.
1
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
28.11.2012, 00:23 #4
Значит переменная будет инициализирована один раз и не будет каждый раз "создаваться" при вызове функции
0
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
|=
явно же не смайлик?))
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
28.11.2012, 00:58 #6
Цитата Сообщение от Refery Посмотреть сообщение
что означает оператор
C++
1
color = color | 0xff;
0
Kuzia domovenok
1951 / 1804 / 140
Регистрация: 25.03.2012
Сообщений: 6,245
Записей в блоге: 1
28.11.2012, 00:59 #7
побитовое ИЛИ
в данном конкретном случае, побитовое ИЛИ на число из 8ми и 16ти двоичных единиц устанавливает 8мь или 16ть младших двоичных разрядов в единицы соответственно
1
Refery
0 / 0 / 0
Регистрация: 27.11.2012
Сообщений: 16
28.11.2012, 01:01  [ТС] #8
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
color = color | 0xff;
а вот это | оператор "или"?
если да, то что-то не могу уловить смысл(

Добавлено через 54 секунды
а кажется вспомнил где про это можно почитать, я эту тему бегло просмотрел - думал не пригодится
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
28.11.2012, 01:02 #9
Цитата Сообщение от Refery Посмотреть сообщение
если да, то что-то не могу уловить смысл(
Kuzia domovenok Вам написал смысл
0
Kuzia domovenok
1951 / 1804 / 140
Регистрация: 25.03.2012
Сообщений: 6,245
Записей в блоге: 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 Посмотреть сообщение
если да, то что-то не могу уловить смысл(
вот и весь смысл. уловил?
1
28.11.2012, 01:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2012, 01:57
Привет! Вот еще темы с ответами:

Добрый день , не могу понять почему не работает system("clr")? - C++
#include&lt;iostream&gt; #include&lt;string&gt; // getline #include&lt;cstdlib&gt; // system using namespace std; void main() { int a ; char d;...

Структура "Владелец автомобиля". Почему не работает? - C++
25. Дан файл, содержащий сведения о владельцах автомобилей. Структура записи файла: фамилия и инициалы владельца, марка и номер автомобиля....

Подскажите почему может появляться ошибка: "неразрешенный внешний символ "_SDL_..."" - C++
Привет всем =) Скажите пожалуйста почему у меня пишет: 1&gt;SDL.obj : error LNK2001: неразрешенный внешний символ &quot;_SDL_CreateCursor&quot; ...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...


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

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

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