请帮忙看下这个代码哪里有问题,编译警告我找不到原因
主程序引用子程序:
char PREES2[8]={0x5A,0xA5,0x05,0x82,0x54,0x39,0x00,0x00};
uart1_txd(PREES2);
头函数定义:
int uart1_txd(char *uart1_trans[]);
子函数:
int uart1_txd(char *uart1_trans[])
{
rt_thread_mdelay(5);
rt_device_write(serial, 0, uart1_trans, 8); //sizeof无法取出正确长度,故写常数
return 0;
}
警告信息如下:
../applications/main.c:54:15: warning: passing argument 1 of 'uart1_txd' from incompatible pointer type [-Wincompatible-pointer-types]
uart1_txd(PREES2);
^
In file included from ../applications/main.c:7:0:
../applications/my_c.h:23:5: note: expected 'char **' but argument is of type 'char *'
int uart1_txd(char *uart1_trans[]);
先说下这个错误
../applications/main.c:54:15: warning: passing argument 1 of 'uart1_txd' from incompatible pointer type [-Wincompatible-pointer-types]
uart1_txd(PREES2);
核心含义就是,你传入的第1个参数与uart1_txd函数需要的参数不匹配;
为何不匹配:
你定义的 char *a[], 而你传入的是 char a[]。
再说一点,这个接口原型
int uart1_txd(char *uart1_trans[])
设计得不合理。
看你的实现,你就是想通过uart1发送一段buffer出去。
比较建议的函数原型:
int uart1_txd(char *uart1_trans, int len);
然后你调用的时候,就是
uart1_txd(PREES2, sizeof(PREES2));
接口设计成这样,第一个参数实则是一个指针,也可以理解成一个数组的起始地址,第二个参数指定这个指针指向内存的字节数,这个字节数由调用者绝对;而你现有的代码,这个长度8写在uart1_txd里面是不合适的。
一般设计带buffer处理的接口的传参,都是 char *p, int len这种写法,可以参考C库的一个接口你就明白了:
ssize_t write(int fd, const void *buf, size_t count);
以上答案,提供点思路,希望能够帮助到你。
感谢耐心回复,你虽然没有直接告诉我怎么操作,但是让我明白了原理,多谢多谢!