Как проверить тип переменной в си
Перейти к содержимому

Как проверить тип переменной в си

  • автор:

Как проверить тип переменной в си

БлогNot. Как в C++ программно узнать тип переменной?

Как в C++ программно узнать тип переменной?

Был вчера вопросик, а я не ответил впохыхах.

Коротко: для этого уже в стандарте C++98 есть оператор typeid:

#include #include int main()

Подробнее: посмотрим, как работает typeid со встроенными и с определёнными пользователем типами данных (прежде всего, классами).

Прилагаемый маленький листинг из консоли Visual Studio 2015, думаю, хорошо показывает суть дела.

#include #include using namespace std; class Base <>; //Класс class Derived : public Base <>; //Класс-потомок class PolyBase < virtual void Member() <>>; //Полиморфный класс-предок в виртуальным методом class PolyDerived : public PolyBase <>; //Потомок полиморфного класса typedef int new_int; //Определели новый тип через typedef int main() < cout 

14.03.2018, 10:31 [10557 просмотров]

Как проверить тип переменной в си

Есть ли функция для проверки типа переменной.
Короче в зависимости от того, какой параметр класса-шаблона, нужно чтобы работал определенный код. Знаю один способ как реализовать без какой либо функции, только в том способе есть много не достатков.

Последний раз редактировалось Игорь007; 17.10.2008 в 19:22 .
Регистрация: 26.08.2008
Сообщений: 1,010
не уверен что понял тебя правильно, но:
а перегрузка функций?

ромик0: Cколько получают здешние модераторы?
pu4koff: У модераторов сдельная оплата труда. Выдал предупреждение - плюс к премии. Выдал бан - лучший модератор месяца со всеми вытекающими.

alexinspir
Посмотреть профиль
Найти ещё сообщения от alexinspir

Пользователь Подтвердите свой е-майл
Регистрация: 30.05.2008
Сообщений: 96

не уверен что понял тебя правильно, но:
а перегрузка функций?

Нет. Наверное не получиться перегрузить. В моей реализации, так точно.

Как реализовать то, что я выше описал, я как нибудь смогу. Интереснее узнать существует ли такая функция или что-то вроде этого.

Пользователь
Регистрация: 09.01.2009
Сообщений: 15
например int от float можно отличить так

template massiv::massiv(int s) < Type m=0.1; srand(time(NULL)); size = s; arr = (Type*)malloc(size*sizeof(Type)); if(m == 0) < //код для int >if(m>0) < //код для float >>

во время исполнения конструктора, если параметром шаблона будет int,
то m инициализируется как 0, а если float, то как 0.1.

int и float можно отличить от double с помощью sizeof()

Модератор: тег CODE

Последний раз редактировалось MaTBeu; 09.01.2009 в 17:04 .
Пользователь Подтвердите свой е-майл
Регистрация: 30.05.2008
Сообщений: 96

int и float можно отличить от double с помощью sizeof()

Лучше всего юзать typeid()
Регистрация: 08.01.2009
Сообщений: 9
Сообщение от Doc

Type m=0.1;
if(m == 0) < //код для int >
if(m>0) < //код для float >

Прикольное решение +1
Правда меня терзают смутные сомнения что компилятор не обругает.
Мне кажется, что минимум warning обеспечен.

v_root_mne_logi
Посмотреть профиль
Найти ещё сообщения от v_root_mne_logi

Пользователь
Регистрация: 09.01.2009
Сообщений: 15
компилятор MS VC++ 2008 нормально проглотил эту конструкцию
Eclipse Foundation
Регистрация: 19.09.2007
Сообщений: 2,619

В С++ есть такая возможность - когда пишешь шаблон. Написал общую реализацию, потом пишешь реализации этой шаблонной функции для отдельных типов. Вот вы написали для общего типа Type. Теперь пишите тоже самое, только вместо Type подставьте int или float или что там еще.

Вот тут посмотрите. Там 16.2 пункт.

Как в Си определить тип переменной? [закрыт]

Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.

Закрыт 8 лет назад .
А именно, число или нет?
Отслеживать
задан 17 сен 2011 в 20:31
318 2 2 золотых знака 5 5 серебряных знаков 17 17 бронзовых знаков
В каком контексте это нужно?
17 сен 2011 в 20:37

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

typeid возвращает объект типа typeinfo из которого можно извлечь информацию о типе, но это C++.

Отслеживать
ответ дан 17 сен 2011 в 20:45
AlexDenisov AlexDenisov
6,442 1 1 золотой знак 20 20 серебряных знаков 29 29 бронзовых знаков

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

В более сложных случаях требуются дополнительные меры по хранению типа. Например, есть функция

void func(void *p)

Загодя сказать, на какую переменную указывает p не получится, она может быть какой угодно, например, double:

double d; func((void *)&d); 

Поэтому при необходимости заводят структуру

struct Z < // тип // переменная >

и работают с ней.

Отслеживать
ответ дан 17 сен 2011 в 20:52
34.5k 25 25 золотых знаков 97 97 серебряных знаков 214 214 бронзовых знаков

Проблема вот в чём: Пользователь вводит информацию через scanf() Если там 0, проверку сделать можно, а вот если там не число, Это я не знаю как сделать.

17 сен 2011 в 20:54

Создаешь переменную типа char, затем используй функцию atoi для перевода в целое (если там оно вообще есть).

17 сен 2011 в 20:59

Пользователь вводит информацию через scanf() Если там 0, проверку сделать можно, а вот если там не число, Очень просто. Сначала считываете строку. Затем разбираете ее вручную. Можно ф-цией sscanf , а можно atoi . Еще обратите внимание, что scanf и его производные возвращают кол-во успешно преобразованных элементов.

17 сен 2011 в 21:08

To @byte : Ваш первый пример кода на Си выдает warning (а собственно Вы действительно хотели извлечь младший байт указателя ?). Второй пример кода - error - ну, в самом деле, как преобразовать 64-х разрядное число в формате с плавающей точкой в машинный адрес . Обычно у компилятора нет телепатических способностей и понять, что на самом деле хотел программист он не может.

Как узнать тип переменной C++

Изображение баннера

int float char class std::basic_string,class std::allocator > C:\Users\ao\source\repos\typeid\x64\Debug\typeid.exe (process 132920) exited with code 0. Press any key to close this window . . .

Все четыре типа определены.

В других языках

  • Си: такой функции нет.
  • C#: есть похожая функция GetType()

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *