У меня есть список из 5 элементов. Я получаю первый элемент этого списка. Как я могу использовать kwno, каков тип данных этого элемента char * или int *?Знать тип данных элементов списка
Спасибо
У меня есть список из 5 элементов. Я получаю первый элемент этого списка. Как я могу использовать kwno, каков тип данных этого элемента char * или int *?Знать тип данных элементов списка
Спасибо
Вы не можете.
Либо использовать для определенных типов списков (один список для символьных указателей, один список для Интс) или использовать структуру или объединение для хранения обоих типов значений с полем, которое указывает тип, например:
#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;
};
Почему не 'enum' вместо' # define'? –
@Georg, это потому, что в мои старые C дни мы не могли использовать перечисления, определяет только. Я согласен, перечисления лучше. – Patrick
В C нет (портативный) способ узнать, если у вас есть только пустота *. Поэтому вы должны следить за этим сами, когда вы храните элементы в списке. Другая возможность - использовать списки типов, а не общий список void *.
Что вы подразумеваете под "перечнем" здесь?
ли:
sometype* lst;
т.е. массив, или:
node* lst;
Связанный список?
В первом случае sometype
определяет тип элементов в массиве, если это не какое-то void*
, что означает, что компилятор не знает типа, но программист (надеюсь) делает. Во втором случае вы должны изучить определение node
, оно должно содержать данные с типизированной информацией некоторого типа (и применяется аргумент).
Какой тип вы храните в списке? он имеет тот же тип. Или вы можете опубликовать код, показывающий, как вы создаете список? – Naveen
В C нет стандартной конструкции списка, поэтому вы должны расширить, какую конструкцию вы используете. –