- 主题:同事间因为一个问题差点吵起来了
今天同事因为这个事差点吵起来了,事情是这样的:
两个process之间通过信号通信,A发了一个动态信号给B,B需要用一个静态数据结构保存下来在本地处理。信号数据结构简化了一下,看起来像这样,portCap的长度是动态的,band的长度也是动态的。
typedef struct bandType
{
int bandwidth;
int power;
} bandTypeT;
typedef struct portCap
{
int bandNum;
bandTypeT band[1];
} portCapT;
typedef struct radioCap
{
int sigNo;
int portNum;
portCapT portCap[1];
} radioCapT;
我觉得本地的静态数据结构最好写成下面的形式,然后按照发送方的协议来解析。
typedef struct local_radioCap
{
int sigNo;
int portNum;
char data[MAX_LEN];
} local_radioCapT;
结果另一个同事非要写成这样的形式:
typedef struct local_radioCap
{
int sigNo;
int portNum;
portCapT portCap[MAX_NUM];
} local_radioCapT;
我觉得写成这样容易误导别人,让不清楚的人直接用portCap[i]来引用第i个portCap,造成错误,大家觉得呢?
--
修改:flyren911 FROM 193.15.240.*
FROM 183.221.18.*
是啊,我觉得是个很简单的问题,结果就一个认同的,让我很失望。
--
FROM 183.221.18.*
我可以拍板,但是以为这个是基本的c语言知识,拿出来讨论一下,希望用大多数人的赞同来说服这个反对的同时,没想到我是少数派。
【 在 z16166 的大作中提到: 】
你们内部没有更高一个级别的人来拍板?
- 来自 水木社区APP v3.4.4
--
FROM 117.136.62.*
我这里的本地数据结构要保存原始数据,不会对数据进行重新处理,所以不能加len,因为还要转发给其他process,同一个信号,同一种结构。
【 在 slowaction 的大作中提到: 】
非要选一个,是你的合理
你要处理变长数据,应该放个datalen在结构里
然后是data[1]
否则变长结构的优点都没
- 来自 水木社区APP v3.4.4
--
FROM 117.136.62.*
确实用零长度的数组比较好,而且信号里面最好带一个数据的length,不过客户就是这么定义的,我们也不能去修改。
【 在 lewix 的大作中提到: 】
两个比较的话,楼主的稍好一些。后者确实容易误导。 但前面的的定义xxx[1]也很容易误导,我来做的话,会将数据头和
- 来自 水木社区APP v3.4.4
--
FROM 39.144.137.*
接收信号的实现我们不管,是操作系统的功能。嵌入式系统,发送和接收就是同一块内存的所有者的变更,所以一般情况下是不会有保存在本地的需求的。接收到信号后进行处理,处理完后释放。
【 在 slowaction 的大作中提到: 】
你没有len
那你的传输部分和解析部分就是绑死的
你必须一边解析一边接受
否则你都不知道一个包什么时候结束
你这必然造
- 来自 水木社区APP v3.4.4
--
FROM 39.144.137.*
1就是表明是动态的,可能是为了兼容老的编译器?正常情况下应该写成0的。
【 在 bihai 的大作中提到: 】
: 看不懂。这个portCap长度是动态的是什么意思?你不是写了一个一在里面吗?
:
: #发自zSMTH@HD1925
--
FROM 193.15.240.*
就是解析数据可能会出错啊,
接收信号的逻辑是这样的,这个不能更改,receive返回的就是发送方分配的那块内存:
local_radioCapT local_radioCap = *(local_radioCapT *)receive(SIG_ID);
你解析数据的时候正常反应是不是就是这样引用了local_radioCap.portCap[i].bandNum ?
【 在 gluon521 的大作中提到: 】
: 看了一下感觉都可以吧。
: 只要解析数据正确就行了呗。
:
--
修改:flyren911 FROM 193.15.240.*
FROM 193.15.240.*
恰恰就是没有长度的,长度得自己一项一项加起来计算出来,这个是客户协议定义的问题,没法解决。
【 在 slowaction 的大作中提到: 】
: 这份数据不是从自己这部分产生的
: 别人穿递过来的时候一定是有长度的
: 你申请内存的时候要根据数据长度来申请
: ...................
--
FROM 193.15.240.*
感觉跑偏了,其实我把争论的焦点再明确一下,就是一个怎么解析结构体的问题,
给定一个结构体:
typedef struct bandType
{
int bandwidth;
int power;
} bandTypeT;
typedef struct portCap
{
int bandNum;
bandTypeT band[1];
} portCapT;
typedef struct local_radioCap
{
int sigNo;
int portNum;
portCapT portCap[MAX_NUM];
} local_radioCapT;
现在有一个local_radioCapT类型的数据radioCap,你正常情况下会如何解析?
我同事的意见是通过偏移来解析,说这个是基本功。我不认同,我觉得你给定了结构信息,
那么大多数人肯定会按照这个结构信息来解析数据,而不是把这个结构体按照成员表达的意义来重新解释一遍。
radioCap.portCap[i].bandNum这样的引用方式就是正常的。
【 在 slowaction 的大作中提到: 】
: 按照你定义的数据结构,
: 别人也没法直接处理数据
: 或者你给函数遍历或者他写回调
: ...................
--
FROM 193.15.240.*