2010-08-19 2 views
0

У меня есть список из 5 элементов. Я получаю первый элемент этого списка. Как я могу использовать kwno, каков тип данных этого элемента char * или int *?Знать тип данных элементов списка

Спасибо

+1

Какой тип вы храните в списке? он имеет тот же тип. Или вы можете опубликовать код, показывающий, как вы создаете список? – Naveen

+1

В C нет стандартной конструкции списка, поэтому вы должны расширить, какую конструкцию вы используете. –

ответ

1

Вы не можете.

Либо использовать для определенных типов списков (один список для символьных указателей, один список для Интс) или использовать структуру или объединение для хранения обоих типов значений с полем, которое указывает тип, например:

#define TYPE_INT 1 
#define TYPE_STRING 2 

struct MyValue 
{ 
int type;  // TYPE_INT or TYPE_STRING 
union 
    { 
    char *str; 
    int i; 
    } value; 
}; 

И сохраните эту структуру в своем списке.

Если параметр C++ является опцией, рассмотрите возможность использования std :: list для хранения данных типа или, если это невозможно, определите класс, аналогичный структуре выше, в которой вы защищаете разные типы данных, например (не включая проверку ошибок по типу):

class MyValue 
    { 
    public: 
     enum ValueType 
     { 
     TYPE_NONE; 
     TYPE_INT, 
     TYPE_STRING 
     }; 
     MyValue() : m_type(TYPE_NONE) {} 
     MyValue(char *s) : m_type(TYPE_STRING), m_value.str(s) {} 
     MyValue(int i) : m_type(TYPE_INT), m_value.int(i) {} 
     ValueType getType() const {return m_type;} 
     const char *getString() const {return m_value.str;} 
     int getInt() const {return m_value.int;} 
    private: 
     ValueType m_type; 
     union InternalValue 
     { 
     char *str; 
     int i; 
     }; 
     InternalValue m_value; 
    }; 
+0

Почему не 'enum' вместо' # define'? –

+0

@Georg, это потому, что в мои старые C дни мы не могли использовать перечисления, определяет только. Я согласен, перечисления лучше. – Patrick

1

В C нет (портативный) способ узнать, если у вас есть только пустота *. Поэтому вы должны следить за этим сами, когда вы храните элементы в списке. Другая возможность - использовать списки типов, а не общий список void *.

0

Что вы подразумеваете под "перечнем" здесь?

ли:

sometype* lst; 

т.е. массив, или:

node* lst; 

Связанный список?

В первом случае sometype определяет тип элементов в массиве, если это не какое-то void*, что означает, что компилятор не знает типа, но программист (надеюсь) делает. Во втором случае вы должны изучить определение node, оно должно содержать данные с типизированной информацией некоторого типа (и применяется аргумент).

Смежные вопросы