1

我是 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;
}

那么访问这些结构字段的最佳方法是什么,而不是只编写全局变量?

编辑:它是一个实时操作系统,因此任务(类似线程)将访问结构中的数据。不知道会不会有什么变化...

4

6 回答 6

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.

Using a pointer to that struct.

Example:

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;
}

Let the compiler decides when to inline those functions to improve performance, you should be worried about the readability and organization of your code.

Also - do I need to declare the struct in the header file, in order to use it other C file ?

If you want to direct access its members in other sources, you need to define it in a header, but you could just declare that you have that struct in you C, and create function to access the values of you struct. In this case you could define the struct only in the source file, and declare it in a header or any other source files you need this declaration.

Example:

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;
}

file 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;
}

It would be better to have a header with the declarations needed to access the struct of file1, and include this header in file2, just made it this way to show you that it is possible, and maybe give you a clue about the difference between definition and declaration

于 2013-05-29T15:37:42.590 回答
1

是的,您应该在文件中定义结构,并且需要将其包含在其他文件中以供使用。结构中的不同数据类型不会有任何问题。

您可以单独定义函数来访问结构成员并对其进行处理。这样你就不需要重复代码了。[就像你做 getHeight() 一样]。您可以定义这些函数* inline * 以提高性能。(最快的访问方式?)[仅当功能简单且(体积小)]即使您也可以使用MACROS

为方便起见,请使用 typedef。

  typedef struct { ... } DATA;

以便可以简化代码。而不是写作

  struct Data *s;  simply put DATA *s;

你应该使用

  s->structmember to process it.
于 2013-05-29T14:30:54.467 回答
1

定义一个类型的全局变量Data并在任何你想要的地方访问它的成员。

struct Data GlobalData;

int getHeight()
{
    GlobalData.percentage_Height = getIncline()/90.0;
    GlobalData.speed_Height = db_speed_sensor();
    ....
}
  • 如果要在多个文件中使用它,最好在头文件中定义结构。
于 2013-05-29T14:31:20.140 回答
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”表示您的变量在文件范围内(仅在文件中可见)

于 2013-05-29T14:35:05.113 回答
1

每个人都建议您使用全局结构。我想补充一点,正如您所提到的,访问此结构的所有函数都在一个文件中,您还应该将结构声明为静态,以便全局结构将受限于文件范围。

于 2013-05-29T14:39:12.253 回答
0

一个结构可以容纳任何种类的类型,只要你有足够的内存,你有多少变量是没有问题的。

您可以在头文件中声明一个结构,但您需要在某个地方对其进行初始化。

例如,如果你在一个不是你的主文件的源文件中初始化它,并且你仍然想在那里使用它,你必须在主文件中用关键字声明它extern。让我演示一下:

file.h -Foo这里定义了一个结构

file.c - Foonamed的一个实例在foo这里用一些值初始化。

main.c - 我们想在这里使用它。为了做到这一点,我们例如在包含内容之后放置一个语句extern struct Foo foo;

或者您可以简单地添加file.h到您的main.c文件中并在那里初始化它。

通常,结构变量的访问方式如下:name_of_struct.member,例如struct.int_member = 42

如果您有一个指向结构的指针,并且您尝试通过指针修改结构,则有两种方法可以做到这一点:

比较流行的方式: ptr_to_struct->member = 42;

或者其他类型的更典型的方式,但在这种情况下相当不寻常(至少对于一个取消引用级别): *ptr_to_struct.member = 42;

我建议您将结构作为参数传递给修改它的函数。不要只是将其用作普通的全局变量。

于 2013-05-29T14:41:12.137 回答