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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2011, 01:48   #11
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

зато теперь я вас понял!
ну тогда все ясно))
да. наврятли получиться без предварительной инициализации как-то использовать данные в глобальном пространстве. (ну я себе такого не могу представить)
onewho вне форума Ответить с цитированием
Старый 29.12.2011, 01:59   #12
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Не уверен, что понимаю о чем речь. Поэтому, может быть я зря влазию.
Но возможно проблема ТС связанна с тем, что порядок инициализации глобальных данных не определён.

Это означает, что если Second инициализируется раньше, чем First, но ему для работы нужны корректные данные от First, то последствия могут быть непредсказуемыми.

Лекарство: паттерн "одиночка", или "Singleton"
_Bers вне форума Ответить с цитированием
Старый 29.12.2011, 02:00   #13
mmx358
Пользователь
 
Регистрация: 28.06.2009
Сообщений: 84
По умолчанию

Вот это печалька..... Выходит, что мне все, что обращается к конкретным цветам, пихать в главный файл?
mmx358 вне форума Ответить с цитированием
Старый 29.12.2011, 02:01   #14
mmx358
Пользователь
 
Регистрация: 28.06.2009
Сообщений: 84
По умолчанию

_Bers, именно для предотвращения такой ситуации мне и приходится пихать все ... Выходит тогда, что мне даже функции описывать надо в главной функции?
mmx358 вне форума Ответить с цитированием
Старый 29.12.2011, 02:11   #15
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от mmx358 Посмотреть сообщение
_Bers, именно для предотвращения такой ситуации мне и приходится пихать все ... Выходит тогда, что мне даже функции описывать надо в главной функции?
Существует такой тезис: большое количество глобальных переменных - признак ущербной архитектуры.

Возможно ты борешься с последствиями, а не с причиной проблемы.

Чем меньше функция знает об окружении, тем ею проще управлять, и она надежнее.

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

Но если нет такой возможности - хотя бы минимизировать количество глобальных переменных. И инкапсулировать их при помощи паттерна "одиночка"

Доступ к этим данным - только через одиночку. Это гарантирует, что при первом же обращении к одиночке, одиночка проинициализируется только один раз корректными данными.
_Bers вне форума Ответить с цитированием
Старый 29.12.2011, 02:24   #16
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

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

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

Теперь по поводу того, почему я не могу сделать передачу цвета как параметра, как это сделано в остальных ф-ях. Дело в том, что есть функция, которая выводит на экран графический объект такого цвета, который зависит от случайного числа. Т.е. на функция возложена обязанность рисовать не каким-то цветом, который ей передается как параметр, а именно одним из конкретных цветов. Короче говоря, в ф-ции присутсвтуют идентификаторы цветов (yellow, red, ..... ), но в этом случае цвета "не работают", т.е. выводится "пустое" изображение, хотя, если вставить тело функции в главную функцию, то все работает.

Есть какие-то правильные решения? Мне пока что приходит в голову безумная идея создать массив цветов и передавать его по значению или указатель в функции. Хотя мне такой вариант совсем не нравится. Что вы можете посоветовать?
mmx358 вне форума Ответить с цитированием
Старый 29.12.2011, 14:09   #18
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

генерить случайное число вне функции.
onewho вне форума Ответить с цитированием
Старый 29.12.2011, 15:10   #19
mmx358
Пользователь
 
Регистрация: 28.06.2009
Сообщений: 84
По умолчанию

onewho, дээээ, придется размазывать алгоритм по файлам... очень жаль... Наверное, когда завершу эту программу, буду изучать OpenGL, что-то мне подсказывает, что с ним не будет такого геморроя касательно графики.
mmx358 вне форума Ответить с цитированием
Старый 29.12.2011, 21:01   #20
ElectroMent
Пользователь
 
Регистрация: 28.12.2011
Сообщений: 27
По умолчанию

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


пусть будет файл graph.h в нем обьявляем глобальный указатель на обьект экрана


Код:
extern SDL_Surface *pScreen;
extern void InitScreen();
в файле graph.c определяешь

Код:
SDL_Surface *pScreen = NULL;
void InitScreen()
{
   pScreen = ...
}
во всех файлах, где требуется использовать глобальный pScreen main.c и algor.c

обьявляешь

Код:
extern SDL_Surface *pScreen;
где будет инициализация pScreen проходить надо написать

Код:
extern void InitScreen();
и не забыть вызвать функцию инициализации InitScreen()

теперь можешь использовать pScreen где надо и все будет путем.


Касательно твоих цветов. Рассмотрим на примере 1 цвета.

В файле graph.h в нем обьявляем глобальный цвет в формате RGB

Код:
extern Uint32 yellow;

extern bool InitColorTable(); //функция инициализирует цвета
в файле graph.c определяешь

Код:
Uint32 yellow = 0;

bool InitColorTable()
{
   if( !pScreen ) 
        return false;
   yellow = SDL_MapRGB( pScreen->format, 0xff, 0xff, 0x00);
   return true;
}
во всех файлах, где требуется использовать глобальный цвет

обьявляешь

Код:
extern Uint32 yellow;
где будет инициализация цветов проходить надо написать

Код:
extern bool InitColorTable();
и не забыть вызвать InitColorTable()

и дальше смело юзать цвета. Иначе они будут "черные".
ElectroMent вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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