C++ сравнение данных с заранее неизвестными типами

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
RealHann
Открыл глаза
Сообщения: 55
Зарегистрирован: Ср май 14, 2014 15:46:02
Откуда: Харьков

C++ сравнение данных с заранее неизвестными типами

Сообщение RealHann »

Приветствую, форумчане!
Прошу помощи в идеях. Не могу перешагнуть следующую задачу.
Создан некий класс, задача которого сравнивать два аргумента конечной длины (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
Грызет канифоль
Сообщения: 250
Зарегистрирован: Ср янв 17, 2018 13:09:14

Re: C++ сравнение данных с заранее неизвестными типами

Сообщение AndyBig »

Через кучку if-ов с приведением к нужным типам.
Реклама
Аватара пользователя
alex_
Опытный кот
Сообщения: 781
Зарегистрирован: Сб июн 01, 2013 22:24:21
Откуда: ПФО

Re: C++ сравнение данных с заранее неизвестными типами

Сообщение alex_ »

[uquote="RealHann",url="/forum/viewtopic.php?p=3305193#p3305193"]Создан некий класс, задача которого сравнивать два аргумента конечной длины (4 байта)[/uquote]
Чёто мне это напоминает, вопрос на тему: как и нафига? :roll: Да и как сравнивать тёплое с мягким?
Изображение

Во первых: всё зависит от компилятора, например билдер вас тупо пошлёт далеко и на долго с таким сравнением ибо компилятор настроен так что приравнивание и сравнение разных типов переменных подразумевается как ошибка.

Во вторых: _cmp_char = 'C', это прокатит, а все остальные это не символьные элементы а числовые, и тут всё зависит от компилятора, некоторые позволяют вот такое _cmp_ushort = 'U', при этом данная переменная будет иметь значение кода данного символа исходя из таблицы ASCII. С флоатом такое точно не прокатит.

В третьих: если компилятор не проигнорировал и переварил сравнение разных типов, то он будет тупо сравнивать числовые значения опять же взятый из таблицы ASCII.
RealHann
Открыл глаза
Сообщения: 55
Зарегистрирован: Ср май 14, 2014 15:46:02
Откуда: Харьков

Re: C++ сравнение данных с заранее неизвестными типами

Сообщение RealHann »

Я решил всем аргументам выделить еще по 4 байта и сравнивать их как double
должно получиться
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
AndyBig
Грызет канифоль
Сообщения: 250
Зарегистрирован: Ср янв 17, 2018 13:09:14

Re: C++ сравнение данных с заранее неизвестными типами

Сообщение AndyBig »

alex_ писал(а):_cmp_char = 'C', это прокатит, а все остальные это не символьные элементы а числовые
Все эти элементы - вообще элементы enum, а он имеет, если не ошибаюсь, тип int.

А зачем вообще весь этот геморрой? Сделайте оба аргумента float, а где им присваиваются значения других переменных разных типов просто приводите к float.
Реклама
RealHann
Открыл глаза
Сообщения: 55
Зарегистрирован: Ср май 14, 2014 15:46:02
Откуда: Харьков

Re: C++ сравнение данных с заранее неизвестными типами

Сообщение RealHann »

да. такая идея и есть. только double нужен из-за размерности беззнаковых 4-байтных
Реклама
Аватара пользователя
alex_
Опытный кот
Сообщения: 781
Зарегистрирован: Сб июн 01, 2013 22:24:21
Откуда: ПФО

Re: C++ сравнение данных с заранее неизвестными типами

Сообщение alex_ »

[uquote="AndyBig",url="/forum/viewtopic.php?p=3305520#p3305520"]Все эти элементы - вообще элементы enum, а он имеет, если не ошибаюсь, тип int.[/uquote]
Кстати да. Давно не работал с enum.
Сделайте оба аргумента float, а где им присваиваются значения других переменных разных типов просто приводите к float.
Ну тут всё относительно, хотя в целом можно, но вот как сравнивать числовой и знаковый, по коду ASCII? :dont_know:
RealHann
Открыл глаза
Сообщения: 55
Зарегистрирован: Ср май 14, 2014 15:46:02
Откуда: Харьков

Re: C++ сравнение данных с заранее неизвестными типами

Сообщение RealHann »

в enum лежит только указание типа. не само значение. и enum по умолчанию 8 бит. если не вылезет за пределы или не указать вручную
Аватара пользователя
AndyBig
Грызет канифоль
Сообщения: 250
Зарегистрирован: Ср янв 17, 2018 13:09:14

Re: C++ сравнение данных с заранее неизвестными типами

Сообщение AndyBig »

alex_ писал(а):но вот как сравнивать числовой и знаковый, по коду ASCII?
Там вроде только числовые перечислены, знаковые и беззнаковые разной разрядности. Можно привести их все к единому типу - тот же float или double и сравнивать :)
RealHann писал(а):enum по умолчанию 8 бит
Хм, может я что-то забыл, но вроде бы разрядность enum по умолчанию равна разрядности процессора.
Аватара пользователя
alex_
Опытный кот
Сообщения: 781
Зарегистрирован: Сб июн 01, 2013 22:24:21
Откуда: ПФО

Re: C++ сравнение данных с заранее неизвестными типами

Сообщение alex_ »

[uquote="AndyBig",url="/forum/viewtopic.php?p=3305609#p3305609"]Там вроде только числовые перечислены[/uquote]
А как же это?
_cmp_char = 'C'
Аватара пользователя
AndyBig
Грызет канифоль
Сообщения: 250
Зарегистрирован: Ср янв 17, 2018 13:09:14

Re: C++ сравнение данных с заранее неизвестными типами

Сообщение AndyBig »

alex_ писал(а):А как же это?
И это тоже числовая 8-битовая знаковая (если в компиляторе не настроено по умолчанию считать char беззнаковым) :)
viiv
Грызет канифоль
Сообщения: 289
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Re: C++ сравнение данных с заранее неизвестными типами

Сообщение viiv »

[uquote="alex_",url="/forum/viewtopic.php?p=3305382#p3305382"][uquote="RealHann",url="/forum/viewtopic.php?p=3305193#p3305193"]Создан некий класс, задача которого сравнивать два аргумента конечной длины (4 байта)[/uquote]
Чёто мне это напоминает, вопрос на тему: как и нафига?[/uquote]

Мне тоже интересно зачем такое надо.

И вопрос топикстартеру. 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
Грызет канифоль
Сообщения: 250
Зарегистрирован: Ср янв 17, 2018 13:09:14

Re: C++ сравнение данных с заранее неизвестными типами

Сообщение AndyBig »

viiv писал(а):int имеет размер 32бита
Зависит от компилятора и целевого процессора.
viiv
Грызет канифоль
Сообщения: 289
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Re: C++ сравнение данных с заранее неизвестными типами

Сообщение viiv »

[uquote="AndyBig",url="/forum/viewtopic.php?p=3307281#p3307281"]Зависит от компилятора и целевого процессора.[/uquote]
Это и была конкретизация целевой платформы. Читать так:
Допустим, на конкретной платформе тип int 32-х битный, можете сказать "навскидку" что выдаст следующий код на экран (Выведет "Да" или "Нет")?
AlphaLaiman
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Ср ноя 27, 2013 21:28:40
Откуда: Москва

Re: C++ сравнение данных с заранее неизвестными типами

Сообщение AlphaLaiman »

Поскольку оба аргумента занимают 4 байта, достаточно привести оба к uint32_t:

Код: Выделить всё

if( *((uint32_t*)arg1) == *((uint32_t*)arg2) )
{
    /* Enter your code here */
}
RealHann
Открыл глаза
Сообщения: 55
Зарегистрирован: Ср май 14, 2014 15:46:02
Откуда: Харьков

Re: C++ сравнение данных с заранее неизвестными типами

Сообщение RealHann »

[uquote="AlphaLaiman",url="/forum/viewtopic.php?p=3307483#p3307483"]Поскольку оба аргумента занимают 4 байта, достаточно привести оба к uint32_t:

Код: Выделить всё

if( *((uint32_t*)arg1) == *((uint32_t*)arg2) )
{
    /* Enter your code here */
}
[/uquote]
нельзя. поскольку плавающая выглядит в памяти по-другому. и int 123 < float 104.567
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Re: C++ сравнение данных с заранее неизвестными типами

Сообщение Siarzhuk »

[uquote="RealHann",url="/forum/viewtopic.php?p=3305193#p3305193"]Создан некий класс, задача которого сравнивать два аргумента конечной длины (4 байта).[/uquote]
Исходная задача, впрочем, так и не озвучена - придётся предполагать общеизвестные сюжеты. Положа руку на сердце, при таком подходе вашему С плюсы и незачем - достаточно структур и функций.
Попробуйте поискать вдохновение в какой-нибудь из реализаций типа данных variant . Объект класса содержит union поле, со всеми поддерживаемыми типами, и enum поле, указывающее на тип содержащихся данных. Оба приватные, доступ и прочие сравнения - через перегруженные операторы.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
RealHann
Открыл глаза
Сообщения: 55
Зарегистрирован: Ср май 14, 2014 15:46:02
Откуда: Харьков

Re: C++ сравнение данных с заранее неизвестными типами

Сообщение RealHann »

это один из виртуальных объектов общего конструктора. выполняет задачу сравнения. чего с чем неизвестно, пока этого не укажет пользователь в конфигураторе. у объекта два "входа" для аргументов, управление типами этими аргументами и "выход" < = >
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18546
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: C++ сравнение данных с заранее неизвестными типами

Сообщение ARV »

RealHann писал(а):выполняет задачу сравнения. чего с чем неизвестно, пока этого не укажет пользователь в конфигураторе. у объекта два "входа" для аргументов, управление типами этими аргументами и "выход" < = >
сюр какой-то... просто так сравнение чего-то с чем-то делает оператор сравнения. и если для вашего "сравнивателя" надо указывать, что с чем сравнивать, то чем это отличается от тупой записи оператора А>B?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
RealHann
Открыл глаза
Сообщения: 55
Зарегистрирован: Ср май 14, 2014 15:46:02
Откуда: Харьков

Re: C++ сравнение данных с заранее неизвестными типами

Сообщение RealHann »

[uquote="ARV",url="/forum/viewtopic.php?p=3312862#p3312862"]
RealHann писал(а):выполняет задачу сравнения. чего с чем неизвестно, пока этого не укажет пользователь в конфигураторе. у объекта два "входа" для аргументов, управление типами этими аргументами и "выход" < = >
сюр какой-то... просто так сравнение чего-то с чем-то делает оператор сравнения. и если для вашего "сравнивателя" надо указывать, что с чем сравнивать, то чем это отличается от тупой записи оператора А>B?[/uquote]
можно, конечно. через уйму if-ов. если у меня 7 возможных типов, то 49 if-ов выглядят тупо. c A>B
Ответить

Вернуться в «Разные вопросы по МК»