- 主题:同事间因为一个问题差点吵起来了
非要选一个,是你的合理
你要处理变长数据,应该放个datalen在结构里
然后是data[1]
否则变长结构的优点都没用上,只是增加了复杂度
【 在 flyren911 的大作中提到: 】
: 今天同事因为这个事差点吵起来了,事情是这样的:
: 两个process之间通过信号通信,A发了一个动态信号给B,B需要用一个静态数据结构保存下来在本地处理。信号数据结构简化了一下,看起来像这样,portCap的长度是动态的,band的长度也是动态的。
: typedef struct bandType
: ...................
--
FROM 118.29.7.*
你没有len
那你的传输部分和解析部分就是绑死的
你必须一边解析一边接受
否则你都不知道一个包什么时候结束
你这必然造成空间的浪费,
变长结构没给你带来好处,只是搞复杂了
【 在 flyren911 的大作中提到: 】
: 我这里的本地数据结构要保存原始数据,不会对数据进行重新处理,所以不能加len,因为还要转发给其他process,同一个信号,同一种结构。
: 非要选一个,是你的合理
: 你要处理变长数据,应该放个datalen在结构里
: ...................
--
FROM 223.104.40.*
你问得这个问题
楼主的结构也处理不了
他的方式比对方好
但是也没用到变长结构的优点
【 在 webhost 的大作中提到: 】
: 你就问同事一个问题,两级结构都是动态的,那他申请内存的长度,要怎么确定?sizeof那个结构还要不要乘,乘的话就看不对了,不乘的话又何必。
--
FROM 118.199.90.*
0长度数组和1长度是一个意思,都是表示变长
你分开定义,不管是发送还是接收,都需要单独的序列化过程
玩变长结构就是不想单独再序列化,希望处理和传输用一个数据结构
【 在 lewix 的大作中提到: 】
: 两个比较的话,楼主的稍好一些。后者确实容易误导。 但前面的的定义xxx[1]也很容易误导,我来做的话,会将数据头和内容分开定义,或者,编译器支持的话,用零长度数组。
--
FROM 223.104.40.*
你每次都申请最大的,你搞这种变长数据结构干什么呢
白白增加了理解成本
【 在 webhost 的大作中提到: 】
: 楼主的是char data[MAX_LEN];
: 只要MAX_LEN能保证比双方协商的最大数据字节更大就行了,一次malloc即可,至于data里具体数据就留着慢慢解析。
: 他同事那个portCapT portCap[MAX_NUM];
: ...................
--
FROM 118.199.90.*
预先限定了是内存传递,这不是好的设计数据结构的习惯
传输部分和解析部分应该解耦合
他是网络传过来的还是共享内存的
只需要给个指针和长度
解析部分应该是一样的逻辑
【 在 flyren911 的大作中提到: 】
: 接收信号的实现我们不管,是操作系统的功能。嵌入式系统,发送和接收就是同一块内存的所有者的变更,所以一般情况下是不会有保存在本地的需求的。接收到信号后进行处理,处理完后释放。
: 你没有len
: 那你的传输部分和解析部分就是绑死的
: ...................
--
FROM 118.199.90.*
这份数据不是从自己这部分产生的
别人穿递过来的时候一定是有长度的
你申请内存的时候要根据数据长度来申请
而不是根据理论长度
【 在 webhost 的大作中提到: 】
: 就事论事,楼主他们已经走这条路了,那么接下来哪两条岔路更好而已,你们非要说你就不该走到这里来,那有什么意义
--
FROM 118.199.90.*
按照你定义的数据结构,
别人也没法直接处理数据
或者你给函数遍历或者他写回调
你这数据结构,传输/解析/处理必须要一起完成
本来这是独立的三件事
【 在 flyren911 的大作中提到: 】
: 就是解析数据可能会出错啊,
: 接收信号的逻辑是这样的,这个不能更改,receive返回的就是发送方分配的那块内存:
: local_radioCapT local_radioCap = *(local_radioCapT *)receive(SIG_ID);
: ...................
--
FROM 223.104.40.*
他是一个两层的变长
这就决定了必然无法直接读取
最后那段数据不管怎么定义,都是一段void数据
必须提供接口给数据使用方
你的方式比他好一点,不过也没用上变长
【 在 flyren911 的大作中提到: 】
: 感觉跑偏了,其实我把争论的焦点再明确一下,就是一个怎么解析结构体的问题,
: 给定一个结构体:
: typedef struct bandType
: ...................
--
修改:slowaction FROM 223.104.40.*
FROM 223.104.40.*
int len
char buf[] .
buf里面 0或者1都很常见
你用maxlen,难道你每次用定长的空间么
【 在 flyren911 的大作中提到: 】
: 是的,最后一段void,不过有效长度可以计算出来,无所谓。
: 其实我的问题就是如果让你用一个静态的数据结构去装载这个两层的动态数据,
: 你怎么定义这个静态数据结构,动态数据保存到静态数据结构的过程是直接拷贝,
: ...................
--
FROM 223.104.40.*