реклама на сайте
подробности

 
 
> typedef
DRUID3
сообщение May 25 2008, 02:19
Сообщение #1


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



Мало сплю последнее время и тупею потому sad.gif . Итак есть тип заданный typedef . Как проверить его соответствует он int или float (третьего не дано) - от этого будут зависеть остальные действия...


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 11)
dxp
сообщение May 25 2008, 05:30
Сообщение #2


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(DRUID3 @ May 25 2008, 09:19) *
Мало сплю последнее время и тупею потому sad.gif . Итак есть тип заданный typedef . Как проверить его соответствует он int или float (третьего не дано) - от этого будут зависеть остальные действия...

Что значит проверить? Чему задано, тому и соответствует. Типизация-то статическая. Или пример приведите, где этот вопрос возникает.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
DpInRock
сообщение May 25 2008, 08:15
Сообщение #3


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Sizeof()


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Okorok
сообщение May 25 2008, 09:01
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 289
Регистрация: 17-06-07
Пользователь №: 28 498



Цитата(DRUID3 @ May 25 2008, 04:19) *
Мало сплю последнее время и тупею потому sad.gif . Итак есть тип заданный typedef . Как проверить его соответствует он int или float (третьего не дано) - от этого будут зависеть остальные действия...
Я бы рядом с typedef завел константу, например "#define TYPEFLOAT 0" и проверял ее значение.
Go to the top of the page
 
+Quote Post
SSerge
сообщение May 25 2008, 09:03
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Средствами препроцессора, похоже, никак - мне таких не известно.
На этапе компиляции можно попробовать воспользоваться фичами С++, а именно перегрузкой функций.

т.е. определить две функции, например:
int f( int x );
и
float f( float x );
и в этих функциях реализовать разные варианты в зависимости от типа. Компилятор разберётся какую из них вызвать, а линкер выбросит лишнее.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
dxp
сообщение May 25 2008, 09:12
Сообщение #6


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(DpInRock @ May 25 2008, 15:15) *
Sizeof()

И?

Код
#include <stdio.h>

int main()
{
    printf("\nSizeof int   = %d", sizeof(int));
    printf("\nSizeof float = %d", sizeof(float));
    return 0;
}


вывод:

Код
Sizeof int   = 4
Sizeof float = 4


Это РС. На многих 32-разрядных платформах (ARM7, Blackfin и т.д.) будет ровно то же самое.

Цитата(SSerge @ May 25 2008, 16:03) *
Средствами препроцессора, похоже, никак - мне таких не известно.
На этапе компиляции можно попробовать воспользоваться фичами С++, а именно перегрузкой функций.

Вроде, про функции речи вообще не было.

Если надо статически разрешать вопрос, то для этого есть все средства - контроль типов. Если все же на рантайме, то в ++ есть такая фишка - RTTI. Но что-то мне подсказывает, что тут не тот случай. smile.gif


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
Alex B._
сообщение May 25 2008, 09:29
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 943
Регистрация: 6-07-04
Из: Санкт-Петербург
Пользователь №: 274



если это gcc, то можно использовать typeof()
Go to the top of the page
 
+Quote Post
GetSmart
сообщение May 25 2008, 10:52
Сообщение #8


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Код
    typedef float real;

    const float tmp = 1.0/3;  // любое число, только не 0 :)

    if (*(real *)&tmp == tmp)
    { asm("NOP");
    }

У меня такой код в случае несоответствия типа вообще выбрасывается. Браво компилятору (IAR). В случае совпадения типов остаётся только ядро IFa без сравнения.

Или так:
Код
    typedef int real;

    #define RealIsFloat ((real)0.5f == 0.5f)

    if (RealIsFloat)
    { // если плавающая арифметика
    }
    else
    { // если целочисленная арифметика
    }


Сообщение отредактировал GetSmart - May 25 2008, 11:40


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Nitrotoluol
сообщение May 25 2008, 12:00
Сообщение #9


Участник
*

Группа: Свой
Сообщений: 33
Регистрация: 20-05-08
Из: Украина
Пользователь №: 37 661



Оператор typeid возвращает ссылку на структуру type_info, которая содержит поля, позволяющие получить информацию о типе:
http://msdn.microsoft.com/en-us/library/fyf39xec.aspx
Go to the top of the page
 
+Quote Post
GetSmart
сообщение May 25 2008, 12:44
Сообщение #10


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Код
    typedef float real;

    const double tmp = 1.0/3;

    if (*(real *)&tmp == tmp)
    { asm("NOP");
    }
    else
    { asm("NOP");
      asm("NOP");
    }

Не поверите smile.gif В IAR-e выполняются сразу оба варианта внутри IFa. Когда же в typedef стоит int, то всё нормально.

IAR 4.20


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
XVR
сообщение May 26 2008, 07:24
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(DRUID3 @ May 25 2008, 06:19) *
Мало сплю последнее время и тупею потому sad.gif . Итак есть тип заданный typedef . Как проверить его соответствует он int или float (третьего не дано) - от этого будут зависеть остальные действия...
Какой язык (С/С++) и что подразумевается под 'остальными действиями'?

Если С++ то можно воспользоваться шаблонным классом и его специализациями для int/float/etc
Go to the top of the page
 
+Quote Post
sergeeff
сообщение May 26 2008, 08:25
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



В книге А.Александреску "Современное проектирование на С++" этим вопросам уделено довольно много внимания.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 15:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01471 секунд с 7
ELECTRONIX ©2004-2016