【发布时间】:2013-11-10 05:44:27
【问题描述】:
我正在尝试使用一个函数来替代 C 中的 scanf()。该函数是由第三方编写的,并进行了相应的定义:
ScanDecimal16uNumber - 扫描十进制 16 位无符号数 ANSIC 原型:字节 ScanDecimal16uNumber(const unsigned char **str, word *val)
str:byte - 要扫描的字符串,从 0x 开始。它也会返回,直到它扫描到的地方
val: 指向单词的指针 - 指向值的指针
返回值:字节 - 错误代码"
我遇到的问题是两个输入。在与比我更精通 C 的人讨论之后,我想我掌握了第二个输入。 *val 是我要获取的值(16 位十进制数),val 是它的地址。我对单词如何转换为 int 有点模糊,这是我需要的,但感觉很舒服。
第一个输入真的给我带来了麻烦,无论是语法还是它的作用。首先,**是什么?它的地址到地址?什么的?如果不先自己建立地址,怎么能有一个地址呢?这样的声明会是什么样子?
非常感谢有关功能和语法的一些建议。我正在重新熟悉 C,这感觉有点像深渊。
提前致谢, 尤西夫·努里扎德
更新 1.0:我已根据您的建议修改了代码,目前只有三个警告没有错误(最好的!)我发布以下代码:
const unsigned char *addressPrime = "0x1f307100";
const unsigned char *addressOfAddressPrime = addressPrime;
word dutyCycle;
PWM1_Enable();
UTIL1_ScanDecimal16uNumber(&addressPrime, &dutyCycle);
PWM1_SetRatio16(dutyCycle);
此代码正在飞思卡尔 FRDM KE02Z 板上使用,您看到的新功能正用于使用我从实用程序扫描中获得的值来控制 PWM 占空比。我收到的警告是:
- 在 addressPrime 的声明中“初始化中的指针目标的符号不同。
2/3。未使用的变量 DeviceDataPrv/rtval 是 PWM 功能的一部分,我现在不太担心。
此时我的问题是:
- 他们指的是什么签名?
- 我应该更加注意我选择的数字还是 0x1f307100 有效?
- 由于这是为了动态更新 PWM 占空比,我是否应该为扫描功能使用 while 循环?
【问题讨论】:
-
在函数内部,您可能会执行以下操作:
unsigned char const *ptr = *str;,然后使用*ptr扫描字符串;当您到达转换结束时,您将在返回之前将当前指针复制回 (*str = ptr;)。 -
所以为扫描创建了一个字符串,然后将其转换为单词在哪?如果我做对了,这实际上很有意义。为什么指针指向指针呢?
-
因为你需要能够修改调用函数中的指针值——参见Rex Barzee的answer。
标签: c function pointers syntax