Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/52: Рейтинг темы: голосов - 52, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 41

Значение переменных из файла

07.12.2009, 00:10. Показов 11088. Ответов 73
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хочу чтобы программа брала параметры из файла.
На конкретном примере:
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
46
47
48
49
50
51
52
#include "ingame.h"
 
float ix;
 
float iy;
 
int main(int n, char **s)
    {
        screen(800, 600);
        //zerkalo ("ship1.bmp");
        loadsprite(1, "ship1.bmp");
        loadsprite(2, "ship2.bmp");
        loadsprite(3, "ship3.bmp");
        loadsprite(4, "ship4.bmp");
        loadsprite(5, "ship5.bmp");
        loadsprite(6, "ship6.bmp");
        loadsprite(7, "ship7.bmp");     
        loadsprite(8, "ship8.bmp");
        ix=700;
        iy=500;
        
        
        while (GAME)
        {
            if (spd < 0){spd=0;}
            if (spd > 2){spd=2;}
            if (nap == 0){nap=8;}
            if (nap > 8){nap=1;}
            
            if (spd == 1 and nap == 1){iy=iy-0.25;}
            if (spd == 2 and nap == 1){iy=iy-0.45;}
            if (spd == 1 and nap == 2){iy=iy-0.25; ix=ix+0.25;}
            if (spd == 2 and nap == 2){iy=iy-0.45; ix=ix+0.45;}
            if (spd == 1 and nap == 3){ix=ix+0.25;}
            if (spd == 2 and nap == 3){ix=ix+0.45;}
            if (spd == 1 and nap == 4){iy=iy+0.25; ix=ix+0.25;}
            if (spd == 2 and nap == 4){iy=iy+0.45; ix=ix+0.45;}
            if (spd == 1 and nap == 5){iy=iy+0.25;}
            if (spd == 2 and nap == 5){iy=iy+0.45;}
            if (spd == 1 and nap == 6){iy=iy+0.25; ix=ix-0.25;}
            if (spd == 2 and nap == 6){iy=iy+0.45; ix=ix-0.45;}
            if (spd == 1 and nap == 7){ix=ix-0.25;}
            if (spd == 2 and nap == 7){ix=ix-0.45;}
            if (spd == 1 and nap == 8){iy=iy-0.25; ix=ix-0.25;}
            if (spd == 2 and nap == 8){iy=iy-0.45; ix=ix-0.45;}         
                        
            sprite(nap,ix,iy);
            
            fx();
        }
        return 0;
    }
Хочу чтобы screen(800, 600); выглядело как screen(xs, ys);
и бралось xs и ys из файла в том же каталоге что и программа ./options.txt
Как это сделать?
Вопрос понимаю звучит глупо но не бейте больно я только учусь хочу поэкспериментировать.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.12.2009, 00:10
Ответы с готовыми решениями:

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

Взять значение переменных из другого файла
есть cpp фаил //--------------------------------------------------------------------------- #pragma hdrstop #include...

Чтение с файла значение двух переменных записанных через пробел
Как прочитать с файла file.in два числа например: &quot;10 20&quot; между ними стоит пробел. пробовал: using (StreamReader reader =...

73
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
18.02.2010, 02:40
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от vfz Посмотреть сообщение
Но насколько я понимаю в таком случае структуры будут глобальными.
нет, локальными.
т.к. переменные их типов, объявляются в main()

Цитата Сообщение от vfz Посмотреть сообщение
И ещё вопрос эта строка просто создает синоним к структуре?
struct game_context context;
декларирует переменную context, типа struct game_context.

Цитата Сообщение от vfz Посмотреть сообщение
И и окуда взяличь width heigth и так далее
это свойства(поля) структуры. я их так назвал. назови как тебе угодно.
0
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 41
20.02.2010, 03:14  [ТС]
Со структурами определится сложно, примерно представляю что нужно но они все равно расти будут, в смысле структуры внутри, хочешь не хочешь а переменные постепенно будут добавляться.

Пока пробую новый для меня подход к программированию, вот что получилось.
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include <SDL/SDL.h>
 
#include <SDL/SDL_ttf.h>
 
#include <SDL/SDL_mixer.h>
 
#include <iostream>
#include <stdio.h>
 
#include <stdlib.h>
 
#include <math.h>
 
#define FPS_LIMIT 75
 
#include "../heders/ingame.h"
//Инклудится вот что:
 
struct screen {
   TTF_Font *fnt;
   SDL_Event event;      // переменная обработки событий все события будут складыватся в переменную event
   SDL_Surface *display; //Основная поверхность программы (рабочая область)
   int width;   //разрешенние рабойей области по ширене
   int heigth; //разрешенние рабойей области по высоте
   bool full;  //Для обозначения полноэкранного режима (либо да либо нет)
   Uint32 then, now, frames; // Для контроля FPS
 
    int fps;                  // Для контроля FPS
};
 
struct game_all {
   bool GAME; /* Пока труе процес игры идет */
   struct screen screen;
};
 
screen(struct screen* screen) {
   
   if (SDL_Init (SDL_INIT_VIDEO|SDL_INIT_TIMER) < 0){ 
   printf("Unable to init SDL: %s\n", SDL_GetError()); 
   exit(1); 
    } 
 
   if(screen->full){          
      screen->display = SDL_SetVideoMode (screen->width, screen->heigth, 0, SDL_SWSURFACE | SDL_ANYFORMAT|SDL_FULLSCREEN);
   } else {
      screen->display = SDL_SetVideoMode (screen->width, screen->heigth, 0, SDL_SWSURFACE | SDL_ANYFORMAT);
   }//Установка полноэкранного либо оконного режима 
 
   TTF_Init();
 
   screen->fnt = TTF_OpenFont("./fonts/courier.ttf", 20);
 
    SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);   
    
    //SOUND
    //Mix_OpenAudio (44100, MIX_DEFAULT_FORMAT, 2, 2024);
    
    //for FPS limit
    screen->frames = 0;
 
    screen->then = SDL_GetTicks(); 
 
}
 
void clear(SDL_Surface *display){
 
    SDL_FillRect(display, NULL, SDL_MapRGB(display->format, 0, 0, 4));// Очистка экрана и заливка его указанным цыетом
 
}
 
void fx(struct game_all* game_all){
    while (SDL_PollEvent(&event)) 
 
    {
 
        if (event.type==SDL_QUIT) // СОбытие SDL_QUIT генерируется при нажатии на кнопку закрытия окна
        {            
             game_all->GAME=false;              
 
             atexit(SDL_Quit());          
 
        }
    // если нажата любая кнопка, для обработки отпускания кнопки используется SDL_KEYUP
 
        if (event.type==SDL_KEYDOWN) 
 
        {
            if(event.key.keysym.sym==SDLK_ESCAPE)
 
            {          
                game_all->GAME=0;
                atexit(SDL_Quit());
 
            }
        }//Конец следжения за клавой
    } //Окончание обработчкиа событий
    
    
   ++game_all->screen->frames; 
 
 
 
game_all->screen->now = SDL_GetTicks();//Возвращает время в милисекундах, прошедшее с момента инициализации SDL
 
 
//вычисляется FPS и если он слишком высок то программа замедляеться
 
if ( game_all->screen->now > game_all->screen->then ) {
 
game_all->screen->fps= (int)((double)game_all->screen->frames*1000)/(game_all->screen->now-game_all->screen->then);
 
} 
 
if ( game_all->screen->fps > FPS_LIMIT ) {SDL_Delay(1000/FPS_LIMIT);}
 
// Закончили с FPS
 
 
 
//mouse();
         
 
    
    SDL_Flip(game_all->screen->display);// Все что было отрисовано выводится на экран
 
    clear(game_all->screen->display);// экран отчищается и заливается указанным цветом
 
}  
}//fx() Окончание
 
//далее идет основной документ
 
int main(int n, char **s) 
{
   struct game_context context;
   memset(&context, 0, sizeof(context)); // обнуляем все члены структуры
   /* инициализируем */
   context.screen.width = 800;
   context.screen.heigth = 600;
   context.screen.full = true;
 
   context.GAME = true;
   
    screen(&context.screen);
 
    while(context.GAME) 
    {
        fx(&context);   
        }
        return 0;
}
При компиляции этого всего подучаю ошибку

$ make
g++ -o ingame.run ./src/freeship.cpp `sdl-config --libs` -lSDL_ttf -lSDL_mixer
In file included from ./src/freeship.cpp:11:
./src/../heders/ingame.h:19: ошибка: expected unqualified-id before ‘struct’
./src/../heders/ingame.h:19: ошибка: expected `)' before ‘struct’
make: *** [all] Ошибка 1
это строка выглядит так

C++
1
screen(struct screen* screen) {
Добавлено через 1 минуту
Сразу хочу спросить правильно ли я испотзую структуры в fx() меня интерпретатор поймет вообще?

Добавлено через 37 минут
С ошибкой разобрался void никто не отменял а я про него забыл. Теперь разбираюсь со структурами в fx() так как есть меня интерпритатот не понял естественно.

Добавлено через 1 час 6 минут
Так ну вроде разобрался. вот что получилось
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#include <SDL/SDL.h>
 
#include <SDL/SDL_ttf.h>
 
#include <SDL/SDL_mixer.h>
 
#include <iostream>
#include <stdio.h>
 
#include <stdlib.h>
 
#include <math.h>
#define FPS_LIMIT 75
 
#include "../heders/ingame.h"
// Инклудится
struct screen {
   TTF_Font *fnt;
   SDL_Surface *display; //Основная поверхность программы (рабочая область)
   int width;   //разрешенние рабойей области по ширене
   int heigth; //разрешенние рабойей области по высоте
   bool full;  //Для обозначения полноэкранного режима (либо да либо нет)
   Uint32 then, now, frames; // Для контроля FPS
 
    int fps;                  // Для контроля FPS
};
 
struct game_all {
   bool GAME; /* Пока труе процес игры идет */
     // переменная обработки событий все события будут складыватся в переменную event
   struct screen screen;
};
 
void screen(struct screen* screen) {
   
   if (SDL_Init (SDL_INIT_VIDEO|SDL_INIT_TIMER) < 0){ 
   printf("Unable to init SDL: %s\n", SDL_GetError()); 
   exit(1); 
    } 
 
   if(screen->full){          
      screen->display = SDL_SetVideoMode (screen->width, screen->heigth, 0, SDL_SWSURFACE | SDL_ANYFORMAT|SDL_FULLSCREEN);
   } else {
      screen->display = SDL_SetVideoMode (screen->width, screen->heigth, 0, SDL_SWSURFACE | SDL_ANYFORMAT);
   }//Установка полноэкранного либо оконного режима 
 
   TTF_Init();
 
   screen->fnt = TTF_OpenFont("./fonts/courier.ttf", 20);
 
    SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);   
    
    //SOUND
    //Mix_OpenAudio (44100, MIX_DEFAULT_FORMAT, 2, 2024);
    
    //for FPS limit
    screen->frames = 0;
 
    screen->then = SDL_GetTicks(); 
 
}
 
void clear(SDL_Surface *display){   
 
    SDL_FillRect(display, NULL, SDL_MapRGB(display->format, 0, 0, 4));// Очистка экрана и заливка его указанным цыетом
 
}
 
void fx(struct game_all* game_all, struct screen* screen){
 
//  printf("w\n h\n f\n", context.screen.width, context.screen.heigth, context.screen.full);
    Uint8* keys;
    SDL_Event event;
    
        while (SDL_PollEvent(&event)) 
 
    {
 
        if (event.type==SDL_QUIT) // СОбытие SDL_QUIT генерируется при нажатии на кнопку закрытия окна
        {    
            game_all->GAME=0;
            atexit(SDL_Quit);  
 
        }
    // если нажата любая кнопка, для обработки отпускания кнопки используется SDL_KEYUP
 
        if (event.type==SDL_KEYDOWN) 
 
        {
            if(event.key.keysym.sym==SDLK_ESCAPE)
 
            {
 
                game_all->GAME=0;
                atexit(SDL_Quit);  
 
            }
        }//Конец следжения за клавой
    } //Окончание обработчкиа событий
    
    
   ++screen->frames; 
 
 
 
screen->now = SDL_GetTicks();//Возвращает время в милисекундах, прошедшее с момента инициализации SDL
 
 
//вычисляется FPS и если он слишком высок то программа замедляеться
 
if ( screen->now > screen->then ) {
 
screen->fps= (int)((double)screen->frames*1000)/(screen->now-screen->then);
 
} 
 
if ( screen->fps > FPS_LIMIT ) {SDL_Delay(1000/FPS_LIMIT);}
 
// Закончили с FPS
 
 
 
//mouse();
         
 
    
    SDL_Flip(screen->display);// Все что было отрисовано выводится на экран
 
    clear(screen->display);// экран отчищается и заливается указанным цветом
 
  
}//fx() Окончание
 
//Конец вставки, далее основной документ
 
int main(int n, char **s) 
{
   struct game_all context;
   memset(&context, 0, sizeof(context)); // обнуляем все члены структуры
   /* инициализируем */
   context.screen.width = 800;
   context.screen.heigth = 600;
   context.screen.full = false;
   context.GAME = true;
   
   screen(&context.screen);
    
    while(context.GAME) 
    {
        fx(&context,&context.screen);       
        }  
        return 0;
}
Кажется начинаю ощущать удобство такого подхода, хотя есть сомнения всякие. Глянте опытным глазом может я, что не правильно понял, поправьте если что.

Код работает без ошибок вроде.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
20.02.2010, 05:32
Цитата Сообщение от vfz Посмотреть сообщение
Со структурами определится сложно, примерно представляю что нужно но они все равно расти будут, в смысле структуры внутри, хочешь не хочешь а переменные постепенно будут добавляться.
это нормально.

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

Цитата Сообщение от vfz Посмотреть сообщение
void fx(struct game_all* game_all, struct screen* screen)
не понятно, зачем передавать в два аргумента то, что является членом одной структуры

Добавлено через 1 минуту
правило:
переменные, декларации, размещаются в .h файлах.
реализации(implementation) в .cpp файлах.
1
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 41
20.02.2010, 10:50  [ТС]
Цитата Сообщение от niXman Посмотреть сообщение
не понятно, зачем передавать в два аргумента то, что является членом одной структуры
Мне тоже не понятно, но по другому у меня не получилось достать их, как правильно сослаться на структуру screen например
game_all->scren->fps не работает кажется единственное что не пробовал это game_all.scren->fps попробую, расскажу что получилось.

Цитата Сообщение от niXman Посмотреть сообщение
правило:
переменные, декларации, размещаются в .h файлах.
реализации(implementation) в .cpp файлах.
Тоесть если я правильно понимаю в .h у меня должно быть так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct screen {
   TTF_Font *fnt;
   SDL_Surface *display; //Основная поверхность программы (рабочая область)
   int width;   //разрешенние рабойей области по ширене
   int heigth; //разрешенние рабойей области по высоте
   bool full;  //Для обозначения полноэкранного режима (либо да либо нет)
   Uint32 then, now, frames; // Для контроля FPS
 
        int fps;                  // Для контроля FPS
};
 
struct game_all {
   bool GAME; /* Пока труе процес игры идет */
         // переменная обработки событий все события будут складыватся в переменную event
   struct screen screen;
};
 
void screen(struct screen* screen);
void clear(SDL_Surface *display);
void fx(struct game_all* game_all);
а в основном файле в моем случае freeship.cpp , будет описание причем без void
C++
1
2
3
4
clear(SDL_Surface *display){       
        SDL_FillRect(display, NULL, SDL_MapRGB(display->format, 0, 0, 4));// Очистка экрана и заливка его указанным цыетом 
}
// и так далее.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
20.02.2010, 11:05
Цитата Сообщение от vfz Посмотреть сообщение
Тоесть если я правильно понимаю в .h у меня должно быть так:
именно!


Цитата Сообщение от vfz Посмотреть сообщение
а в основном файле в моем случае freeship.cpp , будет описание причем без void
с ним!


Цитата Сообщение от vfz Посмотреть сообщение
Мне тоже не понятно, но по другому у меня не получилось достать их
правило:
к членам структуры, которые являются указателями, обращаются при помощи "->"
к членам структуры, которые НЕ являются указателями, обращаются при помощи "."

Добавлено через 8 минут
Цитата Сообщение от vfz Посмотреть сообщение
struct game_all {
* *bool GAME; /* Пока труе процес игры идет */
* * * * *// переменная обработки событий все события будут складыватся в переменную event
* *struct screen screen;
};
кстати, это потенциальная, сложно уловимая ошибка!
пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct screen screen;
/* инициализируем члены структуры */
...
...
struct game_all game;
/* инициализируем члены структуры */
game.screen = screen;
...
...
/* допустим, один из членов структуры screen изменился.
    а значения в game.screen останутся прежними!
 */
правильно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct game_all {
   bool GAME; /* Пока труе процес игры идет */
         // переменная обработки событий все события будут складыватся в переменную event
   struct screen* screen;
};
...
struct screen screen;
/* инициализируем члены структуры */
...
...
/* присваиваем так */
struct game_all game;
...
game.screen = &screen; /* теперь, при изменении членов структуры в любом участке кода,
это изменение произойдет во всех указателях на структуру.
 */
1
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 41
21.02.2010, 00:37  [ТС]
Делаю поправки с учетом выше сказанного.

У меня вопрос насчет .h я и раньше обращал внимания что некоторые (многие) просто перечисляют в них функции не описывая их. Что это дает? Как по мне так это просто пустая трата букАв, я не могу понять в чем значимость сего действия. Можете пояснить?

Добавлено через 39 минут
Пробую вместо "голубой рыбки" использовать Code::Blocks (8.02) немогу понять чего он ругается так вот при компиляции
freeship.cpp: (.text+0x10a)||undefined reference to `SDL_GetTicks'|
подобной ругани на 16 строк, что за неопределенные ссылки на SDL в командной строке главное все чисто, а в IDE ругань, что это может быть?
0
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
21.02.2010, 00:54
C::B использует свой Makefile,сгенерированный автоматически в зависимости от настроек проекта.Зайди в Project->Build options->Linker settings и в Other linker options впиши -lSDL
0
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 41
21.02.2010, 02:57  [ТС]
если
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
struct screen {
   TTF_Font *fnt;
   SDL_Surface *display; //Основная поверхность программы (рабочая область)
   int width;   //разрешенние рабойей области по ширене
   int heigth; //разрешенние рабойей области по высоте
   bool full;  //Для обозначения полноэкранного режима (либо да либо нет)
   Uint32 then, now, frames; // Для контроля FPS
   int fps;                  // Для контроля FPS
};
 
struct game_all {
   bool GAME; /* Пока труе процес игры идет */
     // переменная обработки событий все события будут складыватся в переменную event
   struct screen* screen;
};
 
int main(int n, char **s)
{
    struct screen screen;
    struct game_all context;
 
    memset(&context, 0, sizeof(context)); // обнуляем все члены структуры
    /* инициализируем */
 
    context.screen.width = 800;
    context.screen.heigth = 600;
    context.screen.full = false;
    context.GAME = true;
context.screen = &screen; /* Эту строчку ставил и до инициализации game_all и сразу после и перед инициализацией переменных и всеравно ниак*/
screen(&context.screen);
 
 
while(context.GAME) {
        fx(&context,&context.screen);
    }
        return 0;
}
То при компиляции получается ошибка
./src/freeship.cpp:108: ошибка: не найден метод для преобразования в ‘(screen) (screen**)’
./src/freeship.cpp:114: ошибка: cannot convert ‘screen**’ to ‘screen*’ for argument ‘2’ to ‘void fx(game_all*, screen*)’
make: *** [all] Ошибка 1
Добавлено через 5 минут
Цитата Сообщение от #pragma Посмотреть сообщение
C::B использует свой Makefile,сгенерированный автоматически в зависимости от настроек проекта.Зайди в Project->Build options->Linker settings и в Other linker options впиши -lSDL
я не создавал в нем проект я порсто открыл в нем два файлика свои.

Добавлено через 39 минут
Пытаюсь переделать функцию fx() чтобы передавать ей только один параметр. если делаю так:

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>
#include <SDL/SDL_mixer.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
#define FPS_LIMIT 75
 
#include "../heders/ingame.h"
 
 
void screen(struct screen* screen) { //Инициализирует SDL и создает рабочее окн указанного разрешения.
 
   if (SDL_Init (SDL_INIT_VIDEO|SDL_INIT_TIMER) < 0){
   printf("Unable to init SDL: %s\n", SDL_GetError());
   exit(1);
    }
 
   if(screen->full){
      screen->display = SDL_SetVideoMode (screen->width, screen->heigth, 0, SDL_SWSURFACE | SDL_ANYFORMAT|SDL_FULLSCREEN);
   } else {
      screen->display = SDL_SetVideoMode (screen->width, screen->heigth, 0, SDL_SWSURFACE | SDL_ANYFORMAT);
   }//Установка полноэкранного либо оконного режима
 
   TTF_Init();
 
   screen->fnt = TTF_OpenFont("./fonts/courier.ttf", 20);
 
    SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
 
    //SOUND
    //Mix_OpenAudio (44100, MIX_DEFAULT_FORMAT, 2, 2024);
 
    //for FPS limit
    screen->frames = 0;
 
    screen->then = SDL_GetTicks();
 
}
 
void clear(SDL_Surface *display){// Очистка экрана и заливка его указанным цветом
    SDL_FillRect(display, NULL, SDL_MapRGB(display->format, 0, 0, 4));// Очистка экрана и заливка его указанным цыетом
}
 
/*void loadsprite(int num, char * name, struct game_all* game)
{
game->pic[num].game.WiHi->tmp=SDL_DisplayFormat(SDL_LoadBMP(name));
}*/
 
void fx(struct game_all* game_all){
 
//  printf("w\n h\n f\n", context.screen.width, context.screen.heigth, context.screen.full);
    Uint8* keys;
    SDL_Event event;
 
        while (SDL_PollEvent(&event))
    {
        if (event.type==SDL_QUIT) // СОбытие SDL_QUIT генерируется при нажатии на кнопку закрытия окна
        {
            game_all->GAME=0;
            atexit(SDL_Quit);
        }
    // если нажата любая кнопка, для обработки отпускания кнопки используется SDL_KEYUP
        if (event.type==SDL_KEYDOWN)
        {
            if(event.key.keysym.sym==SDLK_ESCAPE)
            {
 
                game_all->GAME=0;
                atexit(SDL_Quit);
            }
        }//Конец следжения за клавой
    } //Окончание обработчкиа событий
 
 
   ++game_all.screen->frames;
 
game_all.screen->now = SDL_GetTicks();//Возвращает время в милисекундах, прошедшее с момента инициализации SDL
 
//вычисляется FPS и если он слишком высок то программа замедляеться
if ( game_all.screen->now > game_all.screen->then ) {
game_all.screen->fps= (int)((double)game_all.screen->frames*1000)/(game_all.screen->now-game_all.screen->then);
}
if ( game_all.screen->fps > FPS_LIMIT ) {SDL_Delay(1000/FPS_LIMIT);}
// Закончили с FPS
 
//mouse();
 
 
    SDL_Flip(game_all.screen->display);// Все что было отрисовано выводится на экран
    clear(game_all.screen->display);// экран отчищается и заливается указанным цветом
 
}//fx() Окончание
 
 
int main(int n, char **s)
{
    //struct screen screen;
    struct game_all context;
 
    memset(&context, 0, sizeof(context)); // обнуляем все члены структуры
    /* инициализируем */
 
    context.screen.width = 800;
    context.screen.heigth = 600;
    context.screen.full = false;
    context.GAME = true;
 
    screen(&context.screen);
 
    while(context.GAME) {
 
        fx(&context);
    }
 
        return 0;
}
То при компиляции сыпятся ошибки:
./src/freeship.cpp: In function ‘void fx(game_all*)’:
./src/freeship.cpp:78: ошибка: запрос элемента ‘screen’ в ‘game_all’, имеющего не классовый тип ‘game_all*’
./src/freeship.cpp:80: ошибка: запрос элемента ‘screen’ в ‘game_all’, имеющего не классовый тип ‘game_all*’
./src/freeship.cpp:83: ошибка: запрос элемента ‘screen’ в ‘game_all’, имеющего не классовый тип ‘game_all*’
./src/freeship.cpp:83: ошибка: запрос элемента ‘screen’ в ‘game_all’, имеющего не классовый тип ‘game_all*’
./src/freeship.cpp:84: ошибка: запрос элемента ‘screen’ в ‘game_all’, имеющего не классовый тип ‘game_all*’
./src/freeship.cpp:84: ошибка: запрос элемента ‘screen’ в ‘game_all’, имеющего не классовый тип ‘game_all*’
./src/freeship.cpp:84: ошибка: запрос элемента ‘screen’ в ‘game_all’, имеющего не классовый тип ‘game_all*’
./src/freeship.cpp:84: ошибка: запрос элемента ‘screen’ в ‘game_all’, имеющего не классовый тип ‘game_all*’
./src/freeship.cpp:86: ошибка: запрос элемента ‘screen’ в ‘game_all’, имеющего не классовый тип ‘game_all*’
./src/freeship.cpp:92: ошибка: запрос элемента ‘screen’ в ‘game_all’, имеющего не классовый тип ‘game_all*’
./src/freeship.cpp:93: ошибка: запрос элемента ‘screen’ в ‘game_all’, имеющего не классовый тип ‘game_all*’
Добавлено через 1 час 6 минут
А ктонить может пояснить вот такой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef struct WiHi
{
    SDL_Surface  *tmp;
}
WH;
WH pic[1900];
 
void loadsprite(int num, char * name)
 
{
 
pic[num].tmp=SDL_DisplayFormat(SDL_LoadBMP(name));
 
}
Можно сказать функция loadsprite понятна но не доконца так как не понятен код назначающий структуру и глобальный тип WH соответсвенно мне непонятно что такое WH pic[1900];

Насколько я понимаю сначала был создан глобальный тип WH а потом масиву pic[] размер которого 1900 ячеек присвоили этот тип, тип же WH это ни что иное как поверхность SDL_Surface *tmp.

Я не понял в строке
pic[num].tmp=SDL_DisplayFormat(SDL_LoadBMP(name) );
tmp это та самая поверхность или это просто приставка так сказать к pic[num]? Насколько я могу судить pic[num] со значениями num 1-1900 уже будут поверхностями, или я не прав?

Вообще запутался со структурами если честно Если в структуре вложена переменная то вроде все гуд а когда в труктуре вложена структура то достать её не получается какбудто её там нет. Кстати Code::Blocks так и говорил что нет в структуре game_all ничего кроме переменной GAME
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
21.02.2010, 03:06
Цитата Сообщение от vfz Посмотреть сообщение
я не создавал в нем проект я порсто открыл в нем два файлика свои.
зря)
создайте проект. там даже есть проект "SDL application"

и выложите сюда проект. сложно сказать в чем ошибка, не видя хидера с декларациями.
0
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 41
21.02.2010, 19:04  [ТС]
Создал и приложил проект. C::B стал нормально компилить код, IDE мне все больше и больше нравится, а вот со структурами никак не получается. Если в структуре game_all пишу struct screen* screen то ничего не работает, симптомы описаны выше. "Курю" бомбук.
Вложения
Тип файла: zip alternative_world.zip (60.4 Кб, 16 просмотров)
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
21.02.2010, 19:19
поправил.
Вложения
Тип файла: zip alternative world.zip (50.5 Кб, 23 просмотров)
0
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 41
21.02.2010, 19:46  [ТС]
не открывается почему то.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
21.02.2010, 19:50
и правда.
вот.
Вложения
Тип файла: 7z alternative world.7z (46.5 Кб, 16 просмотров)
0
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 41
21.02.2010, 20:05  [ТС]
Это впринципе понятно было, я не могу поправить структуру
Вот тут:
C++
1
2
3
4
struct game_all {
   bool GAME; /* Пока труе процес игры идет */
   struct screen screen;
};
сделать так:
C++
1
2
3
4
struct game_all {
   bool GAME; /* Пока труе процес игры идет */
   struct screen* screen;
};
Добавлено через 4 минуты
Добавляю функции понемногу, если есть возможность глянь(те) на

loadsprite(int num, char * name);
и
sprite(int num, float x, float y, struct screen* screen)

может не правильно что то делаю. (работает вроде все без ошибок) ругань только на charset но думаю это не страшно хотя если это можно поправить буду благодарен (проект в koi8-r из-за того что немогу найти шрифтов русский в другой кодировке)
Вложения
Тип файла: zip alternative_world.zip (1.08 Мб, 15 просмотров)
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
21.02.2010, 20:14
Цитата Сообщение от vfz Посмотреть сообщение
struct screen* screen;
для того, чтоб использовать переменную-указатель, вам придется присвоить ей адрес реального объекта.
пример 1:
C++
1
2
3
4
5
6
7
8
9
10
11
struct game_all {
   bool GAME; /* Пока труе процес игры идет */
   struct screen* screen;
};
...
int main() {
   struct screen screen;
   struct game_all game;
......
   game.screen = &screen;
}
пример 2:
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct game_all {
   bool GAME; /* Пока труе процес игры идет */
   struct screen* screen;
};
...
int main() {
   struct game_all game;
......
   game.screen = new struct screen;
или
   game.screen = (struct screen*)malloc(sizeof(struct screen));
}
в первом примере, реальную структуру screen нужно декларировать отдельно от game_all, и присваивать указателю ее адрес.
во втором примере, нужно выделить динамическую область памяти. что тоже не обязательно. оттого и лишнее.
именно по этому, я предложил декларировать ее как реальный объект. минусов нет. плюсов два.

Добавлено через 5 минут
Цитата Сообщение от vfz Посмотреть сообщение
Добавляю функции понемногу, если есть возможность глянь(те) на
ничего не понял. у меня проект скомпилился и собрался без единого вопроса.
0
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 41
21.02.2010, 20:15  [ТС]
Сделал как в первом варианте, при компиляции ругается на все строчки вида game_all->screen.now в функции fx()
Кстати под Windows компилится или в Linux?
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
21.02.2010, 20:17
Цитата Сообщение от vfz Посмотреть сообщение
Сделал как в первом варианте, при компиляции ругается на все строчки вида game_all->screen.now в функции fx()
а это забыли?
правило:
к членам структуры, которые являются указателями, обращаются при помощи "->"
к членам структуры, которые НЕ являются указателями, обращаются при помощи "."
0
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 41
21.02.2010, 21:27  [ТС]
Цитата Сообщение от niXman Посмотреть сообщение
а это забыли?
Да вроде нет

попробовал и так и сяк и опять никак. Чет у меня шурупчиков не хватает в голове наверное.

Если перестает ругатся на fx() то ругается на строки вида screen(&game.screen); и screen(&game->screen); Тоже и даже на screen(&screen);

Либо так:
/home/vitek/PROGRAMS/alternative world/alternative world/main.cpp|118|ошибка: не найден метод для преобразования в ‘(screen) (screen**)’|
либо так:
/home/vitek/PROGRAMS/alternative world/alternative world/main.cpp|120|ошибка: нет соответствующей функции для вызова ‘loadsprite(int, const char [7], screen**)’|

Ругони много кроме этого но все примено одинаково ругается
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
21.02.2010, 21:30
Цитата Сообщение от vfz Посмотреть сообщение
screen(&game.screen); и screen(&game->screen)
вам очень нужно ознакомится с указателями/ссылками.

просто дальше будет сложнее.
1
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 41
22.02.2010, 01:43  [ТС]
Подход четвертый (четвертый раз начинаю писать это сообщение и осиненный очередной мыслью останавливаюсь)

Толковая ссылка мне понравилось большое спасибо.

Разобрался. тут целая куча моментов была. Большая из которых не критична и попросту приводила к лишней трате времени на подбор -> или . теперь мне понято что есть что и почему.

Но основная трабла была в следующем
&game.screen

Знак & (амперсанд) следует читать как "адрес переменной ..." и означает адрес переменной в памяти, который будет возвращен вместо значения самой переменной.

Но функции нужен не просто адрес а значение лежащее поэтому адресу, и следовательно нужно либо просто указать саму переменную game.screen либо разыменовать её используя звездочку *game.screen

Я не нашел никакой инфы по поводу того что есть более правильно, поэтому просто написал game.screen

Раньше работало с &game.screen потому что по адресу были именно значения, но после обьявления struct screen* screen; в структуре game_all по адресу &game.screen лежит очередной адрес а не данные но с адресом то не поработаешь толком.

Если я что то не правильно понял поправте меня.

И ещё одна странность если я делаю

C++
1
2
3
void screen(struct screen* screen){
      бла бла бла
}
То вываливается ошибка чего бы я не передавал как аргумент
./main.cpp:119: ошибка: не найден метод для преобразования в ‘(screen) (screen*&)’

но после изменения имени функции на что угодно кроме screen например так:
C++
1
2
3
void screen_init(struct screen* screen){
      бла бла бла
}
Все начинает работать Почему я пока не понял.

В целом могу сказать niXman ты очень хороший учитель. Надеюсь я тебе ещё не сильно надоел
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.02.2010, 01:43
Помогаю со студенческими работами здесь

Найти простейшую формулу от трёх переменных, принимающую значение 1 только на следующих наборах значений переменных
2. Найти простейшую формулу от трёх переменных, принимающую значение 1 только на следующих наборах значений переменных: F(0,0,0) =...

Чтение имён переменных из файла и раскрытие этих переменных
Допустим есть скрипт &quot;1&quot;,в котором описано: set ueqrxbfmfi=t for /f &quot;usebackq tokens=*&quot; %%a in (&quot;test.txt&quot;) do set...

Ввести значение переменных х, у и найти значение функции z
Ввести значение переменных х, у и найти значение функции z. Вывести значения на лист эксель

Даны два файла целых чисел. Определите, больше ли min значение первого файла, чем max значение второго
1. Пусть даны два файла целых чисел. Определите, больше ли минимальное значение первого файла, чем максимальное значение второго.

Передать в WHERE несколько переменных для поиска. Какое значение показывает "любое значение"?
Вот кусок кода: if ($func==&quot;getSpecNames&quot;) { echo (&quot;Пришел запрос на сортировку&lt;br&gt;&quot;); $f = $_GET; $i = $_GET; ...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru