我需要在c中存储3个链接的数据位。我最初的想法是一个三维数组,但由于所有3种数据类型都不同,因此无法工作。顶级需要是一个char数组。第二级需要是日期/时间,所以是整数。第三级是温度读数,因此需要浮动。
执行此操作的正确方法是指向指向浮点数组的指针数组的指针数组吗?如果是这样,怎么用C写?
答案 0 :(得分: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 );
这是一个简单的模型,假设每个站有固定数量的站点和固定的最大读数。如果你想要更开放的东西,你可以使用链表而不是数组。
答案 1 :(得分: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;