- 主题:同事间因为一个问题差点吵起来了
变长数据结构没有长度信息你们两位是要闹哪样?
【 在 flyren911 的大作中提到: 】
: 今天同事因为这个事差点吵起来了,事情是这样的:
: 两个process之间通过信号通信,A发了一个动态信号给B,B需要用一个静态数据结构保存下来在本地处理。信号数据结构简化了一下,看起来像这样,portCap的长度是动态的,band的长度也是动态的。
: typedef struct bandType
: ...................
--来自微水木3.5.11
--
FROM 24.18.162.*
感觉跑偏了,其实我把争论的焦点再明确一下,就是一个怎么解析结构体的问题,
给定一个结构体:
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.*
看第九楼,1长度就很容易让人认为不是变长。。
【 在 slowaction 的大作中提到: 】
: 0长度数组和1长度是一个意思,都是表示变长
: 你分开定义,不管是发送还是接收,都需要单独的序列化过程
: 玩变长结构就是不想单独再序列化,希望处理和传输用一个数据结构
--
FROM 180.166.53.*
他是一个两层的变长
这就决定了必然无法直接读取
最后那段数据不管怎么定义,都是一段void数据
必须提供接口给数据使用方
你的方式比他好一点,不过也没用上变长
【 在 flyren911 的大作中提到: 】
: 感觉跑偏了,其实我把争论的焦点再明确一下,就是一个怎么解析结构体的问题,
: 给定一个结构体:
: typedef struct bandType
: ...................
--
修改:slowaction FROM 223.104.40.*
FROM 223.104.40.*
是的,最后一段void,不过有效长度可以计算出来,无所谓。
其实我的问题就是如果让你用一个静态的数据结构去装载这个两层的动态数据,
你怎么定义这个静态数据结构,动态数据保存到静态数据结构的过程是直接拷贝,
在这个前提下,你还能有其他方案?
【 在 slowaction 的大作中提到: 】
: 他是一个两层的变长
: 这就决定了必然无法直接读取
: 最后那段数据不管怎么定义,都是一段void数据
: ...................
--
FROM 193.15.240.*
int len
char buf[] .
buf里面 0或者1都很常见
你用maxlen,难道你每次用定长的空间么
【 在 flyren911 的大作中提到: 】
: 是的,最后一段void,不过有效长度可以计算出来,无所谓。
: 其实我的问题就是如果让你用一个静态的数据结构去装载这个两层的动态数据,
: 你怎么定义这个静态数据结构,动态数据保存到静态数据结构的过程是直接拷贝,
: ...................
--
FROM 223.104.40.*
其实 0、1、2、3、4、maxlen 没有本质区别……
反正都是 malloc 之后再 cast 一下,能有啥区别。
【 在 slowaction (slowaction) 的大作中提到: 】
: int len
: char buf[] .
: buf里面 0或者1都很常见
: ...................
--
FROM 27.38.197.*
请问如果你这个结构有40个元素,最后是个变长
malloc的参数你怎么写?
【 在 flw 的大作中提到: 】
: 其实 0、1、2、3、4、maxlen 没有本质区别……
: 反正都是 malloc 之后再 cast 一下,能有啥区别。
:
--
FROM 223.104.40.*
offset 宏就可以了。当然 0 1 效果更佳。
早期标准不支持 0,大家实践中用 1 居多。
但 maxlen 方便在栈上用,各有各的好处。
【 在 slowaction (slowaction) 的大作中提到: 】
: 请问如果你这个结构有40个元素,最后是个变长
: malloc的参数你怎么写?
--
FROM 27.38.197.*
可能我说的不清楚,我们接收信号是在图形化的编程语言里面,接收信号的逻辑用C语言表达就是:
DataTypeT data = *(DataTypeT *)receive(SIG_ID);
这个逻辑是没法修改的,第三方的工具。
现在要你为主贴里的动态信号适配这个DataTypeT,你怎么适配?
【 在 slowaction 的大作中提到: 】
: int len
: char buf[] .
: buf里面 0或者1都很常见
: ...................
--
FROM 183.221.16.*