【问题标题】:C embedded change values of struct from another fileC从另一个文件嵌入结构的更改值
【发布时间】:2021-09-15 18:18:11
【问题描述】:

您好,我正在 uni 从事一个小型机器人项目,我遇到了以下问题。 我在头文件中有一个名为 RoboterData 的 typedef,因为我想在多个文件中使用它。在主文件中,我有一个 RoboterData 数据变量,其中包含重要数据。

我的目标是从其他文件访问这些数据,并能够从另一个文件获取和设置它。我想避免使用全局变量。

以下是我的方法的相关代码片段:

ma​​in.h

typedef struct {
    DriveMode mode;
    short sensor_left;
    short sensor_mid;
    short sensor_right;
    int left_eng_speed;
    int right_eng_speed;
} RoboterData;

ma​​in.c

# include "motors.h"

// The Data I want to get and set from other files.
RoboterData data;

// Call to a funcion defined in motors.c
drive_straight(RoboterData *data);

motors.h

void drive_straight(RoboterData *data);

motors.c

# include "main.h"

enum {
    ENG_STILL = 0,
    ENG_SLOW = 50,
    ENG_MID = 155,
    ENG_FAST = 200
}

void drive_straight(RoboterData *data) {
    data ->left_eng_speed = ENG_FAST;
    data ->right_eng_speed = ENG_FAST;
    set_duty_cycle(LEFT_ENG, ENG_FAST);
    set_duty_cycle(RIGHT_ENG, ENG_FAST);
}

当我稍后尝试通过串行端口打印出 left_eng_speed 和 right_eng_speed 值时,它保持为 0。我知道 C 是按值调用的,但是由于我将 ptr 传递给我的结构,所以我传递的值是struct 并且当我通过 '->' 取消引用它时,我应该能够根据我的理解访问其原始数据,而不是副本,因为我复制的唯一内容是地址。

如果有人可以向我解释为什么这不起作用并提供可行的替代方案,我会非常高兴。

【问题讨论】:

  • 您在main.c 中是否有void drive_straight(RoboterData *data); 或其中包含的文件? (应该在motors.h 中,并包含在main.c 中。)确保启用编译器的警告!!!
  • Re "我唯一复制的是地址。",正确,函数修改了调用者的结构。
  • 我认为从我发布的内容中可以清楚地看出我在motors.c 中拥有它。但你是对的,我没有在 main.c 中显示头文件。我更新了
  • IMO,main.h 文件的存在本身就是不良分层设计的标志。
  • 关于“我认为从我发布的内容中可以清楚地看出我在motors.c. 中拥有它。”,我没有询问void drive_straight(RoboterData *data) { ... }。再读一遍我写的。

标签: c arduino embedded arduino-uno


【解决方案1】:
// Call to a funcion defined in motors.c
drive_straight(RoboterData *data);

这是一个函数声明。它不任何事情。你想要的

drive_straight(&data);

实际调用函数。

【讨论】:

  • 你是对的。我现在觉得很笨。非常感谢愚蠢的错误......
  • 哎呀!重新“非常感谢愚蠢的错误”,不,这没有启用编译器的警告。我很惊讶即使编译没有返回类型。但是把它放在一个函数中肯定会发出警告!因此,始终启用编译器的警告。
  • @ikegami:它编译得很好。如果省略,默认返回类型仍然是int。这就像写extern variable; 并且声明掩盖了全局声明,因此没有类型冲突。是的,我也希望得到警告(尚未检查),因为您使用不同类型的相同外部符号掩盖了一种外部符号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-17
  • 2016-07-30
  • 2023-04-04
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
相关资源
最近更新 更多