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. Geryon

    Geryon

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

    SidTuneBase.h
    Код:
    ...
    class SidTuneBase
    {
    protected:
        typedef std::vector<uint_least8_t> buffer_t;
        ...
    
    SidTuneBase.cpp
    Код:
    void SidTuneBase::loadFile(const char* fileName, buffer_t& bufferRef)
    {
        std::ifstream inFile(fileName, std::ifstream::binary);
        ...
        inFile.seekg(0, inFile.end);
        const int fileLen = inFile.tellg();
        ...
        buffer_t fileBuf;
        fileBuf.reserve(fileLen);
        try
        {
            fileBuf.assign(std::istreambuf_iterator<char>(inFile), std::istreambuf_iterator<char>());
        }
        catch (std::exception &ex)
        {
            throw loadError(ex.what());
        }
    
        ...
    }
    
    Как тут обойтись без istreambuf_iterator?
     
    Последнее редактирование: 11 дек 2014
  4. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    Потому что обращение идёт именно к сишной функции. Попробуй убрать #include <time.h> и сделать std::time(0) - должно нормально фунцыклировать.
     
  5. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Проверил - это работает. Вопрос - почему работало без std у автора, читай - под gcc?
     
  6. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Geryon, кстати, вместо "%2x" я бы советовал "%02x"
     
    Geryon нравится это.
  7. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    А да, точно, иначе будет ширина <=2, а не 2.
     
  8. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    :-( А про это говорилось несколько недель назад:
    :-((((((
     
    Steel Rat нравится это.
  9. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Geryon, Функцию загрузки файла переписать на C, думаю, не вопрос, но нужен контекст. Откуда это? лень листать много страниц.
     
  10. Рыжий Тигра Сам себе «пират»

    Рыжий Тигра

    Регистрация:
    3 май 2012
    Сообщения:
    1.823
    Ширина ОК, а заполнение ведущими нулями - йок. А в шестнадцатиричке пренебрегать ими не принято. Тем более для вывода md5-суммы, если я правильно понимаю.
     
    Geryon нравится это.
  11. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Рыжий Тигра, в выходной строке будут пропущены все нули, попавшие на нечетную позицию (если считать от 1).
     
  12. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Точно... Совсем я всё забыл.

    Это я компилирую libsidplayfp 1.6.2 под OpenWatcom C++ 1.9

    Под OW компилирую не из мазохизма, а ради возможности собрать под платформу DOS.

    Код загрузки файла находится здесь: /sidplayfp/sidtune/sidtunebase.cpp
     
  13. Steel Rat Stainless

    Steel Rat

    Регистрация:
    28 дек 2006
    Сообщения:
    3.260
    Рыжий Тигра, и даже сейчас есть нестыковки у разных компиляторов. GCC и MSVC более-менее похожи, почти не требуются правки, если использовать стандартные и кроссплаформенные либы. Главное отличие, MSVC даёт больше свободы с шаблонами, он хорошо понимает что имел ввиду "этот криворукий", но с другой стороны это плохо потому что ухудшается читаемость и ваще расслабляет программиста. Хорошо ещё, что после адаптации к GCC, мелкомягкий принимает это. А то была бы жопа с #ifdef __GCC__ и тому подобным.
     
  14. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Эмм.. Я, возможно, не в теме, а что стало с DJGPP?
     
  15. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    C DJGPP я никогда не сталкивался. Пытаюсь сейчас установить под DosBox. С ним наверняка будут следующие проблемы:

    - потребуется перетрясти весь проект на предмет несовместимости имен файлов с 8.3
    - соберет ли он вообще это безобразие с учетом использования там старого gcc?
    - проект не заточен под DOS и совершенно точно работать там не будет; с OW я могу сначала собрать под винду, потом выбросить весь win-специфичный код, которого там немного, и заменить на dos-специфичный, затем пересобрать под DOS

    Поэтому я и пытаюсь собрать под привычный OpenWatcom.
     
    Последнее редактирование: 11 дек 2014
  16. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Geryon, Для начала пишем
    typedef uint_fast8_t u8;
    typedef std::vector<u8> buffer_t;

    вместо
    typedef std::vector<uint_least8_t> buffer_t;
    Это необязательно, строго говоря, но значительно удобнее и немного быстрее.
    Пользуемся далее типом u8 вместо вышеупомянутого идиотизма, не забывая только , что теперь байты - беззнаковые. Но если какой-то идиотский код заменой типа будет поломан, придется убрать.
    далее

    Код:
    void SidTuneBase::loadFile(const char* fileName, buffer_t& bufferRef)
    {
        FILE *f = fopen(fileName, "rb");
        if (NULL == f)
            throw loadError(ERR_CANT_OPEN_FILE);
    
        fseek(f, 0, SEEK_END);
        const size_t fileLen = ftell(f);
        if (0 == fileLen) 
            throw loadError(ERR_EMPTY);
    
        fseek(f, 0, SEEK_SET);
    
        bufferRef.resize(fileLen);
       /*sizeof(bufferRef[0])  == 1 иначе всё поломается в любом случае, но для строгости пишем так :) */
        if (fileLen != fread(&bufferRef[0], sizeof(bufferRef[0]), fileLen, f))
            throw loadError(ERR_CANT_LOAD_FILE);
    
        fclose(f);
    }
    Честно говоря, я бы выкинул весь этот плюсовый мусор на помойку и переписал бы по-человечески. Только времени нет :(

    Еще совет. Строго говоря, C-хидеры в C++ нужно подключать через C++ обертки. Обычно компиляторам всё равно, но, возможно, для вашего это важно.
    <stdlib.h> -> <cstdlib>
    <time.h> -> <ctime>
    <stdio.h> -> <cstdio>

    ---------- Сообщение добавлено 12.12.2014 в 00:10 ---------- Предыдущее сообщение размещено 11.12.2014 в 23:58 ----------

    Geryon, Я не знаю, насколько далеко ушел OpenWatcom от "старого" Watcom, но DJGPP вроде как развивался уже после смерти Watcom. Могу ошибаться.
     
    Последнее редактирование: 12 дек 2014
    Geryon нравится это.
  17. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Ну да - после такой замены из-под каждого куста начали раздаваться вопли о type mismatch и подобных ошибках, так что этот кусок пришлось оставить как есть.

    Для OpenWatcom как раз наоборот! Автор постоянно использует всякие там time() и size_t, подключая <ctime> и <cstring> соответственно, а в OW это не работает, нужно либо писать std::time() и std::size_t, либо подключать <time.h> и <string.h>.

    DJGPP закончил развитие в 2002 году, правда кто-то вроде адаптировал под него GCC 2008 года. Текущая версия OpenWatcom вышла в 2010. Хотя это лишь косвенные данные, а какой компилятор более прогрессивен в смысле новых стандартов - я не знаю.
     
    Последнее редактирование: 12 дек 2014
  18. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Печально. Мнение об авторах проекта не очень хорошее складывается. Со знаковыми байтами без серьезной надобности работают только идиоты, это источник тормозов и багов. Я бы попытался облагородить код, починив все ссылки на этот буфер, но мало ли, может баг случайно создадите...

    Код:
    #include "sidplayfp/event.h"
    #include "sidemu.h"
    Вот это же написано руками из задницы, простите. Оба инклуда лежат в одном месте, один с путем, другой без, надо прописывать в настройках проекта и тот, и другой.
    Жалобы на платформозависимость убраны, нашел, что убрать из компиляции :)

    using namespace std; - не прокатило?

    а using std::size_t; ?
     
    Последнее редактирование: 12 дек 2014
  19. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Тоже подбешиваюсь и правлю на ходу, но получаются не менее уродливые (но хотя бы работающие) конструкции:

    Код:
    #include "mos656x.h"
    
    #include <cstring>
    
    #include "../../sidendian.h"
    
    За вещи типа "../../" я бы и сам бил канделябрами, но толком не знаю, как от этого избавиться.

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

    Я собрал наконец, хотя сам не понимаю, что :) Оно говорит "File /usr/lib/vice/C64/kernal" not found и отваливается, но это уже что-то.
     
  20. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Geryon, Это один из ROM-ов, типа BIOS-а. Ищет его по фиксированному пути, что ли?
     
  21. Geryon

    Geryon

    Регистрация:
    13 май 2008
    Сообщения:
    1.228
    Да, пути заданы макросами в test.cpp, но библиотека вроде должна работать и без ROM'ов, по крайней мере с большинством SID-файлов. Надо подумать, вероятно, я что-то делаю не так.

    Кстати, судя по всему, предполагалось, что все это соберется в библиотеку, а у меня получилась куча obj-файлов. Как сделать, чтобы была .lib библиотека?

    Апдейт: ромы скачал, теперь всё зависает на проигрывании, что и неудивительно, учитывая, что собрано под DOS, а движок рассчитан либо на win32, либо на unix. Под win32 пока собрать не могу, потому что линкер ругается:

     
    Последнее редактирование: 12 дек 2014
  22. nop

    nop

    Регистрация:
    5 дек 2014
    Сообщения:
    2.297
    Geryon, Не подскажу. Но нет ли у вас желания зафигачить проект на github? Тогда совместная работа станет значительно более удобной.
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление