我正在尝试使用一个函数来替换C中的scanf()。该函数由第三方编写并相应地定义:
ScanDecimal16uNumber - 扫描十进制16位无符号数 ANSIC原型:字节ScanDecimal16uNumber(const unsigned char ** str,word * val)
str:byte - 要扫描的字符串,以0x开头。它也会返回到扫描的位置
val:指向单词的指针 - 指向值的指针
返回值:字节 - 错误代码“
我遇到的麻烦是两个输入。在与比我更熟悉C的人交谈之后,我想我已经掌握了第二个输入。 * val是我想要获取的值(16位十进制数),val是其地址。我对word转换为int有点模糊,这是我需要的,但对它感觉很舒服。
第一个输入确实给我带来了麻烦,包括语法和它的作用。首先,**是什么?它是地址的地址?什么?如果没有先自己建立地址,怎么能有地址到地址呢?这样的宣言怎么样?
非常感谢功能和语法方面的一些建议。我正在重新认识C,这感觉有点像深渊。
提前致谢, Yusif Nurizade
更新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占空比,其值来自实用程序扫描。我得到的警告是:
2/3。未使用的变量DeviceDataPrv / rtval是PWM功能的一部分,我现在不太担心。
我现在的问题是:
答案 0 :(得分:2)
以下是如何调用该函数并使用它在两个参数中返回的结果。
int main(void) {
const unsigned char *input = "0x1f30 0x7100";
const unsigned char *p = input;
word val1, val2; /* A word should be the same as a uint16_t. */
byte r = ScanDecimal16uNumber(&p, &val1);
/* p should now point at the space between the two numbers in the
*input string. This will allow you to scan the next number immediately. */
byte q = ScanDecimal16uNumber(&p, &val2);
printf("%d %d\n", val1, val2);
return 0;
}
答案 1 :(得分:0)
在C中,字符串被定义为'char *'(指向字符的指针)。所以'char **'真的可以被认为是字符串的地址。您可以这样称呼它:
char *strg = "This is my String";
word aword;
ScanDecimal16uNumber(&strg, &aword);
这使用& (地址)运算符发送值的地址而不是值本身。这有帮助吗?