struct - C中的多种类型

时间:2013-05-29 14:25:02

标签: c variables struct global-variables

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

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

编辑:它是一个实时操作系统,因此任务(像线程一样)将访问结构中的数据。我不知道是否有任何改变......

6 个答案:

答案 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作为参数传递给修改它的函数。不要只是将其用作普通的全球。