2015-08-04 3 views
-3

Мне нужно хранить 3 связанных бита данных в c. Моя первоначальная мысль была трехмерным массивом, но это не сработает, поскольку все 3 типа данных различны. Верхний уровень должен быть массивом символов. Второй уровень должен быть дата/время, поэтому целое число. Третий уровень - это показание температуры, поэтому он должен быть плавающим.Как хранить 3 разных типа данных в одном массиве

Правильный способ сделать это массив указателей, указывающих на массив указателей, указывающих на массив поплавков? Если да, то как это будет написано на C?

+9

Как создать пользовательский тип данных с помощью 'struct'? –

+0

..или возможно даже профсоюзную структуру? –

+0

so: struct block { char attributeUid [8]; int [] время; float [] temp; }; , и я смогу ссылаться на них, как на обычный массив? –

ответ

1

Основываясь на ваш, как вы описали ваши данные, это звучит, как у вас есть ряд отметки времени показаний температуры для куча названных станций/мест/и т.д., что-то вроде

Location A   Location B 
----------   ---------- 
time1 -> temp1  time1 -> temp1 
time2 -> temp2  time2 -> temp2 
    ...     ... 
timeN -> tempN  timeN -> tempN 

где временные метки могут или не могут выстраиваться между станциями.

Это близко к вашей ситуации?

Если да, то следующая модель может быть полезна:

struct TimeAndTemp 
{ 
    time_t timestamp; 
    double temp; 
}; 

struct Station 
{ 
    char name[L+1];     // L is max name length 
    struct TimeAndTemp readings[M]; // M is max readings per station 
}; 

struct Station stations[N]; // array of stations, each station has a name 
          // and contains a list of timestamped 
          // temperature readings. 

Вы бы доступ к полям, как так:

strcpy(stations[i].name, newName); 
printf("Station name is %s\n", stations[i].name); 
if (strcmp(stations[i].name, searchName) == 0) { ... } 

stations[i].readings[j].timestamp = newTime(); 
stations[i].readings[j].temp = newTemp(); 

printf("Station %s reading at time %s: %f\n", 
    stations[i].name, 
    ctime(&stations[i].readings[j].timestamp), 
    stations[i].readings[j].temp); 

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

+0

Это прекрасно, спасибо. –

0

размеченного объединения, т.е. помеченного союза, возможно, будет полезно

Для например

struct { 
    enum { is_int, is_float, is_char } type; 
    union { 
     int ival; 
     float fval; 
     char cval; 
    } val; 
} my_array[10]; 

The type member is used to hold the choice of which member of the union is should be used for each array element. So if you want to store an int in the first element, you would do: 

my_array[0].type = is_int; 
my_array[0].val.ival = 3; 
+0

Значит, в этом случае все три связаны? например, мне нужно получить «fval» на основе «ival» и «cval». Возможно ли это с меченым союзом? –

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