Форум РадиоКот https://radiokot.ru/forum/ |
|
C++ сравнение данных с заранее неизвестными типами https://radiokot.ru/forum/viewtopic.php?f=62&t=152453 |
Страница 1 из 3 |
Автор: | RealHann [ Пт фев 09, 2018 20:46:59 ] |
Заголовок сообщения: | C++ сравнение данных с заранее неизвестными типами |
Приветствую, форумчане! Прошу помощи в идеях. Не могу перешагнуть следующую задачу. Создан некий класс, задача которого сравнивать два аргумента конечной длины (4 байта). Тип каждого аргумента может задаваться отдельно, например в enum: Код: enum _cmp_type_e { _cmp_char = 'C', _cmp_ushort = 'U', _cmp_short = 'S', _cmp_uint = 'T', _cmp_int = 'I', _cmp_float = 'F' }; class comparator { public: uint8_t arg1[4]; uint8_t arg2[4]; _cmp_type_e arg_type1, arg_type2; } Как сравнить arg1 и arg2 ( < = > ?) |
Автор: | AndyBig [ Пт фев 09, 2018 21:06:58 ] |
Заголовок сообщения: | Re: C++ сравнение данных с заранее неизвестными типами |
Через кучку if-ов с приведением к нужным типам. |
Автор: | RealHann [ Сб фев 10, 2018 09:07:21 ] |
Заголовок сообщения: | Re: C++ сравнение данных с заранее неизвестными типами |
Я решил всем аргументам выделить еще по 4 байта и сравнивать их как double должно получиться |
Автор: | AndyBig [ Сб фев 10, 2018 10:52:49 ] |
Заголовок сообщения: | Re: C++ сравнение данных с заранее неизвестными типами |
alex_ писал(а): _cmp_char = 'C', это прокатит, а все остальные это не символьные элементы а числовые Все эти элементы - вообще элементы enum, а он имеет, если не ошибаюсь, тип int. А зачем вообще весь этот геморрой? Сделайте оба аргумента float, а где им присваиваются значения других переменных разных типов просто приводите к float. |
Автор: | RealHann [ Сб фев 10, 2018 10:57:38 ] |
Заголовок сообщения: | Re: C++ сравнение данных с заранее неизвестными типами |
да. такая идея и есть. только double нужен из-за размерности беззнаковых 4-байтных |
Автор: | alex_ [ Сб фев 10, 2018 12:40:33 ] |
Заголовок сообщения: | Re: C++ сравнение данных с заранее неизвестными типами |
Все эти элементы - вообще элементы enum, а он имеет, если не ошибаюсь, тип int. Кстати да. Давно не работал с enum. Цитата: Сделайте оба аргумента float, а где им присваиваются значения других переменных разных типов просто приводите к float. Ну тут всё относительно, хотя в целом можно, но вот как сравнивать числовой и знаковый, по коду ASCII? ![]() |
Автор: | RealHann [ Сб фев 10, 2018 12:44:20 ] |
Заголовок сообщения: | Re: C++ сравнение данных с заранее неизвестными типами |
в enum лежит только указание типа. не само значение. и enum по умолчанию 8 бит. если не вылезет за пределы или не указать вручную |
Автор: | AndyBig [ Сб фев 10, 2018 12:55:12 ] |
Заголовок сообщения: | Re: C++ сравнение данных с заранее неизвестными типами |
alex_ писал(а): но вот как сравнивать числовой и знаковый, по коду ASCII? Там вроде только числовые перечислены, знаковые и беззнаковые разной разрядности. Можно привести их все к единому типу - тот же float или double и сравнивать ![]() RealHann писал(а): enum по умолчанию 8 бит Хм, может я что-то забыл, но вроде бы разрядность enum по умолчанию равна разрядности процессора. |
Автор: | alex_ [ Сб фев 10, 2018 14:03:01 ] |
Заголовок сообщения: | Re: C++ сравнение данных с заранее неизвестными типами |
Там вроде только числовые перечислены А как же это? Цитата: _cmp_char = 'C'
|
Автор: | AndyBig [ Сб фев 10, 2018 14:08:05 ] |
Заголовок сообщения: | Re: C++ сравнение данных с заранее неизвестными типами |
alex_ писал(а): А как же это? И это тоже числовая 8-битовая знаковая (если в компиляторе не настроено по умолчанию считать char беззнаковым) ![]() |
Автор: | viiv [ Пн фев 12, 2018 12:43:29 ] |
Заголовок сообщения: | Re: C++ сравнение данных с заранее неизвестными типами |
Создан некий класс, задача которого сравнивать два аргумента конечной длины (4 байта) Чёто мне это напоминает, вопрос на тему: как и нафига? Мне тоже интересно зачем такое надо. И вопрос топикстартеру. int имеет размер 32бита; можете сказать "навскидку" что выдаст следующий код на экран (Выведет "Да" или "Нет"): Код: #include <stdio.h>
int int_x = 2027764539; float float_x = 2027764539.0; int main (void) { float float_y = (float) int_x + 5.0; printf ("int_x=%d, float_x=%f\n", int_x, float_x); printf ("float_y=%f, (float_y > float_x) ==> %s\n", float_y, (float_y > float_x) ? "Да" : "Нет"); return 0; } |
Автор: | AndyBig [ Пн фев 12, 2018 14:46:20 ] |
Заголовок сообщения: | Re: C++ сравнение данных с заранее неизвестными типами |
viiv писал(а): int имеет размер 32бита Зависит от компилятора и целевого процессора. |
Автор: | viiv [ Пн фев 12, 2018 15:09:02 ] |
Заголовок сообщения: | Re: C++ сравнение данных с заранее неизвестными типами |
Зависит от компилятора и целевого процессора. Это и была конкретизация целевой платформы. Читать так: Допустим, на конкретной платформе тип int 32-х битный, можете сказать "навскидку" что выдаст следующий код на экран (Выведет "Да" или "Нет")? |
Автор: | AlphaLaiman [ Пн фев 12, 2018 20:36:42 ] |
Заголовок сообщения: | Re: C++ сравнение данных с заранее неизвестными типами |
Поскольку оба аргумента занимают 4 байта, достаточно привести оба к uint32_t: Код: if( *((uint32_t*)arg1) == *((uint32_t*)arg2) )
{ /* Enter your code here */ } |
Автор: | RealHann [ Пн фев 19, 2018 21:14:32 ] |
Заголовок сообщения: | Re: C++ сравнение данных с заранее неизвестными типами |
Поскольку оба аргумента занимают 4 байта, достаточно привести оба к uint32_t: Код: if( *((uint32_t*)arg1) == *((uint32_t*)arg2) ) { /* Enter your code here */ } нельзя. поскольку плавающая выглядит в памяти по-другому. и int 123 < float 104.567 |
Автор: | Siarzhuk [ Пн фев 19, 2018 23:55:07 ] |
Заголовок сообщения: | Re: C++ сравнение данных с заранее неизвестными типами |
Создан некий класс, задача которого сравнивать два аргумента конечной длины (4 байта). Исходная задача, впрочем, так и не озвучена - придётся предполагать общеизвестные сюжеты. Положа руку на сердце, при таком подходе вашему С плюсы и незачем - достаточно структур и функций. Попробуйте поискать вдохновение в какой-нибудь из реализаций типа данных variant . Объект класса содержит union поле, со всеми поддерживаемыми типами, и enum поле, указывающее на тип содержащихся данных. Оба приватные, доступ и прочие сравнения - через перегруженные операторы. |
Автор: | RealHann [ Вт фев 20, 2018 13:07:11 ] |
Заголовок сообщения: | Re: C++ сравнение данных с заранее неизвестными типами |
это один из виртуальных объектов общего конструктора. выполняет задачу сравнения. чего с чем неизвестно, пока этого не укажет пользователь в конфигураторе. у объекта два "входа" для аргументов, управление типами этими аргументами и "выход" < = > |
Автор: | ARV [ Вт фев 20, 2018 13:11:55 ] |
Заголовок сообщения: | Re: C++ сравнение данных с заранее неизвестными типами |
RealHann писал(а): выполняет задачу сравнения. чего с чем неизвестно, пока этого не укажет пользователь в конфигураторе. у объекта два "входа" для аргументов, управление типами этими аргументами и "выход" < = > сюр какой-то... просто так сравнение чего-то с чем-то делает оператор сравнения. и если для вашего "сравнивателя" надо указывать, что с чем сравнивать, то чем это отличается от тупой записи оператора А>B?
|
Автор: | RealHann [ Вт фев 20, 2018 13:15:05 ] |
Заголовок сообщения: | Re: C++ сравнение данных с заранее неизвестными типами |
RealHann писал(а): выполняет задачу сравнения. чего с чем неизвестно, пока этого не укажет пользователь в конфигураторе. у объекта два "входа" для аргументов, управление типами этими аргументами и "выход" < = > сюр какой-то... просто так сравнение чего-то с чем-то делает оператор сравнения. и если для вашего "сравнивателя" надо указывать, что с чем сравнивать, то чем это отличается от тупой записи оператора А>B?можно, конечно. через уйму if-ов. если у меня 7 возможных типов, то 49 if-ов выглядят тупо. c A>B |
Страница 1 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |