Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是否允许此枚举构造和赋值?_C_Linux_Gcc_Lora - Fatal编程技术网

C 是否允许此枚举构造和赋值?

C 是否允许此枚举构造和赋值?,c,linux,gcc,lora,C,Linux,Gcc,Lora,这会按照Linux GCC的意思编译和工作吗 在Github托管的LoRa网关堆栈中,我在loragw_hal.h中找到了以下构造 enum lgw_radio_type_e { LGW_RADIO_TYPE_NONE, LGW_RADIO_TYPE_SX1255, LGW_RADIO_TYPE_SX1257 }; #define LGW_RF_CHAIN_NB 2 /* number of RF chains */ 然后在loragw_hal.c sta

这会按照Linux GCC的意思编译和工作吗

在Github托管的LoRa网关堆栈中,我在loragw_hal.h中找到了以下构造

enum lgw_radio_type_e {
    LGW_RADIO_TYPE_NONE,
    LGW_RADIO_TYPE_SX1255,
    LGW_RADIO_TYPE_SX1257
};

#define LGW_RF_CHAIN_NB     2   /* number of RF chains */
然后在loragw_hal.c

static enum lgw_radio_type_e rf_radio_type[LGW_RF_CHAIN_NB];
编辑:数组未在代码中的任何位置初始化

然后在函数中

setup_sx125x(uint8_t rf_chain, uint32_t freq_hz)
下面的switch语句用于根据rf_chain参数选择rf链

switch (rf_radio_type[rf_chain]) {
    case LGW_RADIO_TYPE_SX1255:
        // some code
        break;
    case LGW_RADIO_TYPE_SX1257:
        // some code
        break;
    default:
        DEBUG_PRINTF("ERROR: UNEXPECTED VALUE %d FOR RADIO TYPE\n", 
        rf_radio_type[rf_chain]);
        break;
}
调用函数时,rf_-chain参数设置为1,当然它会选择默认错误“意外的rf-chain”

版权所有者Semtech Inc.的支持人员,如果您对其产品有任何问题,请始终指向此代码作为参考

但是我觉得如果没有任何修改,这段代码无论如何都不会运行

所以我对论坛的问题是,除了上面这个结构没有真正意义之外,这不是一个错误的结构吗

这会按照Linux GCC的意思编译和工作吗


我尝试在GCC ARM下使用此代码,但它并没有按计划工作。

您似乎在试图引起注意:

[……]

static enum lgw_radio_type_e rf_radio_type[LGW_RF_CHAIN_NB];
[…]数组未在代码中的任何位置初始化

数组没有显式初始化并不是一个特别的问题。如果未提供显式初始值设定项,则文件范围变量(和
静态
块范围变量)将进行默认初始化。在本例中,数组声明等效于

static enum lgw_radio_type_e rf_radio_type[2] = {
        LGW_RADIO_TYPE_NONE, LGW_RADIO_TYPE_NONE
    };
这本身似乎相当合理

你接着说

[…]调用函数时,它当然会选择默认错误“意外rf链”

我不认为有任何理由期望选择不同的案例,但我也不认为有任何理由认为不会选择不同的案例。也不清楚在什么情况下执行
开关本身

如果实际存在相应的硬件,通常期望在驾驶员初始化期间设置一个或两个
rf\u radio\u type
。如果整体代码(不仅仅是您介绍的部分)正确,那么当
rf_radio_type[rf_chain]
的值与
LGW_radio_type_SX1255
LGW_radio_type_SX1257
不同时,它可能不会执行介绍的
开关。另一方面,打印错误消息本身基本上是无害的;如果驱动程序打印了它,那么这可能只是实现质量问题,而不是功能缺陷

所以我对论坛的问题是,除了这个结构 上面所说的毫无意义,这不是一个错误的构造吗

不,不是。据我所知,当脱离上下文时,所呈现的所有结构都是有意义的

这会按照Linux GCC的意思编译和工作吗

您已经提供了几个单独有效的C片段,但它们并不一起构成有效的翻译单元。有可能形成一个完整、有效的翻译单元,其中包含所有将成功编译并完成任何事情的片段。这些片段本身不会干扰编译,也不一定会导致故障

我试图在GCC ARM下使用这段代码,但它并没有按计划工作

我发现您对整个代码的预期行为的评估显然有点乐观

编辑:数组未在代码中的任何位置初始化

正如在另一个答案中指出的那样,如果程序员没有显式地设置静态存储持续时间,则C标准要求将具有静态存储持续时间的变量隐式初始化为零。就C标准而言,这是一个很好的代码

然而,在嵌入式系统编程中,依赖于在
.bss
中初始化静态存储持续时间变量来编写代码被认为是一种不好的做法。这是因为在嵌入式系统中,通常会忽略执行
.data
的向下复制和
.bss
的零初始化的代码,这是一种非常常见的非标准做法,以加快程序启动

这种非标准选项通常在编译器选项中称为“最小/紧凑/快速启动”或类似选项。如果您启用了这样一个选项(这是很常见的),那么代码将无法工作

好的做法是在第一次使用这些变量之前,在“运行时”中初始化这些变量


总结:代码编写得很草率,因为这里的目的是提供跨许多不同微控制器平台的可移植代码,而不是为某些PC机提供代码。我猜它是由某种PC程序员编写的,就像这些协议栈通常的情况一样。

代码看起来都不错,但是
开关
射频无线电类型[1]
中的值上,而不是在
1
上。。。显示的代码中没有一个设置数组中的值。正确,数组没有初始化,不管怎样,还有更糟糕的是,我认为,因为如果为rf_radio_type分配的空间没有初始化为NULL,这可能会像彩票一样出现。我看不出您所展示的代码有任何内在的错误或荒谬之处。可疑的是,
开关
对于
LGW_RADIO_TYPE_NONE
没有明确的案例,但可能以不同的方式处理该替代方案。您是否特别关注代码?实际上,由于数组是
静态的
,它的元素最初是归零的(
LGW\u RADIO\u TYPE\u NONE
)。。。但并没有显示任何其他设置。”*…并且它并没有像计划的那样工作*“--那么它做了什么?
static enum lgw_radio_type_e rf_radio_type[2] = {
        LGW_RADIO_TYPE_NONE, LGW_RADIO_TYPE_NONE
    };