我是C的新手,我习惯了Java OOP。我必须使用struct
作为我的全局变量的持有者,系统将不断地写入/读取。
我在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;
};
以及应该使用struct的某些字段的函数示例:
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;
}
那么访问这些结构域的最佳方法是什么,而不是只编写全局变量?
编辑:它是一个实时操作系统,因此任务(像线程一样)将访问结构中的数据。我不知道是否有任何改变......
答案 0 :(得分:1)
是的,您应该在文件中定义结构,并且需要将其包含在其他文件中。结构中的不同数据类型不会有任何问题。
您可以单独定义函数以访问结构成员并对其进行处理。这样你就不需要重复代码了。 [就像你做了getHeight()]。您可以定义这些功能 * 内嵌 * 提高性能。 (最快的访问方式?)[仅当功能简单且(体积小)时] 即使你可以使用 MACROS 。
为方便起见,请使用typedef。
typedef struct { ... } DATA;
这样可以简化代码。而不是写作
struct Data *s; simply put DATA *s;
你应该使用
s->structmember to process it.
答案 1 :(得分:1)
定义Data
类型的全局变量,并在任何地方访问其成员。
struct Data GlobalData;
int getHeight()
{
GlobalData.percentage_Height = getIncline()/90.0;
GlobalData.speed_Height = db_speed_sensor();
....
}
答案 2 :(得分:1)
您必须在头文件中声明结构。
如果此结构的实例将在全局范围内,则必须在全局范围内定义此实例,如下所示:
struct Data gData;
int getHeight()
{
gData.percentage_Height = getIncline()/90.0;
...
}
如果您的实例仅用于同一文件中声明的函数,您应该像这样定义变量:
static struct Data gData;
int getHeight()
{
gData.percentage_Height = getIncline()/90.0;
...
}
关键字“static”表示您的变量位于文件范围内(仅在文件中可见)
答案 3 :(得分:1)
每个人都建议您使用全球结构。我想补充一点,正如您所提到的,访问此结构的所有函数都在一个文件中,您还应该将结构声明为静态,以便全局结构将受限于文件范围。
答案 4 :(得分:1)
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,并创建函数来访问struct的值。在这种情况下,您只能在源文件中定义结构,并在标题或您需要此声明的任何其他源文件中声明。
示例:
文件1:
#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 = %d\n", get_my_struct(my_struct));
destroy_my_struct(my_struct);
return 0;
}
最好有一个包含访问file1
结构所需的声明的标题,并在file2
中包含此标题,只是这样做以表明它是可能的,并且可能会给你一个关于定义和声明
答案 5 :(得分:0)
一个结构体可以容纳各种类型,只要你有足够的内存就可以存在多少变量。
您可以在头文件中声明结构,但是您需要在某处初始化它。
例如,如果您在不是主要文件的源文件中初始化它并且仍想在那里使用它,则必须在主文件中使用关键字extern
声明它。让我演示一下:
file.h - 这里定义了一个结构Foo
file.c - 此处初始化了名为Foo
的{{1}}实例,其中包含一些值。
main.c - 我们想在这里使用它。为了做到这一点,我们在阅读foo
或者您可以将extern struct Foo foo;
简单地添加到file.h
文件中,然后在那里初始化。
通常会像这样访问结构变量:main.c
,例如name_of_struct.member
。
如果你有一个指向结构的指针,并且你试图通过指针修改结构,有两种方法可以做到这一点:
更受欢迎的方式:
struct.int_member = 42
或者对于其他类型更典型的方式,但在这种情况下相当不寻常(至少对于一个取消引用级别):
ptr_to_struct->member = 42;
我建议您将struct作为参数传递给修改它的函数。不要只是将其用作普通的全球。