Задать вопрос
  • Как исправить ошибку буфера с UART?

    @communistic_sistema Автор вопроса
    jcmvbkbc, возвращаемый DWORD инициализирован как 0 в начале, не будет мусора.
    по поводу ReadFile и WriteFile:
    как я понял мне нужно убрать указатель на число обозначающее сколько было записано/прочтено, но оставить GetOverlappedResult для асинхронного порта
    Верно? Это и есть причина таких смещений и ошибок?
  • Как исправить ошибку буфера с UART?

    @communistic_sistema Автор вопроса
    jcmvbkbc, то есть ReadFileEx должно упростить и исправить ситуацию?
    Проверка чтения идет по возвращаемому DWORD.
    Я уберу GetOverlappedResult, спасибо.
  • Как исправить ошибку буфера с UART?

    @communistic_sistema Автор вопроса
    Передача ПК-ПЛИС-ПК в тот же самый порт
    DWORD ComIface::write(byte* data, int count) должна byte[N] записать в буфер порта на отправку
    Сложно потому что IO_PENDING, OVERLAPPED в асинхронном режиме должна быть не NULL в WriteFile
    Может GetOverlappedResult лишнее, но оно точно не влияет на число записанных байтов
    DWORD ComIface::read_block(byte* buffer, int size) должна за 1 ReadFile заполнить byte[N]
    Происходят 2 проблемы, я их указал, 1 мы починили костылем (потерпим), а вторую не починили
  • Почему возникает ошибка error C4430 в шаблоне, если выходной тип определен?

    @communistic_sistema Автор вопроса
    тогда почему в решении, где лежит проект lib такого нет?
  • Почему возникает ошибка error C4430 в шаблоне, если выходной тип определен?

    @communistic_sistema Автор вопроса
    Ошибка возникает на
    utils\include\hash.h(6,1): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
    . Почему - я не понимаю, потому что все типы на всех этапах определены.
  • Почему возникает ошибка error C4430 в шаблоне, если выходной тип определен?

    @communistic_sistema Автор вопроса
    Евгений Шатунов, проект в решении (lib)
    utils\include\hash.h
    #pragma once
    #include "type_info.h"
    namespace utils {
    	//template for iterable hashes, where iteration is independannt result
    	template<typename IN, typename OUT> constexpr inline
    	OUT	iterable_hash(const IN* in, size_t in_size, auto iterable_hash_lamda) {
    		static_assert(
    			!(sizeof(OUT) < sizeof(IN)), 
    			"iterable_hash can`t generate output type smaller than input type"
    		);
    		static_assert(
    			!type_in_type_wholes<IN, OUT>(),
    			"iterable_hash can`t input type must fil entirely output type"
    		);
    		//to do "static warning", when sizeof(in)*in_size=OUT
    		OUT result;
    		IN* out_pointer = (IN*)&result;
    		//make result = 0, supports arrays with constant legth (like int[2])
    		size_t i = type_in_type_capasity<IN, OUT>(), ii = 0;
    		while (i) {
    			out_pointer[--i] = 0;
    		}
    		//calculate hash, IN size is already a STEP size
    		i = type_in_type_capasity<IN, OUT>();
    		while (in_size) {
    			out_pointer[ii] = iterable_hash_lamda(out_pointer[ii], in[--in_size]);
    			if (++ii == i) {
    				ii = 0;
    			}
    		}
    		return result;
    	}
    	template<typename IN, typename OUT> constexpr inline
    	OUT	pearson_hash(const IN* in, size_t in_size) {
    		return iterable_hash<IN, OUT>(
    			in, in_size,
    			[](IN& out_step, const IN& in_step) {
    				return out_step ^ in_step;
    			}
    		);
    	};
    }

    token\object.h
    #pragma once
    #include "utils/include/hash.h"
    #include <stdint.h>
    #include <xstring>
    namespace tokenoperator::dte_token {
    #define TOKEN_NAME(lpwstr) token_name(lpwstr, std::char_traits<wchar_t>::length(lpwstr))
    	struct object {
    		public:
    			object(uint64_t ID) : ID(ID){}
    			virtual ~object() {}
    			uint64_t getID() const {
    				return ID; 
    			}
    		protected:
    			uint64_t ID;
    	};
    	constexpr inline uint64_t token_name(const wchar_t* wstr, size_t wstr_len) {
    		return utils::pearson_hash<wchar_t, uint64_t>(wstr, wstr_len);
    	}
    }

    в lib, другом проекте решения (exe) и в dll есть структуры наследники объекта, например
    token\data\include\value.h
    #pragma once
    #include "type.h"
    namespace tokenoperator::dte_token::data {
    	template<typename T>
    	struct value : object {
    		template <typename U> friend struct value;
    		public:
    			value(uint64_t ID = 0) : object(ID), t(ID) {}
    			template<typename U>
    			value(const U& v, uint64_t ID = 0) : object(ID), t(ID), v(v) {}
    			value(const T& v, uint64_t ID = 0) : object(ID), t(ID), v(v) {}
    			T& get_value() {
    				return v;
    			}
    			type<T> get_type() const { 
    				return t;
    			}
    		protected:
    			T v;
    			type<T> t;
    	};
    }

    в exe (другом проекте решения с lib именно) и dll экземпляры, причем в dll эти экземпляры еще не созданы (ну не написал, хочу сначала проверить что структура будет нормальной)
  • Почему возникает ошибка error C4430 в шаблоне, если выходной тип определен?

    @communistic_sistema Автор вопроса
    Dmitrii, используется в функции
    constexpr inline uint64_t token_name(const wchar_t* wstr, size_t wstr_len) {
    	return utils::pearson_hash<wchar_t, uint64_t>(wstr, wstr_len);
    }

    а pearson_hash это
    template<typename IN, typename OUT> constexpr inline
    OUT pearson_hash(const IN* in, size_t in_size) {
    	return iterable_hash<IN, OUT>(
    		in, in_size,
    		[](IN& out_step, const IN& in_step) {
    			return out_step ^ in_step;
    		}
    	);
    };

    То есть wchar_t* переводится в uint64_t и функция которая это использует - явно объявляет типы, что должны быть и лежит в lib (token_name). В dll надо обеспечить возможность использовать данный шаблон, а также использовать стандартный вариант, который в lib. Я не понимаю что я делаю не так
  • VS видит тело функции, почему возникает ошибка LNK2001?

    @communistic_sistema Автор вопроса
    Dmitrii, cpp добавлен верно, VS дает тела функции по их декларации. Не жалуется на их верность (я скопы/типы проверял, ошибок не нашел).
    VS при выносе тела создает в cpp такую же запись, только со словом inline, что как бы не меняет ситуацию.
    Когда определение в хэдере, функция стнаовится inline, может это может дать ответ?
    Ответ типа "пиши в хэдере" не подходит, я заранее сообщил о необходимости разделения деклараций от тел.
  • VS видит тело функции, почему возникает ошибка LNK2001?

    @communistic_sistema Автор вопроса
    Dmitrii, если я пишу в прототипе ее тело, то она становится inline и все нормально, стоит сделать ее не inline, сразу возникают проблемы
    мне желательно отделять декларации от типов, поэтому я стремлюсь понят в чем проблема
  • VS видит тело функции, почему возникает ошибка LNK2001?

    @communistic_sistema Автор вопроса
    Dmitrii,
    1>------ Сборка начата: проект: DynamicTokenEngine, Конфигурация: Debug x64 ------
    1>root_scope.cpp
    1>root_scope.obj : error LNK2001: неразрешенный внешний символ "public: virtual void __cdecl dte_core::add_module_struct::execute(struct tokenoperator::dte_token::function::bf_args *,unsigned __int64 *,bool,class std::vector > *,struct tokenoperator::dte_token::stream::stream *)" (?execute@add_module_struct@dte_core@@UEAAXPEAUbf_args@function@dte_token@tokenoperator@@PEA_K_NPEAV?$vector@_KV?$allocator@_K@std@@@std@@PEAUstream@956@@Z).
    1>root_scope.obj : error LNK2001: неразрешенный внешний символ "public: virtual void __cdecl dte_core::remove_module_struct::execute(struct tokenoperator::dte_token::function::bf_args *,unsigned __int64 *,bool,class std::vector > *,struct tokenoperator::dte_token::stream::stream *)" (?execute@remove_module_struct@dte_core@@UEAAXPEAUbf_args@function@dte_token@tokenoperator@@PEA_K_NPEAV?$vector@_KV?$allocator@_K@std@@@std@@PEAUstream@956@@Z).
    1>D:\DTE\DynamicTokenEngine\x64\Debug\DTE.exe : fatal error LNK1120: неразрешенных внешних элементов: 2
    1>Сборка проекта "DynamicTokenEngine.vcxproj" завершена с ошибкой.
  • VS видит тело функции, почему возникает ошибка LNK2001?

    @communistic_sistema Автор вопроса
    Dmitrii, разве в срр запись using namespace tokenoperator::dte_token::stream; не работает? И оно выдает другую функцию?
  • Как экспортировать экземпляр класса из DLL при LoadLibrary?

    @communistic_sistema Автор вопроса
    jcmvbkbc, да, гипотеза рабочая, но несмотря на это не понимаю, как в одном случае деструктор не вызвался, а в другом вызвался, несмотря на то, что конструктор и добавление одинаковое
  • Как экспортировать экземпляр класса из DLL при LoadLibrary?

    @communistic_sistema Автор вопроса
    а почему тогда здесь такого не происходит и вызов функции из этого же объекта не вызывает ошибки? просто не успевает появиться мусор?
  • Как экспортировать экземпляр класса из DLL при LoadLibrary?

    @communistic_sistema Автор вопроса
    jcmvbkbc,
    Вот это место я и просил прояснить. Покажи код, который не работает.

    https://github.com/dte-devteam/DynamicTokenEngine/...
    строка 95 например (берем стркуру из ветора, кладем указатель из ее поля, чтобы по нему вызвать i->f())
    при дебаге вылетает ошибка чтения vfptr но при этом я спокойно могу читать по указателю поля i, причем я полностью уверен, что вызывается именно тот i, что мне нужен и с параметрами, что не приведут к ошибке
    Может я неверно выразился про экспорт относительно dll, но в плане программы экспорт осуществляется указателем на вектор.
    static/inline имеют совершенно одинаковый результат
  • Как экспортировать экземпляр класса из DLL при LoadLibrary?

    @communistic_sistema Автор вопроса
    у меня экспортируется вектор, передача вектора укзателей - работает виртуальная функция, передача структур с этим указателем - виртуальная функция не работает
  • Как экспортировать экземпляр класса из DLL при LoadLibrary?

    @communistic_sistema Автор вопроса
    jcmvbkbc, error LNK2005 если не static и не inline. Код лучше пришлю файлом репозитория. Там 2 вектора. Оба экспортируются. По указателям первого все работает, по полю принимающее значение указателя - нет.
    https://github.com/dte-devteam/DTE-HWND/blob/maste...
    но при этом по непонятной мне причине в следующей dll таких проблем нет, что в векторе с указателями, что в векторе со структурами с полем-указателем все рабочее:
    https://github.com/dte-devteam/DTE-algebra/blob/ma...
  • Как обеспечить зависимость от проекта другого решения в visual studio?

    @communistic_sistema Автор вопроса
    Илья Голец, в с++ без cmake создать плагин можно?
    под клиентом я понимал базовую dll
  • Как обеспечить зависимость от проекта другого решения в visual studio?

    @communistic_sistema Автор вопроса
    Илья Голец, у меня в модулях-dll есть классы наследники классов базовой dll. В случае плагинов там действия не связаны с клиентом - нет зависимости от клиента, зависит только от действий клиента.
    В базовой dll есть абстрактный класс basicfunction, который имеет внутри себя поля для описания логики, все остальные импортируемые классы (в модуле-dll) должны быть его наследниками, ибо хранятся как basicfunction* в векторе базовой dll.
    у меня код на С++ (не знаю, зачем убрали тег), а для NET я нахожу только VB, C#, а для С/С++ только упоминание, у вас есть ссылки, где это сделано для С++?
  • Как обеспечить зависимость от проекта другого решения в visual studio?

    @communistic_sistema Автор вопроса
    Илья Голец, есть ехе с зависимостью от dll (назовем ее базовой). Базовая dll дает интерфейс для самого ехе и для dll-модулей.
    У меня решение, где лежит проект ехе, проект базовой dll и проект модуля-dll. В будущем будет больше модулей-dll. То есть в решении будет больше проектов и они буду огромным списком. Плюс хотелось бы разграничить решение модулей от решения ехе+базовая dll от модулей-dll (ибо в модулях уже свои проекты могут добавиться). Если ничего не предпринять будет месево из ехе, базовой dll, dll-модулей и других проектов, нацеленных на работу с dll-модулями.
    CMake это вопрос относительно вашего ответа в пункте о микросервисах.
    slnf я не хотел бы принимать ибо модули могут писаться не мной и в других репозиториях.
  • Как обеспечить зависимость от проекта другого решения в visual studio?

    @communistic_sistema Автор вопроса
    Для каждого проекта придется делать репозиторий? Нельзя ли такое сделать для решения?
    Плюс как избежать копирования проекта в проект при git-submodules (чтобы копировался как проект наравне с существующими)?
    Будет ли CMake хорошим решением для микросервисов?