我必须在基于ARM9的微控制器中编程外设寄存器.
例如,对于USART,我将相关的内存地址存储在enum:
enum USART
{
US_BASE = (int) 0xFFFC4000,
US_BRGR = US_BASE + 0x16,
//...
};
Run Code Online (Sandbox Code Playgroud)
然后,我在函数中使用指针来初始化寄存器:
void init_usart (void)
{
vuint* pBRGR = (vuint*) US_BRGR;
*pBRGR = 0x030C;
//...
}
Run Code Online (Sandbox Code Playgroud)
但我的老师说我最好使用#defines,例如:
#define US_BASE (0xFFFC4000)
#define US_BRGR (US_BASE + 0x16)
#define pBRGR ((vuint*) US_BRGR)
void init_usart (void)
{
*pBRGR = 0x030C;
}
Run Code Online (Sandbox Code Playgroud)
他说,就像这样,你没有在堆栈中分配指针的开销.
就个人而言,我不太喜欢#define,也不喜欢其他预处理器指令.所以问题是,在这种特殊情况下,#define真的值得使用而不是enums和堆栈分配的指针吗?
我想逐行解析一个文件,每个文件包含两个整数,然后将这些值加在两个不同的变量中.我天真的做法是这样的:
my $i = 0;
my $j = 0;
foreach my $line (<INFILE>)
{
($i, $j) += ($line =~ /(\d+)\t(\d+)/);
}
Run Code Online (Sandbox Code Playgroud)
但它会产生以下警告:
在void上下文中无用的私有变量
暗示使用+ =运算符触发标量中左侧的评估而不是列表上下文(如果我在这一点上错了,请纠正我).
是否可以优雅地(可能在一行中)实现这一点而不诉诸数组或中间变量?
相关问题:如何在Perl中以元素方式对数组求和?