Задать вопрос
  • Насколько часто надо использовать модуль?

    @communistic_sistema Автор вопроса
    GavriKos, я понял, что имеются требования, а конкретные примеры есть? Ибо все еще не ясно, когда надо больше, а когда надо меньше модулей (а в ответе только параметры указаны, без связи с частотой использования модулей)
    Написано
  • Насколько часто надо использовать модуль?

    @communistic_sistema Автор вопроса
    Что значит
    модули дадут выигрыш в другом месте
    ? Что это за выигрыш?
    Я знаю только про выигрыш скорости компиляции (аналог прекомпилированных заголовков).
    Что значит
    все это может по разному быть в разных ветках/окружениях
    ?
    Написано
  • Почему шаблон выдает ошибку при включении заголовка в .cpp файл?

    @communistic_sistema Автор вопроса
    Wataru, прекомпилированных хэдеров нет, в проекте не включена инкрементная сборка, в любом случае спасибо
    Написано
  • Почему шаблон выдает ошибку при включении заголовка в .cpp файл?

    @communistic_sistema Автор вопроса
    Wataru, нашел интересную особенность:
    //other.h:
    #include "stack.ipp"
    //.cpp
    #include "other.h"
    то все работает
    Тогда у меня немного меняется вопрос - чем отличаются файлы .h/.ipp для VS, и почему такое "экранирование" помогает?
    И можно ли это вообще считать решением?
    Написано
  • Почему шаблон выдает ошибку при включении заголовка в .cpp файл?

    @communistic_sistema Автор вопроса
    Wataru, да, везде .ipp, в .ipp наследников также включаю .ipp родителей
    Написано
  • Почему шаблон выдает ошибку при включении заголовка в .cpp файл?

    @communistic_sistema Автор вопроса
    я рассмотрел 2 статьи и мне они понравились в плане идеи
    https://stackoverflow.com/questions/19147208/diffe...
    https://stackoverflow.com/questions/44774036/why-u...
    и я выбрал второй ответ первой статьи
    то есть в .h объявить, а в .ipp определить
    я не понимаю причину ошибки, потому что .ipp это по сути заголовок

    И ошибка возникает не только в шаблонной структуре, что не описана в вопросе, а в описанном и определнном концепте в одном и том же файле

    кода много, поэтому структура не описана в данном вопросе
    Написано
  • Как записать шаблонные операторы для массива и контейнера?

    @communistic_sistema Автор вопроса
    Wataru, да? и куда? в контейнер, что уже содержит элементы?
    Написано
  • Как записать шаблонные операторы для массива и контейнера?

    @communistic_sistema Автор вопроса
    Wataru, почему не имеет смысла? разве не выгоднее будет сделать std::move объектов массива из rvalue класса?
    Написано
  • Как записать шаблонные операторы для массива и контейнера?

    @communistic_sistema Автор вопроса
    Wataru, дал оператор, дал его использование, дал шаблоны, указал что за ошибка возникает. Я не понимаю
    Ошибку-то покажите
    . Я могу максимум добавить, что операторы без rvalue в контейнере это friend контейнера и что в класс с полем i это:
    struct SS {
    	int i[5] = { 1,2,3,4,5 };
    };

    Вы хотите вывод сборки в виде
    error C2666: "dte_utils::operator +": перегруженные функции имеют похожие преобразования
    ?
    Это еще решается через std::move(temp_class().i), однако мне не понятно из-за чего, ведь в операторах на массив статичного размера при такой же записи с этим же классом использует операторы по T(&&)[].
    Написано
  • Как написать вариадический оператор по SFINAE для умного указателя на Т, который может быть функцией?

    @communistic_sistema Автор вопроса
    rPman, в случае dllimport - так и есть, но у меня LoadLibrary, так что в определении функции может быть другая функция
    res2001, rPman, да HANDLE может быть использован и очищается в 0 при FreeLibrary (и подсчете), однако у меня нет гарантий того, что именно dll всегда отвечает за функции, просто это будет чаще всего (и возможно будет например с функторами т.д.)
    мне нужна именно слабая связь, чтобы считать - если слабые владельцы остались, это значит нужно создать одну слабую связь, которая будет для них всех (ибо референс для них един), которая всем сразу и установит нужную функцию после выгрузки
    сильная ссылка будет уничтожена после выгрузки dll поэтому она рациональна в использовании
    Написано
  • Как написать вариадический оператор по SFINAE для умного указателя на Т, который может быть функцией?

    @communistic_sistema Автор вопроса
    rPman, решает проблему, возможно ли запускать вложенные функции внутри невыгруженной функции. Можно конечно следить выгружаемыми dll кто использует, но это вариант не лучше
    Написано
  • Как написать вариадический оператор по SFINAE для умного указателя на Т, который может быть функцией?

    @communistic_sistema Автор вопроса
    rPman,
    умный указатель мне нужен для того, чтобы отслеживать, является ли функция выгруженной
    Написано
  • Как написать вариадический оператор по SFINAE для умного указателя на Т, который может быть функцией?

    @communistic_sistema Автор вопроса
    Wataru, я знаю, что высвобождение инструкций не сулит ничем хорошим, умный указатель мне нужен для того, чтобы отслеживать, является ли функция выгруженной (все сильные ссылки оборваны, я использую в местах выполнения только слабые).
    полный текст ошибки:
    1>D:\DTE\DynamicTokenEngine\TokenOperator\token\source\stream.cpp(14,4): error C3889: вызов объекта типа класса "dte_utils::weak_ref": не найден соответствующий оператор вызова
    1>D:\DTE\DynamicTokenEngine\TokenOperator\utils\include\pointer.h(118,6): message : может быть "R dte_utils::weak_ref::operator ()(Args...) const"
    1>D:\DTE\DynamicTokenEngine\TokenOperator\token\source\stream.cpp(14,19): message : "R dte_utils::weak_ref::operator ()(Args...) const": не удается вывести аргумент шаблон для "R"
    Написано
  • Как исправить ошибку буфера с UART?

    @communistic_sistema Автор вопроса
    jcmvbkbc, проблема, увы не исчезла, 67кб передаются с теми же 33к ошибок
    DWORD ComIface::write(byte* data, int count) {
        DWORD NumOfWritten, status;
        OVERLAPPED overlap = { 0 };
        overlap.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
        if (!overlap.hEvent) {
            printf("CreateEvent failed with error %d.\n", GetLastError());
            return 0;
        }
        if (!WriteFile(port_handle, data, count, &NumOfWritten, &overlap)) {
            status = GetLastError();
            if (status != ERROR_IO_PENDING) {
                printf("WriteFile failed with error %d.\n", status);
                CloseHandle(overlap.hEvent);
                return 0;
            }
    		status = WaitForSingleObject(overlap.hEvent, read_delay);
    		if (status == WAIT_ABANDONED || status == WAIT_FAILED) {
    			printf("WaitForSingleObject failed with error %d.\n", GetLastError());
    		}
            if (!GetOverlappedResult(port_handle, &overlap, &NumOfWritten, TRUE)) {
                printf("GetOverlappedResult failed with error %d.\n", GetLastError());
            }
        }
        CloseHandle(overlap.hEvent);
        return NumOfWritten;
    }
    DWORD ComIface::read(byte* buffer, int size) {
        DWORD NumberOfBytesReaded = 0, status = 0;
        OVERLAPPED overlap = { 0 };
        overlap.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
        if (!overlap.hEvent) {
            printf("CreateEvent failed with error %d.\n", GetLastError());
            return 0;
        }
        if (!ReadFile(port_handle, buffer, size, NULL, &overlap)) {
            status = GetLastError();
            if (status != ERROR_IO_PENDING) {
                printf("ReadFile failed with error %d.\n", status);
                CloseHandle(overlap.hEvent);
                return 0;
            }
    		status = WaitForSingleObject(overlap.hEvent, read_delay);
    		if (status == WAIT_ABANDONED || status == WAIT_FAILED) {
    			printf("WaitForSingleObject failed with error %d.\n", GetLastError());
    		}
            if (!GetOverlappedResult(port_handle, &overlap, &NumberOfBytesReaded, TRUE)) {
                printf("GetOverlappedResult failed with error %d.\n", GetLastError());
            }
        }
        CloseHandle(overlap.hEvent);
        return NumberOfBytesReaded;
    }
    Написано
  • Как исправить ошибку буфера с UART?

    @communistic_sistema Автор вопроса
    res2001, для обработки ERROR_IO_PENDING как раз и применяется WaitForSingleObject. И как таймауты могут навредить передаче при одном чтении? Зачем использовать EV_ERR когда мы передаем и получаем одинаковое кол-во байт? Куда переполнится буфер если мы всего для теста запускаем 1 отправку и 1 чтение, а запас в 1,5х объема?
    Написано
  • Как исправить ошибку буфера с UART?

    @communistic_sistema Автор вопроса
    jcmvbkbc, м... хорошая идея, спасибо
    После тестов сообщу результаты
    Написано
  • Как исправить ошибку буфера с UART?

    @communistic_sistema Автор вопроса
    jcmvbkbc, могу прислать и верилог, тег в вопросе потому что ПЛИС используется
    Написано
  • Как исправить ошибку буфера с UART?

    @communistic_sistema Автор вопроса
    res2001, я могу полностью прислать код и спросить "верно?", "работать будет?". Но это не гарантирует снижение вероятности ошибок ни на одной из сторон. Я не понимаю почему ONESTOPBIT ломает передачу на 533 байте со смещением на 1 и почему при ONE5STOPBITS происходит смещение на 25 байт. Это не типичное поведение. Но недозаписал или еще что, но у тебя будет нормальное начало и незначащий конец, а это все здесь, в этой ситуации, значащие данные с определенным порядком, который задали мы со сдвигом в 25 позиций.
    Откуда эти 25 позиций?!
    Написано
  • Как исправить ошибку буфера с UART?

    @communistic_sistema Автор вопроса
    res2001,
    bool ComIface::open(int _port_num, bool log) {
        //create port name
        wchar_t strbuffer[11];
        swprintf_s(strbuffer, 11, L"\\\\.\\COM%d", _port_num);
        //create port handle
        port_handle = CreateFileW(
            strbuffer,
            GENERIC_READ | GENERIC_WRITE,
            0,                              //must be opened with exclusive-access
            NULL,                           //default security attributes
            OPEN_EXISTING,                  //must use OPEN_EXISTING
            FILE_FLAG_OVERLAPPED,           //async I/O
            NULL                            //hTemplate must be NULL for comm devices
        );
        //check if handle is valid
        if (port_handle == INVALID_HANDLE_VALUE) {
            if (log) {
                printf("CreateFileW failed with error %d.\n", GetLastError());
            }
            return false;
        }
        //set port settings
        if (!SetCommState(port_handle, &dcb)) {
            if (log) {
                printf("SetCommState failed with error %d.\n", GetLastError());
            }
            close();
            return false;
        }
        //set port timings
        COMMTIMEOUTS timings{
            10,      /* Maximum time between read chars. */
            10,     /* Multiplier of characters.        */
            10,     /* Constant in milliseconds.        */
            10,      /* Multiplier of characters.        */
            10       /* Constant in milliseconds.        */
        };
        SetCommTimeouts(port_handle, &timings);
        PurgeComm(port_handle, PURGE_RXCLEAR | PURGE_TXCLEAR);
        //set port state
        port_num = _port_num;
        return true;
    }

    Таймауты есть. ReadFile читает содержимое порта 1 раз, так что мы должны получить не смещение, а недозапись из порта в наш буфер, раз мы не гарантировано читаем все при передаче управления. Однако, ReadFile возвращает столько байт, сколько было и для WriteFile
    Сейчас цикл есть, но это цикл не "ожидание байта с прочтением в течении времени" а "ожидание блока байтов с прочтением их всех"
    Написано