我正在尝试将字符串分配给IAR中的rx_buffer.rx_struct.RESP.RESPOND
缓冲区,但是我收到了一条警告消息。
struct field
是uint8_t
类型的strncpy(rx_buffer.rx_struct.RESP.RESPOND, (uint8_t *)'NS,', 3);
。
我的代码是:
Warning[Pe1422]: multicharacter character literal (potential portability problem)
Warning[Pe167]: argument of type "uint8_t *" is incompatible with parameter of type "char *",
Warning[Pe167]: argument of type "uint8_t *" is incompatible with parameter of type "char const"
相关的警告信息如下:
rx_buffer.rx_struct.RESP.RESPOND[0] = 'N';
rx_buffer.rx_struct.RESP.RESPOND[1] = 'S';
rx_buffer.rx_struct.RESP.RESPOND[2] = ',';
我写了一个解决方法:
SELECT COLUMN_NAME, TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME LIKE '%myColumn%'
但我对此并不满意。这样做的正确方法是什么?
答案 0 :(得分:3)
您的代码在很多方面都不正确:
setit() {
BashRun=$(ps -p "$$" -o etime=|tr '-' ':'|awk -F: '{total=0;m=1;} {for (i=0;i<NF;i++) {total+=$(NF-i)*m;m*=i>=2?24:60}} {print total}')
... ...
if [ $? -eq 0 ]; then
if [ $BashRun -gt 1 ]; then
echo "It has already been set !"
fi
fi
}
strncpy(rx_buffer.rx_struct.RESP.RESPOND, (uint8_t *)'NS,',3);
char *
是一个多字符字符常量,一个没有人会在任何体面代码中使用的非便携式历史奇怪...将它转换为'NS,'
并不能解决这个问题。您应该使用双引号:(uint8_t *)
。"NS,"
不适合这项工作。事实上,它永远不是任何工作的正确工具。这个函数不是strncpy()
的安全替代,它的语义被广泛误解,很容易出错。您应该避免使用此功能。在这种特殊情况下,它只会按预期复制3个字节,但为什么在strcpy
是一个更简单的解决方案时使用strncpy()
?您可以通过以下方式实现目标:
memcpy()
或者通过在问题中分别分配每个字节来交替。这两种方法都可能产生相同的机器代码。
答案 1 :(得分:0)
strncpy
期望其前两个参数分别为char *
和const char *
类型。 1}},如果有的话,你应该转向unit8_t *
。
此外,char *
是字符文字,字符串文字为'NS,'
。
答案 2 :(得分:0)
您使用的是单引号,但需要双引号(var in_target = [];
var in_source = [];
var reformed_data = [];
for(var x in data) {
var _target = data[x][0];
var _source = data[x][1];
if(in_target.indexOf( _target ) === -1) {
if(in_source.indexOf( _source) === -1) {
reformed_data.push( data );
}
}
in_target.push( _target );
in_source.push( _source );
}
console.log( reformed_data );
),并查看Stop using strncpy already!,在这种情况下,它应该按预期工作,因为您不想要尾随"NS,"
,但不要使用它。
使用'\0'
或memcpy
,(作为样式问题)也不要使用像memmove
这样的幻数:
3