C结构中的多种类型



我是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 -一个名为fooFoo实例在这里初始化了一些值。

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;

我建议您将该结构体作为参数传递给修改它的函数。

相关内容

  • 没有找到相关文章

最新更新