打印

请教一下大家C语言,数组传参的思路。

[复制链接]
3016|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zgjzgjkyo|  楼主 | 2020-9-1 14:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zgjzgjkyo 于 2020-9-1 14:47 编辑

我目前是这样的:

void main
{
        char TestWord[10]={0xF5, 0x11, 0x00, 0xC3, 0xA4, 0xF5};        //实际上这个不一定是10。也有可能是其它随机大小的数组
                                                                                                //如:char abc[]="123" 又或者 char *abc = "12345"等等.....
        SendString(TestWord);
}


void  SendString( *data);
{        
        unsigned char datalen = strlen(data);                //结果发现这里的datalen数值变成”2“了。思考原因是为上面的第3个数字为 0x00了
                                                                        //如果把 0x00 改为其它数值,也能识别为”6“(但也不正确,我是需要把 10个数包括 0x00也发送出去的)
        for(i = 0 ; i < datalen ; i++)/*(datalen = 0 ; datalen < strlen(data) ; datalen++)*/
        {
                Uart_SendData8(data[i]);                        //因为辨识不正确,所以无法完整的把数组内容发送出去了.........
        }

}

我目前想到的办法是直接把数值的长度也传参过去。(但对于发送内容不确定,而且内容含有 0x00 这个数组真心没办法。我目前只会用 strlen(data) 这个判断数值的长度,但这个只会计算长度到 0x00。 0x00之后的就不计算了....
不知大家有没有更好的方案?传递 不确定长度的数组的传参?

阿~~代码块怎么编辑也不好看阿...........

使用特权

评论回复

相关帖子

沙发
chongdongchen| | 2020-9-1 16:59 | 只看该作者
很明显你要传送的是包含0的字节数据,所以不能使用字符串函数。所以你是对的,只能把长度一起带进去。

使用特权

评论回复
板凳
设置一个连续是x00的是结尾不就完了,基本就没见过连续多个字节是00的

使用特权

评论回复
地板
ipman| | 2020-9-1 23:43 | 只看该作者
字节数组怎么可能不定长?这好像哪个语言都一样

使用特权

评论回复
5
叶春勇| | 2020-9-2 16:52 | 只看该作者
modbus用的两个套路,一个是rtu,用时间间隔区别数组大小。另一个是asc,避免使用特殊字符。
按照你的设计,你连不定长通讯协议的结束条件都没定义,也不可能有好方法。
学习下成熟的通讯协议,基本就知道怎么去设计通讯协议了。

使用特权

评论回复
6
jrcsh| | 2020-9-3 05:01 | 只看该作者
数组   不明白, 发送他的长度 干嘛?    直接读到了数据就 ok 了,,,........     就算用 ASC 也是 -53 ? 就直接得出来  最快还是送 16H

使用特权

评论回复
7
aple0807| | 2020-9-3 18:18 | 只看该作者
这种情况只能同时传递长度才可以,只有ascii编码的数组才可以只传指针

使用特权

评论回复
8
zzz3265| | 2020-9-3 21:18 | 只看该作者
先找到问题, 问题的关键是应该明白 strlen 是做什么用的

使用特权

评论回复
9
ayb_ice| | 2020-9-4 13:17 | 只看该作者
每次直接指定长度

使用特权

评论回复
10
呐咯密密| | 2020-9-4 17:26 | 只看该作者
不要用strlen()函数!换sizeof()。这个问题我遇到过

使用特权

评论回复
11
ta1ent| | 2020-9-4 19:52 | 只看该作者
看来你发送的内容根本就不是C语言字符串,只是一个char型数组嘛。那怎么能用strlen判断长度呢?

使用特权

评论回复
12
ipman| | 2020-9-4 23:21 | 只看该作者
呐咯密密 发表于 2020-9-4 17:26
不要用strlen()函数!换sizeof()。这个问题我遇到过

看清楚,要兼容不定长数组,这是不可能的任务

使用特权

评论回复
13
simonliu009| | 2020-9-5 08:43 | 只看该作者
本帖最后由 simonliu009 于 2020-9-5 21:25 编辑

1. 首先C语言不支持不定长数组。只能先定义一个足够长的数组然后定义好结束符。定义好结束符之后,是不是发送长度就不重要了。
2. 其次你发送的不是字符串,用strlen()是错误的。
3. 假设你这个是嵌入式的设备,而且这个MCU支持micropython,那就可以用可变长度的列表来传输数据了。

使用特权

评论回复
14
西门看雪| | 2020-9-6 12:22 | 只看该作者
楼主才学编程吧?

这个问题实在是太简单了,一般的写法是:

发送函数:
void  SendString( char * buffer,int buffer_len);

调用的时候可以是这样:
SendString((char *)TestWord, sizeof(TestWord));

不管你要发送的数据是结构体,数组,都可以按照这个套路来。

使用特权

评论回复
15
liaojihua2010| | 2020-9-7 14:46 | 只看该作者
楼上正解

使用特权

评论回复
16
24kdewhite| | 2020-9-7 16:31 | 只看该作者
数组传参传的是地址,也就是指针,多写写就好了

使用特权

评论回复
17
24kdewhite| | 2020-9-7 16:34 | 只看该作者
应该找本c语言的书仔细看看,语法搞清楚就没问题了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

213

帖子

4

粉丝