我是C的新手,我已经习惯了Java OOP。我必须使用struct
作为我的全局变量的持有者,系统将不断地写入/读取它。
我在结构体中有3种不同类型的变量,我不确定这是否会导致问题。
也-我是否需要在头文件中声明结构体,以便使用它的其他C文件?
在不同的函数中访问该结构体中的变量的最快和更好的方法是什么?//使用这些变量的函数在同一个C文件中
这是我创建的结构体本身:
struct Data
{
double percentage_Height = 0;
double speed_Height = 0;
double time_Height = 0;
int distance_Height = 0;
double percentage_Distance = 0;
double speed_Distance = 0;
double time_Distance = 0;
int distance_Distance = 0;
uint16_t valueSpeed = 0;
double speedOfMotor = 0;
int tilt = 0;
};
和一个应该使用结构体的一些字段的函数示例:
int getHeight()
{
percentage_Height = getIncline()/90.0;
speed_Height = db_speed_sensor();
time_Height = 0.000027; // [h] , 100ms
distance_Height=0;
if (percentage_Height == 0)
{
percentage_Height = 1;
}
distance_Height = speed_Height * time_Height * percentage_Height * 100;
return distance_Height;
}
那么访问这些结构体字段的最好方法是什么,而不是只写全局变量?
EDIT:它是一个实时操作系统,所以任务(类似线程)将访问结构体中的数据。我不知道这会不会有什么改变……
定义类型为Data
的全局变量,并在需要时访问其成员
struct Data GlobalData;
int getHeight()
{
GlobalData.percentage_Height = getIncline()/90.0;
GlobalData.speed_Height = db_speed_sensor();
....
}
- 如果你想在多个文件中使用它,最好在头文件中定义这个结构。
必须在头文件中声明该结构。
如果这个结构的实例将在全局作用域中,你必须像这样在全局作用域中定义这个实例:
struct Data gData;
int getHeight()
{
gData.percentage_Height = getIncline()/90.0;
...
}
如果你的实例只在同一个文件中声明的函数中使用,你应该这样定义你的变量:
static struct Data gData;
int getHeight()
{
gData.percentage_Height = getIncline()/90.0;
...
}
关键字"static"意味着你的变量在文件范围内(只在文件中可见)
是的,你应该在文件中定义结构体,并且需要包含它以便在其他文件中使用。不同的数据类型在结构上不会有任何问题。
可以分别定义函数来访问和处理结构体成员。这样就不需要重复代码了。[就像你做的那样]。你可以定义这些函数*inline*提高性能。(最快的访问方式?)[仅当函数简单且(体积小)]甚至可以使用宏。
为方便使用typedef
typedef struct { ... } DATA;
以便简化代码。而不是写
struct Data *s; simply put DATA *s;
你应该使用
s->structmember to process it.
每个人都建议你使用全局结构。我只是想补充一点,正如你提到的,所有访问这个结构的函数都在一个文件中,你还应该将一个结构声明为静态,这样全局结构将被限制在文件范围内。
What will be the fastest and better way to access the variables from that struct in the different functions ? // The functions using these variables are in the same C file.
使用指向该结构体的指针。
的例子:
int getHeight(struct Data *data)
{
data->percentage_Height = getIncline()/90.0;
data->speed_Height = db_speed_sensor();
data->time_Height = 0.000027; // [h] , 100ms
data->distance_Height=0;
if (data->percentage_Height == 0)
{
data->percentage_Height = 1;
}
data->distance_Height = data->speed_Height * data->time_Height * data->percentage_Height * 100;
return data->distance_Height;
}
int main(int argc, char *argv[])
{
struct Data data;
load_data(&data); // function to initialize data
distance_Height = getHeight(&data);
return distance_Height;
}
让编译器决定何时内联这些函数来提高性能,你应该担心代码的可读性和组织。
Also - do I need to declare the struct in the header file, in order to use it other C file ?
如果你想在其他源中直接访问它的成员,你需要在头文件中定义它,但是你可以声明在你的C中有这个结构体,并创建函数来访问你的结构体的值。在这种情况下,您可以仅在源文件中定义结构,并在头文件或任何其他需要此声明的源文件中声明。
的例子:
file1:
#include <stdlib.h>
struct my_struct_s {
int value;
};
struct my_struct_s *create_my_struct(void)
{
return malloc(sizeof(struct my_struct_s));
}
void destroy_my_struct(struct my_struct_s *my_struct)
{
free(my_struct);
}
void set_my_struct(struct my_struct_s *my_struct, int value)
{
my_struct->value = value;
}
int get_my_struct(struct my_struct_s *my_struct)
{
return my_struct->value;
}
文件2:#include <stdio.h>
#include <string.h>
struct my_struct_s;
struct my_struct_s *create_my_struct(void);
void destroy_my_struct(struct my_struct_s *my_struct);
void set_my_struct(struct my_struct_s *my_struct, int value);
int get_my_struct(struct my_struct_s *my_struct);
int main() {
struct my_struct_s *my_struct;
my_struct = create_my_struct();
set_my_struct(my_struct, 10);
printf("my_struct value = %dn", get_my_struct(my_struct));
destroy_my_struct(my_struct);
return 0;
}
最好有一个带有访问file1
结构体所需声明的头文件,并将该头文件包含在file2
中,只是这样做是为了向您展示这是可能的,并且可能给您关于定义和声明
结构体可以保存任何类型,只要有足够的内存,里面有多少变量都没问题。
你可以在头文件中声明一个结构体,但是你需要在某个地方初始化它。
例如,如果您在非主文件的源文件中初始化它,并且您仍然希望在主文件中使用它,则必须在主文件中使用关键字extern
声明它。我来演示一下:
file.h - struct Foo
在这里被定义
file.c -一个名为foo
的Foo
实例在这里初始化了一些值。
main.c -我们想在这里使用它。为了做到这一点,我们在include后面加了一条语句extern struct Foo foo;
或者你可以直接将file.h
添加到你的main.c
文件中,并在那里初始化它。
struct变量通常是这样访问的:name_of_struct.member
,例如struct.int_member = 42
.
如果你有一个指向结构体的指针,你试图通过指针修改结构体,有两种方法:
更流行的方式:ptr_to_struct->member = 42;
或者是其他类型更典型的方式,但在这种情况下相当不寻常(至少对于一个解引用级别):*ptr_to_struct.member = 42;
我建议您将该结构体作为参数传递给修改它的函数。