Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2011, 20:38   #1
mmx358
Пользователь
 
Регистрация: 28.06.2009
Сообщений: 84
По умолчанию Разбиение программы, использующей SDL, на модули

Всем доброго времени суток!

Я начал писать графическую программу с использованием SDL.

Я хотел разбить текст на несколько файлов (модулей), например:

main.c - содержит главную функцию, инициализация и закрытие SDL систем
graph.c - содержит необходимые графические функции
algor.c - содержит алгоритм программы.

Однако, я столкнулся со следующей проблемой (вполне естественной): при переносе функций из файла main.c в файл graph.c функции, в которых используется указатель на рабочую поверхность, перестают работать, т.к. указатель определен в другом файле. Я решил это, передавая указатель по ссылке.


Определение указателя в файле main.c:
Код:
SDL_Surface *screen;
Заголовки функций (в заголовочном файле, сами ф-ции описаны в файле graph.c):
Код:
Uint32 getpixel(SDL_Surface *surface, int x, int y);
void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel);
void line(SDL_Surface *surface, int x1, int y1, int x2, int y2, Uint32 pixel);
void fill( SDL_Surface *surface, int x1, int y1, int x2, int y2, Uint32 pixel );
void rect( SDL_Surface *surface, int x1, int y1, int x2, int y2, Uint32 pixel, Uint32 filling );
void putBlock( SDL_Surface *surface, int x1, int y1, Uint32 filling );
void drawGlass( SDL_Surface *surface, int x1, int y1, int width, int height, /*Uint32 pixel,*/ /*SDL*/Uint32 filling );
Пример вызова ф-ции:
Код:
drawGlass( screen, globalX, globalY, WIDTH, HEIGHT, darkgrey );

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

Но самая мерзкая проблема кроется в другом. Насколько я понял, цвета можно задать таким образом:
Код:
Uint32
yellow = SDL_MapRGB(screen->format, 0xff, 0xff, 0x00),
red = SDL_MapRGB(screen->format, 0xff, 0x00, 0x00),
green = SDL_MapRGB(screen->format, 0x00, 0xff, 0x00),
blue = SDL_MapRGB(screen->format, 0x00, 0x00, 0xff),
white = SDL_MapRGB(screen->format, 0xff, 0xff, 0xff),
black = SDL_MapRGB(screen->format, 0x00, 0x00, 0x00),
grey = SDL_MapRGB(screen->format, 0xaa, 0xaa, 0xaa),
darkgrey = SDL_MapRGB(screen->format, 0x55, 0x55, 0x55);
Однако задать их таким образом возможно после инициализации графической системы SDL, т.е. в главной функции. Следовательно, эта переменная локальная, видна только в главной фукции.

При использовании цветов где-то за пределами данной ф-ции программа компилируется и запускается, однако, на экране не появляется ничего. Я так понимаю, что цвета оказываются "никакими", т.е. перестают существовать, хотя идентификатор остается (скажите, пожалуйста, как это называется, потому что цвета "никакие" - просто смешно звучит, но не знаю, к сожалению, как это правильно называется). Модификатор "static" перед ними поставить не удается, компилятор сообщает об ошибке. Объявление их сначала как глобальных переменных (т.е. перечисление идентификаторов) тоже ничего не дает: цвета по-прежнему работают в пределах главной ф-ции, но не дают ничего вне ее.

Задача: сделать цвета и указатель на рабочую поверхность видимыми как за пределами главной ф-ции в пределах этого файла, так и за пределами этого файла, т.е. видимыми ВЕЗДЕ.

Понимаю, что звучит забавно это все, но я, правда, не знаю, как выйти из положения, мне совсем не смешно. Либо я не разбираюсь в зонах действия переменных, либо не понимаю чего-то в SDL (а я в нем практически ничего не понимаю), либо и то, и другое.

Помогите, пожалуйста! На форуме явно есть люди, имеющие дело с SDL и наверняка нашли решение моей задачи.

Спасибо за внимание!
mmx358 вне форума Ответить с цитированием
Старый 28.12.2011, 21:09   #2
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

а цвет в функции в кач-ве параметра передавать ?
onewho вне форума Ответить с цитированием
Старый 28.12.2011, 21:11   #3
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

инициализировал в мейне, уже готовые передаёшь в заголовочные функции, что не так?
onewho вне форума Ответить с цитированием
Старый 28.12.2011, 21:26   #4
mmx358
Пользователь
 
Регистрация: 28.06.2009
Сообщений: 84
По умолчанию

onewho, да, это работает, когда в этих функциях не указывается непосредственно идентификатор какого-либо цвета. Если же хочу в функции сделать выбор из цветов, или использовать конкретный цвет, например, так:
Код:
putBlock( screen, ... , yellow );
Вот тут-то и не работает.
mmx358 вне форума Ответить с цитированием
Старый 28.12.2011, 21:52   #5
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

да? странно.
может у вас в другом ошибка?
работает без кучи разных файлов?
попробуй непосредственно тело функций вставить вместо вызова.

по сути переменная int , какие м.б. проблемы с передачей
onewho вне форума Ответить с цитированием
Старый 28.12.2011, 22:17   #6
mmx358
Пользователь
 
Регистрация: 28.06.2009
Сообщений: 84
По умолчанию

onewho, если ставить непосредственно тело функции, то работает.
mmx358 вне форума Ответить с цитированием
Старый 29.12.2011, 00:30   #7
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

а параметр SDL_Surface *surface не изменяется в функции?
попробуй передать его по ссылке на указатель.
onewho вне форума Ответить с цитированием
Старый 29.12.2011, 01:15   #8
mmx358
Пользователь
 
Регистрация: 28.06.2009
Сообщений: 84
По умолчанию

onewho, ф-ии, которые находятся вне файла с главной функцией, его не видят.
mmx358 вне форума Ответить с цитированием
Старый 29.12.2011, 01:25   #9
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

Код:
void putBlock( SDL_Surface*& surface, int x1, int y1, Uint32 filling );
попробуй.
onewho вне форума Ответить с цитированием
Старый 29.12.2011, 01:44   #10
mmx358
Пользователь
 
Регистрация: 28.06.2009
Сообщений: 84
По умолчанию

onewho, а зачем это? У меня и без него работает. Я просто хочу использовать непосредственно указатель "screen" в телах ф-ий, а не передавать его как параметр. То же касается и цветов. Или я вас не понимаю?
mmx358 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разделение программы на отдельные модули (Паскаль) Olya1 Помощь студентам 1 08.07.2011 11:25
Разбиение программы на модули Neolit1819 Общие вопросы C/C++ 4 11.04.2011 19:14
разбиение программы на модули SUDALV Помощь студентам 1 22.06.2010 22:01
Создание программы использующей ICQ протокол SuBwooFer Общие вопросы C/C++ 1 17.01.2010 13:50
Рзработка модуля и программы использующей этот модуль (Delphi) Sonny01 Помощь студентам 2 07.11.2009 17:26