1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Кодерский уголок

Тема в разделе "Мастерская", создана пользователем Dimouse, 10 сен 2006.

  1. Dimouse King of Mice

    Dimouse

    Администратор Переводчик

    Регистрация:
    18 апр 2003
    Сообщения:
    35.428
    В соответствии с назначением раздела, в этой теме предполагается обсуждать конкретные вопросы, которые у вас возникают при создании своих программ (в частности - игр), помогать другим, размещать полезные ссылки на статьи и материалы, которые могут пригодиться другим.

    Что здесь не допускается:
    - беспорядочный флуд на всевозможные темы, в том числе общие обсуждения языков программирования без конкретики (карается по статье "флуд и оффтопик" *),
    - разжигания на темы "что лучше, Си или Си++ и чем они отличаются?", "какой язык программирования лучше X или Y?" и т.п. (карается по статье "флейм и участие в холиварах" *),
    - мерение пиписьками в стиле "я лучше программирую" или "ты не умеешь программировать" (карается по статье "оскорбление участников и их взглядов" *).

    Всё это допускается в специально созданной теме "Беседка для программистов или «Бутерброд с кодом».

    * по усмотрению модератора также возможно применение блокировки в данной теме.

    Оригинальное сообщение
     
    Последнее редактирование модератором: 24 ноя 2014
    CY8R4Y нравится это.
  2.  
  3. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
  4. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    @Kristobal Hozevich Hunta, а проценты посчитаем за счёт использования их Акробат ридера - превратили программу в кусок глючного говна - за это они всем нам денег должны.
     
    Bato-San нравится это.
  5. Kristobal Hozevich Hunta Реликтовый гоминид

    Kristobal Hozevich Hunta

    Регистрация:
    24 апр 2006
    Сообщения:
    1.242
    У меня foxit.

    Понял, поплыл :)
     
    Bato-San нравится это.
  6. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    У меня тоже.
     
  7. Kristobal Hozevich Hunta Реликтовый гоминид

    Kristobal Hozevich Hunta

    Регистрация:
    24 апр 2006
    Сообщения:
    1.242
    Хотелось бы понять, что происходит в этой конструкции?
    Не нахожу прототип для dynamic_cast

    Код:
    idMenuHandler_Shell * shellMgr = dynamic_cast< idMenuHandler_Shell * >( menuData );
    
    

    Offtop

    #ifndef __MENUDATA_H__
    #define __MENUDATA_H__

    enum shellAreas_t {
    SHELL_AREA_INVALID = -1,
    SHELL_AREA_START,
    SHELL_AREA_ROOT,
    SHELL_AREA_DEV,
    SHELL_AREA_CAMPAIGN,
    SHELL_AREA_LOAD,
    SHELL_AREA_SAVE,
    SHELL_AREA_NEW_GAME,
    SHELL_AREA_GAME_OPTIONS,
    SHELL_AREA_SYSTEM_OPTIONS,
    SHELL_AREA_MULTIPLAYER,
    SHELL_AREA_GAME_LOBBY,
    SHELL_AREA_STEREOSCOPICS,
    SHELL_AREA_PARTY_LOBBY,
    SHELL_AREA_SETTINGS,
    SHELL_AREA_AUDIO,
    SHELL_AREA_VIDEO,
    SHELL_AREA_KEYBOARD,
    SHELL_AREA_CONTROLS,
    SHELL_AREA_CONTROLLER_LAYOUT,
    SHELL_AREA_GAMEPAD,
    SHELL_AREA_PAUSE,
    SHELL_AREA_LEADERBOARDS,
    SHELL_AREA_PLAYSTATION,
    SHELL_AREA_DIFFICULTY,
    SHELL_AREA_RESOLUTION,
    SHELL_AREA_MATCH_SETTINGS,
    SHELL_AREA_MODE_SELECT,
    SHELL_AREA_BROWSER,
    SHELL_AREA_CREDITS,
    SHELL_NUM_AREAS
    };



    Offtop

    Есть гипотеза - это генерация имени соответствующего обработчика на основании значения menuData.
     
    Последнее редактирование: 7 сен 2015
  8. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    @Kristobal Hozevich Hunta, это ключевое слово - часть языка, как for, if и т.д. Если приведение типа возможно (т.е. это указатель действительно на объект этого класса или родственного), ты получаешь рабочий указатель. Иначе NULL. dynamic_cast требует включенной поддержки RTTI, которая в свою очередь значительно увеличивает размер бинарного кода.
    Я лично не использую RTTI в своих проектах. Если так и хочется заюзать dynamic_cast, значит я что-то неправильно спланировал изначально. Рекомендую использовать static_cast, он скажет, что тип не подходит к указателю на этапе компиляции.
     
    Последнее редактирование: 7 сен 2015
    Kristobal Hozevich Hunta нравится это.
  9. Kristobal Hozevich Hunta Реликтовый гоминид

    Kristobal Hozevich Hunta

    Регистрация:
    24 апр 2006
    Сообщения:
    1.242
    Спасибо!

    То есть применительно к вышеуказанной строке кода: если объект, на который указывает menuData, относится к классу idMenuHandler_Shell, то shellMgr присваивается ненулевое значение и далее выполняется некоторое дополнительное действие ( if (shellMgr) {...} ), иначе shellMgr == NULL и это дополнительное действие не выполняется.

    Правильно?

    З.Ы. Не совсем ясно, чем может быть оправдана такая проверка. Shell здесь - разные экранные меню. Вероятно, menuData может указывать не только на соответствующее меню, но и на какие-то иные типы данных, а дополнительное действие следует выполнять только в случае, если это экранное меню?

    Велосипед не мой :)
     
    Последнее редактирование: 8 сен 2015
  10. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    Да.
    Как я уже писал, я считаю dynamic_cast костылём при плохом продумывании архитектуры. Но после dynamic_cast проверять надо всегда.
    Ну, это у хозяев велосипеда надо спрашивать, вероятно так.
     
  11. Kristobal Hozevich Hunta Реликтовый гоминид

    Kristobal Hozevich Hunta

    Регистрация:
    24 апр 2006
    Сообщения:
    1.242
    @Steel Rat, спасибо за разъяснения.
     
  12. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    Не за что. Читай книги по С++. =)
     
  13. Kristobal Hozevich Hunta Реликтовый гоминид

    Kristobal Hozevich Hunta

    Регистрация:
    24 апр 2006
    Сообщения:
    1.242
    F1-F1-F1!

    Не могу понять, что делает этот участок кода:

    Код:
    const char * idSWF::GetTagName( swfTag_t tag ) {
    #define SWF_TAG_NAME( x ) case Tag_##x: return #x;
        switch ( tag ) {
        SWF_TAG_NAME( End );
        SWF_TAG_NAME( ShowFrame );
        SWF_TAG_NAME( DefineShape );
        SWF_TAG_NAME( PlaceObject );
        SWF_TAG_NAME( RemoveObject );
        SWF_TAG_NAME( DefineBits );
        ...
        default: return "????";
        }
    }
    
    ***************************

    Код:
    enum swfTag_t {
        Tag_End = 0,
        Tag_ShowFrame = 1,
        Tag_DefineShape = 2,
        Tag_PlaceObject = 4,
        Tag_RemoveObject = 5,
        Tag_DefineBits = 6,
         ...
    };
    
    Вобщем, я так понял, этот код возвращает строку, соответствующую имени тэга.

    Т.е. при tag = Tag_End (tag = 0) выражение idSWF::GetTagName( tag ) вернет указатель на строку "End".

    Далее всё это выводится в сообщении:

    Код:
    idLib::Printf( "Run Sprite: Unhandled tag %s\n", idSWF::GetTagName( command.tag ) );
    

    Вообще, ковырять парсер SWF, не зная толком ни С++, ни Flash, представляется верхом идиотизма. Но бросать уже как-то жалко.

     
    Последнее редактирование: 28 сен 2015
  14. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    Это скорее C, чем C++. Ваще макросы полезно использовать, особенно в таких вот случаях, как твой, для чисто визуальной приглядности кода. А понял ты всё правильно.
     
  15. Kristobal Hozevich Hunta Реликтовый гоминид

    Kristobal Hozevich Hunta

    Регистрация:
    24 апр 2006
    Сообщения:
    1.242
    "Ну продолжаем разговор" (с) Карлсон

    Есть заведомо работающий файл .срр, содержит определения функций (исходник).

    Дописываю в хвост файла свой код, использующий функции из этого файла (LoadSWF, WriteBinary).

    Получаю ошибки:

    Код:
    15    IntelliSense: identifier "LoadSWF" is undefined      ...
        17    IntelliSense: identifier "WriteBinary" is undefined    
    
    Почему "undefined"? Ведь эти функции описаны и используются в оригинальном коде парой строчек выше.

    Чувствую, пробел в системных знаниях. Помогите устранить, пожалуйста.
     
  16. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    @Kristobal Hozevich Hunta, ты свой код записываешь видимо куда то за область, где работает это самое определение. То есть оно оказывается недоступно именно твоему коду. Возможно, что оно не глобальное.
     
  17. Kristobal Hozevich Hunta Реликтовый гоминид

    Kristobal Hozevich Hunta

    Регистрация:
    24 апр 2006
    Сообщения:
    1.242
    @Bato-San, да дописываю прямо в "хвост" исходника.

    Может, это связано с тем, что данные функции - члены класса?

    Код:
    class idSWF {
    public:
    ...
    private:
       friend class idSWFSprite;
       friend class idSWFSpriteInstance;
    
       bool       LoadSWF( const char * fullpath );
       void       WriteBinary( const char * bfilename );
    
    Ы?

    Код:
    idSWF mySWF;
    ...
    
    mySWF.LoadSWF(filename);
     
    Последнее редактирование: 9 окт 2015
  18. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
    @Kristobal Hozevich Hunta, ну написано же private ! То есть они работают только внутри этого блока. Твой код должен работать в нём же. Или перенеси их в зону public.

    ытить. я просто дивлюся - незнание конструкций языка, но при этом ковыряние SWF, который сам по себе... И ведь что то ещё даже и получается. Монстр. :D
     
    Последнее редактирование: 9 окт 2015
    Kristobal Hozevich Hunta нравится это.
  19. Kristobal Hozevich Hunta Реликтовый гоминид

    Kristobal Hozevich Hunta

    Регистрация:
    24 апр 2006
    Сообщения:
    1.242
    @Bato-San, да ты Архитектор! :)
     
    Bato-San нравится это.
  20. Kristobal Hozevich Hunta Реликтовый гоминид

    Kristobal Hozevich Hunta

    Регистрация:
    24 апр 2006
    Сообщения:
    1.242
    Посоветуйте хороших книг по данной теме, пжл.

    Код:
    idSWF mySWF;
    
    mySWF.LoadSWF(filename);
    
    Выдает ошибку "no default constructor exists for class" для первой строчки.

    Код:
    idSWF LoadSWF(filename);
    Компилируется, но работает неправильно. Судя по breakpoint, функция не получает управление.
     
    Последнее редактирование: 10 окт 2015
  21. Bato-San Чеширский волк-киборг

    Bato-San

    Регистрация:
    24 июн 2010
    Сообщения:
    14.136
  22. Kristobal Hozevich Hunta Реликтовый гоминид

    Kristobal Hozevich Hunta

    Регистрация:
    24 апр 2006
    Сообщения:
    1.242
    Хм, а я не могу просто перетащить эти функции из private в public.

    Там куча используемых ими приватных переменных.

    Код:
    #define CONSOLE_COMMAND( name, comment, completion ) \ 
    void name ## _f( const idCmdArgs &args ); \ 
    idCommandLink name ## _v( #name, name ## _f, comment, completion ); \ 
    void name ## _f( const idCmdArgs &args )
    
    Код:
    class idCommandLink {
    public:
        idCommandLink( const char *cmdName, cmdFunction_t function,
            const char *description, argCompletion_t argCompletion = NULL );
        idCommandLink *    next;
        const char *    cmdName_;
        cmdFunction_t    function_;
        const char *    description_;
        argCompletion_t argCompletion_;
    };
    
    // The command system will create commands for all the static definitions
    // when it initializes.
    idCommandLink *CommandLinks( idCommandLink *cl = NULL );
    
    
    Код:
    class idSWF { public: idSWF( const char * filename, idSoundWorld * soundWorld = NULL );
    ...
    private:
    ...
    idStr filename; 
    ID_TIME_T timestamp; 
    float frameWidth; 
    float frameHeight; 
    uint16 frameRate; 
    float renderBorder; 
    float swfScale;
    
    --- добавлено 10 окт 2015, предыдущее сообщение размещено: 10 окт 2015 ---
    Бархатный, что ли?
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление