Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить

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

Пт фев 09, 2018 20:46:59

Приветствую, форумчане!
Прошу помощи в идеях. Не могу перешагнуть следующую задачу.
Создан некий класс, задача которого сравнивать два аргумента конечной длины (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 ( < = > ?)

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

Пт фев 09, 2018 21:06:58

Через кучку if-ов с приведением к нужным типам.

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

Сб фев 10, 2018 07:00:25

Создан некий класс, задача которого сравнивать два аргумента конечной длины (4 байта)

Чёто мне это напоминает, вопрос на тему: как и нафига? :roll: Да и как сравнивать тёплое с мягким?
Изображение

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

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

В третьих: если компилятор не проигнорировал и переварил сравнение разных типов, то он будет тупо сравнивать числовые значения опять же взятый из таблицы ASCII.

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

Сб фев 10, 2018 09:07:21

Я решил всем аргументам выделить еще по 4 байта и сравнивать их как double
должно получиться

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

Сб фев 10, 2018 10:52:49

alex_ писал(а):_cmp_char = 'C', это прокатит, а все остальные это не символьные элементы а числовые

Все эти элементы - вообще элементы enum, а он имеет, если не ошибаюсь, тип int.

А зачем вообще весь этот геморрой? Сделайте оба аргумента float, а где им присваиваются значения других переменных разных типов просто приводите к float.

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

Сб фев 10, 2018 10:57:38

да. такая идея и есть. только double нужен из-за размерности беззнаковых 4-байтных

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

Сб фев 10, 2018 12:40:33

Все эти элементы - вообще элементы enum, а он имеет, если не ошибаюсь, тип int.

Кстати да. Давно не работал с enum.
Сделайте оба аргумента float, а где им присваиваются значения других переменных разных типов просто приводите к float.

Ну тут всё относительно, хотя в целом можно, но вот как сравнивать числовой и знаковый, по коду ASCII? :dont_know:

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

Сб фев 10, 2018 12:44:20

в enum лежит только указание типа. не само значение. и enum по умолчанию 8 бит. если не вылезет за пределы или не указать вручную

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

Сб фев 10, 2018 12:55:12

alex_ писал(а):но вот как сравнивать числовой и знаковый, по коду ASCII?

Там вроде только числовые перечислены, знаковые и беззнаковые разной разрядности. Можно привести их все к единому типу - тот же float или double и сравнивать :)
RealHann писал(а):enum по умолчанию 8 бит

Хм, может я что-то забыл, но вроде бы разрядность enum по умолчанию равна разрядности процессора.

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

Сб фев 10, 2018 14:03:01

Там вроде только числовые перечислены

А как же это?
_cmp_char = 'C'

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

Сб фев 10, 2018 14:08:05

alex_ писал(а):А как же это?

И это тоже числовая 8-битовая знаковая (если в компиляторе не настроено по умолчанию считать char беззнаковым) :)

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

Пн фев 12, 2018 12:43:29

Создан некий класс, задача которого сравнивать два аргумента конечной длины (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;
}

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

Пн фев 12, 2018 14:46:20

viiv писал(а):int имеет размер 32бита

Зависит от компилятора и целевого процессора.

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

Пн фев 12, 2018 15:09:02

Зависит от компилятора и целевого процессора.

Это и была конкретизация целевой платформы. Читать так:
Допустим, на конкретной платформе тип int 32-х битный, можете сказать "навскидку" что выдаст следующий код на экран (Выведет "Да" или "Нет")?

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

Пн фев 12, 2018 20:36:42

Поскольку оба аргумента занимают 4 байта, достаточно привести оба к uint32_t:
Код:
if( *((uint32_t*)arg1) == *((uint32_t*)arg2) )
{
    /* Enter your code here */
}

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

Пн фев 19, 2018 21:14:32

Поскольку оба аргумента занимают 4 байта, достаточно привести оба к uint32_t:
Код:
if( *((uint32_t*)arg1) == *((uint32_t*)arg2) )
{
    /* Enter your code here */
}

нельзя. поскольку плавающая выглядит в памяти по-другому. и int 123 < float 104.567

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

Пн фев 19, 2018 23:55:07

Создан некий класс, задача которого сравнивать два аргумента конечной длины (4 байта).

Исходная задача, впрочем, так и не озвучена - придётся предполагать общеизвестные сюжеты. Положа руку на сердце, при таком подходе вашему С плюсы и незачем - достаточно структур и функций.
Попробуйте поискать вдохновение в какой-нибудь из реализаций типа данных variant . Объект класса содержит union поле, со всеми поддерживаемыми типами, и enum поле, указывающее на тип содержащихся данных. Оба приватные, доступ и прочие сравнения - через перегруженные операторы.

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

Вт фев 20, 2018 13:07:11

это один из виртуальных объектов общего конструктора. выполняет задачу сравнения. чего с чем неизвестно, пока этого не укажет пользователь в конфигураторе. у объекта два "входа" для аргументов, управление типами этими аргументами и "выход" < = >

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

Вт фев 20, 2018 13:11:55

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

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

Вт фев 20, 2018 13:15:05

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

можно, конечно. через уйму if-ов. если у меня 7 возможных типов, то 49 if-ов выглядят тупо. c A>B
Ответить