Полиморфный массив - C (СИ)
Формулировка задачи:
Как задать динамический массив из float и того, что было определено в typedef-e?
typedef обычная структурка
typedef struct ComplexObj ComplexObj;
struct ComplexObj {
float RealValue;
float ImaginValue;
};
Никто не знает?
Решение задачи: «Полиморфный массив»
textual
Листинг программы
#include <stdio.h>
typedef struct ComplexObj ComplexObj;
struct ComplexObj {
float RealValue;
float ImaginValue;
};
struct Variant
{
enum { Unknown, Double, ComplexObjStruct } type;
union
{
double x;
ComplexObj co;
};
};
int main()
{
struct Variant v;
int t;
scanf("%d", &t);
if (t == 1) {
v.type = Double;
v.x = 3.14;
}
else if (t == 2) {
v.type = ComplexObjStruct;
v.co.RealValue = 1.2;
v.co.ImaginValue = 3.4;
} else {
v.type = Unknown;
}
// ...
switch (v.type)
{
case Double: printf("x = %g\n", v.x); break;
case ComplexObjStruct: printf("%g + i*%g\n", v.co.RealValue, v.co.ImaginValue); break;
default: printf("Error: unknown type.\n");
}
}
Объяснение кода листинга программы
- Объявлены структуры ComplexObj и Variant
- В структуре ComplexObj содержатся поля RealValue и ImaginValue типа float
- В структуре Variant определён тип данных с помощью enum
- В структуре Variant определён union, который позволяет хранить либо double, либо ComplexObj
- В функции main создаётся экземпляр структуры Variant v
- С помощью scanf вводится значение переменной t
- В зависимости от значения t, устанавливается тип данных в структуре v
- Если тип данных Double, то в v.x записывается значение 3.14
- Если тип данных ComplexObjStruct, то в v.co записывается значение RealValue=1.2 и ImaginValue=3.4
- Если тип данных Unknown, то ничего не делается
- Выполняется блок кода, который не виден в данном примере (комментарий
// ...) - С помощью switch выводится значение v.x или v.co в зависимости от типа данных
- Если тип данных не соответствует ни одному из известных, выводится сообщение об ошибке