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

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

07.12.2009, 00:10. Показов 11103. Ответов 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
22.01.2010, 10:03
Студворк — интернет-сервис помощи студентам
vfz, дружище, я собрал твой проект, запустил - работает. ошибка сегментирования так же присутствует. хотел было разобраться с этим, но застыл в ступоре.
немного критики: код ужасен. глобальных переменных куча! разбросаны по разным файлам. доступ к ним так же, происходит из функций лежащих в разных файлах. это основная причина появления ошибки сегментирования. в остальном тоже плохо. я бы порекомендовал начать все с нуля. переменные в структуры. никаких глобальных переменных. переменные группировать по назначению. структуры можно делать вложенными. и т.д. и т.п...
1
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 41
22.01.2010, 12:14  [ТС]
Спасибо за конструктивную критику Я сильно и не сомневался что код ужасный, это как никак мой первый опыт

Попробую разобраться. Видимо Последую совету и перепишу с нуля.

Если чуть пояснишь кое что буду благодарен:
глобальных переменных куча - что это значит? Можно пример и как поправить

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

Насчет структур меня тоже пугали мол не увлекайся ими сильно.

Что имеется в веду под выражением все переменные в структуру. Зачем и как это должно выглядеть, ну хоть примерно.

В чем минус глобальных переменных, и собственно что считать глобальной переменной?
Группировать переменые я вроде как пробую но чисто визуально для себя.

Хочу что нить толковое по структурам почитать может есть ссылка какая нибудь поиск дело полезное но слишком много инфы и определить какая стоящая а какая нет сложно будучи новичком.

Может есть что то вроде короткого этикета программиста?
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
22.01.2010, 12:38
Цитата Сообщение от vfz Посмотреть сообщение
глобальных переменных куча - что это значит? Можно пример и как поправить
C
1
2
3
4
5
6
7
8
9
10
11
12
13
int var = 0; /* глобальная */
 
int func() {
   int var = 0; /* локальная */
}
 
struct point {
   int x; /* члены-данные структуры.
                 но и переменные типа структур не нужно делать глобальными.
                 все переменные в программе должны передаваться как аргументы.
              */
   int y;
};
1
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 41
23.01.2010, 00:33  [ТС]
Цитата Сообщение от niXman Посмотреть сообщение
все переменные в программе должны передаваться как аргументы
Это как? поясни.
И ещё вопрос
вот структра:

C++
1
2
3
4
5
6
7
struct point {
   int x; /* члены-данные структуры.
                 но и переменные типа структур не нужно делать глобальными.
                 все переменные в программе должны передаваться как аргументы.
              */
   int y;
};
Как будет выглятеь правильное её использование, остальное по поваду глобальных локальных переменных кажется догоняю немного.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
23.01.2010, 01:28
вариант для Си.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
struct point get_position() {
...
}
 
void set_position(const struct point* p) { /* константный указатель */
...
}
 
int main() {
   struct point cur = get_position();
   ...
   set_position(&cur); /* получаем адрес переменной */
}
вариант для С++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
point get_position() {
...
}
 
void set_position(const point& p) { /* константная ссылка */
...
}
 
int main() {
   point cur = get_position();
   ...
   set_position(cur); /* автоматически передается по константной ссылке */
}
зарница в том, что в С++ не нужно использовать ключевое слово "struct" при декларации переменных этого типа. и в том, что в С++ есть ссылки.
я так понял, что ты пишешь на Си? почему не С++? проще.
0
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 41
31.01.2010, 01:04  [ТС]
Я стараюсь ориентироватся на C++ но я то не имею хорошего представления что есть что На счет того что слово "struct" в С++ не нужено я помню, просто оно было в примере который я использовал. Сейчас потихоньку буду переписывать код. Но со структурами мне так и не ясно много. Например в структуре сейчас хранятся картинки если она не будет глобальной то как вызывать её там где мне нужно скажем в функции для загрузки картинок я объявлю структуру как на неё сослатся в функции для вывода картинки на поверхность?
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
31.01.2010, 01:17
много букаф, и ничего не понятно. показывай лучше на примере краткого кода иллюстрирующего вопрос.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
01.02.2010, 21:23
Цитата Сообщение от vfz Посмотреть сообщение
На счет того что слово "struct" в С++ не нужено
очень даже нужно. в с++ struct и class - одно и то же. за исключением режима доступа по умолчанию. для struct он открытый. для class он закрытый.
0
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 41
02.02.2010, 20:25  [ТС]
Ну вот запутал меня окончательно
Сейчас с работой немного разгребусь и начну переписывать то что написал ранее.

У меня вопрос как правильно это оформить, я про кол-во файлов.

Я думаю сделать так ./heders/ingame.h Будет содержать весь код фактически и ./src/game.cpp будет примерно таким:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "../heders/ingame.h"
 
int main(int n, char **s) 
{
   
    while (GAME) 
    {
    
           function1();
           function2(параметр0, параметр1, параметр2);
 
        }
 
        return 0;
}
Насколько это правильно? Как наиболее правильно оформить проект?
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
02.02.2010, 20:27
Цитата Сообщение от vfz Посмотреть сообщение
Ну вот запутал меня окончательно
я не нарочно


Цитата Сообщение от vfz Посмотреть сообщение
GAME
это "кто"?
0
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 41
03.02.2010, 01:45  [ТС]
Цитата Сообщение от niXman Посмотреть сообщение
я не нарочно
Этож даже хорошо что запутал

GAME В данном случае это глобальная переменная пока она "истина" выполняется основной цикл программы если оно обнулилась или стала false то программа завершается.

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

и вообще, сделайте список с именами переменных и пояснением их назначения. покажу вам как избавится от всех глобальных переменных, и сделать код очень поддерживаемым.
0
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 41
08.02.2010, 02:26  [ТС]
Список переменных с описание сделать будет не намного легче чем переписать код ибо их наплодилось немало.

Код начал переписывать сегодня. Дабы сделать GAME локальной сделал так:
C++
1
2
3
4
5
6
7
8
int main(int n, char **s) 
{
    for (int GAME=1; GAME>0) 
    {
    
    }
        return 0;
}
Буду переписывать и сразу составлять описание переменных и функций, может потом будет легче Пока меня всё это забавляет, даже подумываю, а не выделить ли под это дело место на сервачке и доменное имя. Сотрудников построить бы как надо, чтобы за ними по пятам не ходить, и ваще класс будет (а то уже до смешного иной раз доходит, а диск говорят как разбить и это блин крутые линуксойды Гентушники со стажем)
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
08.02.2010, 02:31
переменная GAME живет все время пока работает программа?
если так, то объявите ее в мэйн.

Добавлено через 2 минуты
Цитата Сообщение от vfz Посмотреть сообщение
Пока меня всё это забавляет, даже подумываю, а не выделить ли под это дело место на сервачке и доменное имя. Сотрудников построить бы как надо, чтобы за ними по пятам не ходить, и ваще класс будет (а то уже до смешного иной раз доходит, а диск говорят как разбить и это блин крутые линуксойды Гентушники со стажем)
что-то не улавливаю. о чем речь?
0
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 41
08.02.2010, 12:06  [ТС]
Цитата Сообщение от niXman Посмотреть сообщение
что-то не улавливаю. о чем речь?
Мысли в слух. Времени не много на кодерство (хотя мне нравится кодить), ибо много работы а подчиненные после праздников голову включить забыли.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
08.02.2010, 13:52
Цитата Сообщение от vfz Посмотреть сообщение
подчиненные после праздников голову включить забыли.
это нормально
0
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 41
16.02.2010, 02:43  [ТС]
И так я все же дополз до своего развлечения
И столкнулся с проблемой

Файл freeshep.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
26
27
28
29
30
31
32
33
34
35
36
#include "../heders/ingame.h"
 
int main(int n, char **s) 
{
 
int GAME=1; 
//FPS LIMIT
#define FPS_LIMIT 75
 
Uint32 then, now, frames; //Переменные для слежения за FPS
 
int fps;
 
//END 
 
SDL_Surface *display; // Создать поверхность дисплей
SDL_Event event;         // переменная обработки событий все события будут складыватся в переменную event
Uint8* keys;
 
TTF_Font *fnt;           // Инициализация шрифта SDL
 
 
 
screen (800,600,0);
 
    while(GAME) 
    {
        
        
        
   }
 
 
      
        return 0;
}
Файл ../heders/ingame.h
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
#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>
 
void clear()// функция Закрашивает экран указаным цветом можно добавить принимаемые параметры но пока нет нужды
 
{
 
    SDL_FillRect(display, NULL, SDL_MapRGB(display->format, 0, 0, 4));
 
}
// Основная функция игры тут происходит оценка всех событий и производятся действия
void fx()
 
{
 
    //Обработчик событий, если что то произошло например нажата клавиша, то будет выполнятся цикл
   while (SDL_PollEvent(&event)) 
 
   {
 
        // если нажата любая кнопка, для обработки отпускания кнопки используется SDL_KEUP
        if (event.type==SDL_KEYDOWN) 
 
        {
        // Тут SDL хранит события нажатий клавишь - event.key.keysym.sym
 
        if(event.key.keysym.sym==SDLK_ESCAPE)
 
          {          
             GAME=0;
             SDL_Quit();
 
          }
 
       }//Конец обработки нажатых клавиш
 
    }// Конец обработки событий
 
 
 
keys=SDL_GetKeyState(NULL); 
// Возращает состояние клавиатуры в виде массива Значение ячейки либо 1 клавиша нажата либо 0 клавиша отпущена
    
 
//FPS LIMIT
++frames; 
 
 
now = SDL_GetTicks();//Возвращает время в милисекундах, прошедшее с момента инициализации SDL
 
 
//вычисляется FPS и если он слишком высок то программа замедляеться
if ( now > then ) {
 
fps= (int)((double)frames*1000)/(now-then);
 
} 
 
if ( fps > FPS_LIMIT ) {SDL_Delay(1000/FPS_LIMIT);}
 
// Закончили с FPS
 
 
SDL_Flip(display);// Все что было отрисовано выводится на экран
 
clear();// экран отчищается и заливается указанным цветом
 
}/* Окончание функции fx()*/
 
 
 
//Устанока полноэкранного режима или оконного если full=0
// Тут же может проходить инициализация аудио систем и т.п.
 
void screen(int w, int h, int full)
 
{
 
 SDL_Init (SDL_INIT_VIDEO|SDL_INIT_TIMER);
 if(full){      
            display = SDL_SetVideoMode (w, h, 0, SDL_SWSURFACE | SDL_ANYFORMAT|SDL_FULLSCREEN);
            }
 if(!full){     
                display = SDL_SetVideoMode (w, h, 0, SDL_SWSURFACE | SDL_ANYFORMAT);
             }
 
 TTF_Init();
 
 fnt = TTF_OpenFont("./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
 
 frames = 0;
 
 then = SDL_GetTicks(); 
 
}

в функции fx() используются переменные
C++
1
2
Uint32 then, now, frames;
int fps;
При компиляции получаем естественно ошибок с три короба
./src/../heders/ingame.h: In function ‘void clear()’:
./src/../heders/ingame.h:13: ошибка: нет декларации ‘display’ в этой области видимости
./src/../heders/ingame.h: In function ‘void fx()’:
./src/../heders/ingame.h:19: ошибка: нет декларации ‘event’ в этой области видимости
./src/../heders/ingame.h:27: ошибка: нет декларации ‘GAME’ в этой области видимости
./src/../heders/ingame.h:33: ошибка: нет декларации ‘keys’ в этой области видимости
./src/../heders/ingame.h:37: ошибка: нет декларации ‘frames’ в этой области видимости
./src/../heders/ingame.h:39: ошибка: нет декларации ‘now’ в этой области видимости
./src/../heders/ingame.h:43: ошибка: нет декларации ‘then’ в этой области видимости
./src/../heders/ingame.h:44: ошибка: нет декларации ‘fps’ в этой области видимости
./src/../heders/ingame.h:46: ошибка: нет декларации ‘fps’ в этой области видимости
./src/../heders/ingame.h:46: ошибка: нет декларации ‘FPS_LIMIT’ в этой области видимости
./src/../heders/ingame.h:49: ошибка: нет декларации ‘display’ в этой области видимости
./src/../heders/ingame.h: In function ‘void screen(int, int, int)’:
./src/../heders/ingame.h:60: ошибка: нет декларации ‘display’ в этой области видимости
./src/../heders/ingame.h:63: ошибка: нет декларации ‘display’ в этой области видимости
./src/../heders/ingame.h:66: ошибка: нет декларации ‘fnt’ в этой области видимости
./src/../heders/ingame.h:73: ошибка: нет декларации ‘frames’ в этой области видимости
./src/../heders/ingame.h:74: ошибка: нет декларации ‘then’ в этой области видимости
Меня это не смущает, оно и понятно функция clear() и fx() в коде получаются раньше нежели объявление переменных которыми они пользуются. как поправить и оставить переменные локальными а не глобальными мозгов не хватает.

Добавлено через 2 минуты
А вот так

Файл freeshep.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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#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>
 
int main(int n, char **s) 
{
 
int GAME=1; 
//FPS LIMIT
#define FPS_LIMIT 75
 
Uint32 then, now, frames; //Переменные для слежения за FPS
 
int fps;
 
//END 
 
SDL_Surface *display; // Создать поверхность дисплей
SDL_Event event;      // переменная обработки событий все события будут складыватся в переменную event
Uint8* keys;
 
TTF_Font *fnt;       // Инициализация шрифта SDL
 
#include "../heders/ingame.h"
 
 
screen (800,600,0);
 
    while(GAME) 
    {
        
        fx();
        
   }
 
 
      
        return 0;
}
Файл ../heders/ingame.h
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
// функция Закрашивает экран указаным цветом можно добавить принимаемые параметры но пока нет нужды
void clear()
{
 
    SDL_FillRect(display, NULL, SDL_MapRGB(display->format, 0, 0, 4));
 
}
// Основная функция игры тут происходит оценка всех событий и производятся действия
void fx()
 
{
 
    //Обработчик событий, если что то произошло например нажата клавиша, то будет выполнятся цикл
   while (SDL_PollEvent(&event)) 
 
   {
 
        // если нажата любая кнопка, для обработки отпускания кнопки используется SDL_KEUP
        if (event.type==SDL_KEYDOWN) 
 
        {
        // Тут SDL хранит события нажатий клавишь - event.key.keysym.sym
 
        if(event.key.keysym.sym==SDLK_ESCAPE)
 
          {          
             GAME=0;
             SDL_Quit();
 
          }
 
       }//Конец обработки нажатых клавиш
 
    }// Конец обработки событий
 
 
 
keys=SDL_GetKeyState(NULL); 
// Возращает состояние клавиатуры в виде массива Значение ячейки либо 1 клавиша нажата либо 0 клавиша отпущена
    
 
//FPS LIMIT
++frames; 
 
 
now = SDL_GetTicks();//Возвращает время в милисекундах, прошедшее с момента инициализации SDL
 
 
//вычисляется FPS и если он слишком высок то программа замедляеться
if ( now > then ) {
 
fps= (int)((double)frames*1000)/(now-then);
 
} 
 
if ( fps > FPS_LIMIT ) {SDL_Delay(1000/FPS_LIMIT);}
 
// Закончили с FPS
 
SDL_Flip(display);// Все что было отрисовано выводится на экран
 
clear();// экран отчищается и заливается указанным цветом
 
}
/* Окончание функции fx()*/
 
 
 
//Устанока полноэкранного режима или оконного если full=0
// Тут же может проходить инициализация аудио систем и т.п.
 
void screen(int w, int h, int full)
 
{
 
 SDL_Init (SDL_INIT_VIDEO|SDL_INIT_TIMER);
 if(full){      
            display = SDL_SetVideoMode (w, h, 0, SDL_SWSURFACE | SDL_ANYFORMAT|SDL_FULLSCREEN);
            }
 if(!full){     
                display = SDL_SetVideoMode (w, h, 0, SDL_SWSURFACE | SDL_ANYFORMAT);
             }
 
 TTF_Init();
 
 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
 
 frames = 0;
 
 then = SDL_GetTicks(); 
 
}
получаю ругань следующего вида:
$ make
g++ -o ingame.run ./src/freeship.cpp `sdl-config --libs` -lSDL_ttf -lSDL_mixer
In file included from ./src/freeship.cpp:25:
./src/../heders/ingame.h: In function ‘int main(int, char**)’:
./src/../heders/ingame.h:3: ошибка: a function-definition is not allowed here before ‘{’ token
./src/../heders/ingame.h:8: ошибка: a function-definition is not allowed here before ‘{’ token
./src/freeship.cpp:40: ошибка: expected `}' at end of input
make: *** [all] Ошибка 1
Добавлено через 38 минут
Появилась мысль может глупая конечно но всеже

заводим функцию
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void inicializaciya()
{
 
int GAME=1; 
//FPS LIMIT
#define FPS_LIMIT 75
 
Uint32 then, now, frames; //Переменные для следения за FPS
 
int fps;
 
//END 
 
SDL_Surface *display; // Создать поверхность дисплей
SDL_Event event;         // переменная обработки событий все события будут складыватся в переменную event
Uint8* keys;
 
TTF_Font *fnt;           // Инициализация шрифта SDL
}
И вызываем её в main и используем ссылки в функциях fx() clear() и screen()
Пошел разбираться с использование ссылок, может не лень будет показать на примере, буду благодарен.

Добавлено через 1 час 20 минут
Как это не смешно но с ошибкой сигментирования я разобрался, дело бвло в том что выход из программы проходил не корректно по сути она просто падала от сюда и ошибка. А вот с избавление от глобальных переменных я только запутался, но убедился в том что все же от них нужно по максимуму отказаться. Нашел пару статей и уроков по ссылкам но так ничего и не получилось, если я инициализирую SDL_Surface* не глобально то программа падает не успев запустится. если инизиализирую переменные SDL в main то при компиляции получаю выше процетированную ошибку.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
16.02.2010, 08:11
группируем переменные в структуру, для обобщенности и простоты доступа.
так же, структуры могут быть сложенными. т.е. к примеру, в структуре game_context у нас все необходимые переменные. допустим их много(иногда бывает оч много). для простоты понимания и использования таких структур, их разбивают на подструктуры(по категориям/назначению).

пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct screen {
   int width;
   int heigth;
   int full;
};
 
struct environ {
   char* font;
   char* screenshotspath;
};
 
struct game_context {
   int GAME;
   struct screen screen;
   struct environ env;
};
и что в итоге? - а то, что у нас одна структура, предоставляющая доступ к другим структурам. т.е. мы инстинктивно понимаем, что высота/ширина экрана, логично расположить в структуре screen.

как это используется на практике:
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
struct screen {
   TTF_Font *fnt;
   SDL_Surface *display;
   int width;
   int heigth;
   bool full; /* логичнее использовать булевую переменную */
};
 
struct environ {
   char* font;
   char* screenshotspath;
};
 
struct game_context {
   bool GAME; /* логичнее использовать булевую переменную */
   struct screen screen;
   struct environ env;
};
...
screen(struct screen* screen) {
   SDL_Init (SDL_INIT_VIDEO|SDL_INIT_TIMER);
   if(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
 
 frames = 0;
 
 then = SDL_GetTicks(); 
 
}
...
main() {
   struct game_context context;
   memset(&context, 0, sizeof(context)); // обнуляем все члены структуры
   /* инициализируем */
   context.screen.width = 800;
   context.screen.heigth = 600;
   context.screen.full = true;
 
   context.env.font = "./fonts/courier.ttf";
   context.env.screenshotspath = "$(HOME)/game/screenshots";
 
   context.GAME = true;
 
   screen(&context.screen); /* все примитивно просто и понятно */
}
в общем, внимательно изучите код.
так же, предлагаю, прежде чем продолжить, решить вопрос со структурами. иначе путаница будет ацкая.
0
1 / 1 / 0
Регистрация: 06.12.2009
Сообщений: 41
18.02.2010, 00:25  [ТС]
Но насколько я понимаю в таком случае структуры будут глобальными.

И ещё вопрос эта строка просто создает синоним к структуре?
struct game_context context;

И и окуда взяличь width heigth и так далее вот тут:
C++
1
2
3
4
5
6
  context.screen.width = 800;
  context.screen.heigth = 600;
   context.screen.full = true;
 
   context.env.font = "./fonts/courier.ttf";
   context.env.screenshotspath = "$(HOME)/game/screenshots";
Вернее откуда они берутся я впринципе как бы вижу, я связи не вижу логической.
0
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
18.02.2010, 01:21
Я тоже начинающий(только без опыта в других языках),не претендую на знания,но тоже немного ковырял SDL. Проверь,что значения пикселей не пишутся за пределы экрана,а также что правильно выставляется режим видео,используй флаг SDL_ANYFORMAT. Я много раз путался с пределами экрана,так как индексы массивов начинаются с 0..
И ещё есть хорошая функция SDL_VideoModeOK,может поможет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.02.2010, 01:21
Помогаю со студенческими работами здесь

Найти простейшую формулу от трёх переменных, принимающую значение 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; ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru