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.153
    В соответствии с назначением раздела, в этой теме предполагается обсуждать конкретные вопросы, которые у вас возникают при создании своих программ (в частности - игр), помогать другим, размещать полезные ссылки на статьи и материалы, которые могут пригодиться другим.

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

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

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

    Оригинальное сообщение
     
    Последнее редактирование модератором: 24 ноя 2014
    CY8R4Y нравится это.
  2.  
  3. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Не уловил. Расскажи подробнее. Если в начале на счётчике, к примеру, 65530 и надо подождать 10, то что получится?

    ---------- Сообщение добавлено в 21:59 ---------- Предыдущее сообщение размещено в 21:53 ----------

    Ага, вспомнил. У ЕМНИП Кнута было что-то такое:
    Код:
    start_counter = custom_counter;
    while ( ( custom_counter - start_counter ) < delay ) {
    Этот кусок работает железно, плюя с высокой горки на переполнения. При условии, конечно, что разрядности одинаковы.
     
  4. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Рыжий Тигра,
    Ну да, я давно написал
    Код:
    void synchronize(u32 vcpu_ticks_target)
    {
        u32 timer_ticks_target;
        vcpu_ticks_target -= vcpu_ticks_base;
        // Adjust base
        while (vcpu_ticks_target > V_CPU_FREQ) {
            vcpu_ticks_target -= V_CPU_FREQ;
            vcpu_ticks_base += V_CPU_FREQ;
            timer_ticks_base += PC_TIMER_FREQ;
        }
    
        // Assumed that V_CPU_FREQ <= PC_TIMER_FREQ !!!
        timer_ticks_target = timer_ticks_base + vcpu_ticks_target + (u32)(vcpu_ticks_target * V_SCALE >> 32);
        while ((s32)(timer_ticks - timer_ticks_target) < 0) {
            // Halt
        }
    }
    Но сейчас решаем непонятки с гитхабом и я так и не собрался его вписать :) Только тут немного хитрее сделано - и конверсия частоты, и проверка условия в цикле :) Типа оптимизация.

    ---------- Сообщение добавлено в 00:50 ---------- Предыдущее сообщение размещено в 00:44 ----------

    И кстати, код библиотеки - тормозное многословное C++ - шное гуано. Сделаем сначала синхронизацию в нем, но надо копать в другую сторону.
     
    Последнее редактирование: 10 фев 2015
    AxXxB и Bato-San нравится это.
  5. AxXxB неадекват

    AxXxB

    Хелпер Переводчик

    Регистрация:
    13 ноя 2006
    Сообщения:
    1.663
    nop, кстати, ты не знаешь, что там в библиотеке происходит при
    Код:
    ioctl(m_handle, HSID_IOCTL_DELAY, cycles);
    ? Весь код-таки на этом месте задерживается?
     
  6. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    AxXxB, А что тут знать? у драйвера hardSID вызывается функция delay.
     
    AxXxB нравится это.
  7. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    nop действительно сделал работающую задержку для плеера:



    В процессе проигрывания иногда слышны громкие глюки, но это проблема не таймера, наверное, я просто что-то пропустил. Надо будет все проверить.
     
    Последнее редактирование модератором: 12 июн 2015
    Bato-San нравится это.
  8. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Нашёл и исправил несколько мелких, но досадных ошибок в макрах сортировки-поиска. Кто брал - пожалуйста, обновите!

    ---------- Сообщение добавлено в 12:12 ---------- Предыдущее сообщение размещено в 12:02 ----------

    Туплю: в какой из используемых в функции переменных обновляются показания наймера? Если не трудно, явно обозначь её как volatile.
     
  9. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Рыжий Тигра нравится это.
  10. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Ничего я не пропустил. У меня был просто битый MOS6581, с неработающим фильтром. Из Германии заказали партию новых (точнее, new old stock) 8580R5 - играют отлично, никаких глюков.
     
  11. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    Есть мысль такая. Хочу на ноуте задействовать GPS/ГЛОНАСС приёмник с телефона или планшета с Андроидом. Т.е. надо сервер на ведро, который по вайфаю будет передавать координаты и надо клиент для винды, который будет ловить эти сигналы, а сам для программ виндовых типа SAS Planet прикидываться железным девайсом, собсна, GPS приёмником. Вот, во-первых, идея витает в воздухе, поэтому наверняка где-то есть готовые такие штуки? Во-вторых, если нет, то как эмулировать девайс? В-третьих, может есть способы удобнее и/или лучше?
     
  12. MisterGrim Very old

    MisterGrim

    Legacy

    Регистрация:
    29 ноя 2007
    Сообщения:
    25.423
    Steel Rat нравится это.
  13. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    MisterGrim, во блин, а я искал несколько часов!
    А может ещё и по wi-fi найдёшь? Цены тебе не будет! =) А то придётся блютусинку покупать.
     
    Последнее редактирование: 15 мар 2015
  14. MisterGrim Very old

    MisterGrim

    Legacy

    Регистрация:
    29 ноя 2007
    Сообщения:
    25.423
    Дело в том, что — если не ошибаюсь — софт желает видеть GPS-приёмник на COM-порте. Что в случае с bluetooth реализовано изначально, а вот с вайфаем нужны будут какие-то эмуляторы… вряд ли кто заморачивался.
     
    Последнее редактирование: 18 мар 2015
  15. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    MisterGrim, ну да, похоже на то. Хорошо что приёмник блютуса на порядок дешевле приёмника GPS. Ещё раз спасибо.
     
  16. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Народ, кто в курсе - подскажите, как сделать вот такой трюк.

    sometype.h:
    Код:
    typedef struct somestruct_s sometype_t; /* можно юзать только указатель на */
    #define SIZEOF_SOMETYPE_T /* его размер */ сколько-то-байт
    // и вот такая, к примеру, функция:
    sometype_t somefunction( sometype_t *arg );
    sometype.c:
    Код:
    typedef struct somestruct_s {
      /* какие-то данные каких-то типов */
    } sometype_t;
    
    [B][COLOR="Blue"]/* проверим соответствие размера: */
    #if ( [COLOR="DarkRed"]sizeof( sometype_t )[/COLOR] > SIZEOF_SOMETYPE_T )
    #error "SIZEOF_SOMETYPE_T слишком мелкий - sometype_t в нём не помещается!"
    #endif[/COLOR][/B]
    Идея в том, чтобы не показывать внутренности структуры коду, использующему указатель на, но при этом оставить возможность выделять под неё место, а не злоупотреблять malloc()'ом.

    someusercode.c:
    Код:
    #include "sometype.h"
    ..........................
      sometype_t *myptr;
      [COLOR="Blue"][B]char myspace[ SIZEOF_SOMETYPE_T ];[/B][/COLOR]
      myptr = somefunction( (sometype_t *) myspace );
    А препроцессор не понимает sizeof() и проверка размера обламывается. :-(((((
    Как обойти? Хоцца и проверку иметь, и внутренности не показывать... :-(
     
  17. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
  18. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Steel Rat, ого, ну и наворот! :-) Ща опробую...
     
  19. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Сколько наворотов-то :)
    у меня попроще.
    Код:
    /* Compile-time assert. Unfortunately, will fail if used twice in the same line but in different files */
    #define CASSERT_INTERNAL(x, suffix) typedef char  __c_assert ## suffix[(x) ? 1 : -1];
    #define CASSERT_INTERNAL2(x, suffix) CASSERT_INTERNAL(x, suffix)
    #define CASSERT(x) CASSERT_INTERNAL2(x,__LINE__)
    
    /* This compile-time assert evaluates to const char = 0 instead of void */
    #define C0ASSERT(x) (""[-!(x)])
     
  20. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Steel Rat, nop, минутку. Т.е. общая идея - слепить какой-то тип данных, в определении которого фигурирует какая-ньдь, гм, незаконность - отрицательная длина, деление на константу 0? Т.е. генерация ошибки переносится из препроцессора в компилятор? (припечатывает) Годидзе! (ехидно) Люблю решения через тухес! :-)
    А зачем танцы с бубном __LINE__'ом? Для уникальности? А на кой тут уникальность? Разве область видимости typedef'а не ограничивается фигурными скобками?
     
  21. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Рыжий Тигра, а потому, что часто хочется разместить такие проверки за пределами блока кода. Иначе сгодится и вариант из последней строчки.
    Кстати, проверено, что индексирование строковой константы неотрицательным константным индексом за пределами её длины дает нуль. Почему это полезно - можно писать макросы, которые из своего параметра делают какую-нибудь хитрую штуковину, например, вычисляют crc, генерируют маски итд, не имея доступа к функции strlen :)
     
    Последнее редактирование: 18 мар 2015
  22. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Ага, я уже наткнулся: фигурно-скобочный блок за пределами функции не канает. :-(
    Чего-чего? Нуль - содержимое указанной таким макаром ячейки или её адрес?
    Не уловил. Можешь проиллюстрировать?
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление