打印

请教 动态定义结构体的方法

[复制链接]
6328|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Endlessss|  楼主 | 2010-10-7 17:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
问题是这样的。
首先已经有了3个结构体如下。
Typedef struct
{
    unsigned int a;
}S_1;
Typedef struct
{
    unsigned int a;
    unsigned int b;
}S_2;
Typedef struct
{
    unsigned int a;
    unsigned int b;
    unsigned int c;
}S_3;


然后在一个函数中我可以得到一个数值Index(范围 1-3)和一个地址Ptr;
需求是当index =1时,用S_1指向地址Ptr并开始操作
需求是当index =2时,用S_2指向地址Ptr并开始操作
需求是当index =3时,用S_3指向地址Ptr并开始操作
要怎样实现。不能用switch 和If else .这两个效率太差。最好能用指针或者数组实现。
效率第一。

望各位不吝赐教。晚上过来继续研究。

相关帖子

沙发
HWM| | 2010-10-7 18:53 | 只看该作者
用指针数组(三个指针分别指向各个结构)。

使用特权

评论回复
板凳
Endlessss|  楼主 | 2010-10-7 19:04 | 只看该作者
回楼上
这些结构体没有实体啊,只是声明。用Typedef 定义的。

使用特权

评论回复
地板
HWM| | 2010-10-7 19:09 | 只看该作者
to 3L:

没实体就定义实体,然后给指针赋值。

使用特权

评论回复
5
Endlessss|  楼主 | 2010-10-7 19:14 | 只看该作者
预期结果就是这样的。
Typedef struct
{
    unsigned int a;
}S[1];
Typedef struct
{
    unsigned int a;
    unsigned int b;
}S[2];
Typedef struct
{
    unsigned int a;
    unsigned int b;
    unsigned int c;
}S[3];

然后在函数中;
void function (Uint8 Index,uint32 *ptr)
{
         S[Index]  *MyStruct;                      //根据Index 定义实体数据结构指针
         MyStruct =  (S[Index] *)ptr;       //指针赋值
         MyStruct.a =  .......................          //使用结构体操作
}

使用特权

评论回复
6
Endlessss|  楼主 | 2010-10-7 19:18 | 只看该作者
回复4楼。
这些Struct 都是临时使用,用完释放的。而且多个任务都有类似的使用情况。不可能开那么多Ram来放这些没用的东西的。
或者我没理解你的意思。

使用特权

评论回复
7
HWM| | 2010-10-7 19:31 | 只看该作者
to LZ:

五楼的定义不对,没这么定义的。

若是非多线程(程序没有并行性),临时变量可以定义成全局的,反正不会同时使用。若是多线程的,则需要系统调配。

使用特权

评论回复
8
Endlessss|  楼主 | 2010-10-7 19:47 | 只看该作者
5楼只用来表明我的意图,语法自然是不对。
可以肯定现在是多任务同时执行,而且是并列的关系,一个是主程序执行,一个是中断执行。

前几天用函数指针把所有的SWITCH都干掉了,现在想优化下内部存储空间。
现在想想,定义指针数组的方式或许可行。
或许根本不用定义这个结构体。
用下面的方式就可以。用这样的方式就可以访问结构体成员了((S_1)ptr)->a 。

使用特权

评论回复
9
xwj| | 2010-10-7 20:01 | 只看该作者
用联合啊,想以哪种方式调用都可以。
(不过除非非常有必要,否则原则上不建议使用太复杂的技巧和语法、结构)

使用特权

评论回复
10
Endlessss|  楼主 | 2010-10-7 20:05 | 只看该作者
用联合?没懂你的意思!
为了RAM空间,现在是700k的空间,改后,可以省掉一半的空间。

使用特权

评论回复
11
xwj| | 2010-10-7 20:13 | 只看该作者
唉,700k。。。

你之前是编PC机程序的?

使用特权

评论回复
12
Endlessss|  楼主 | 2010-10-7 20:13 | 只看该作者
搞复杂了,先Typedef 定义想用的结构体,使用的时候实例化一个结构体指针,然后把 取得的指针ptr付给结构体指针,以后就可以用结构体指针来访问内存了。我先实验下,成功后过来结案。

使用特权

评论回复
13
Endlessss|  楼主 | 2010-10-7 20:19 | 只看该作者
唉,700k。。。

你之前是编PC机程序的?
xwj 发表于 2010-10-7 20:13

呵呵,不是啊,一直单片机,从8-》16-》32—》现在TC17XX.
有很多资料要存,由于资料结构变化,可以取消部分资料空间,但是导致资料类型变多,每种资料类型长度不等。才会有今天的问题。
也就是原来是单一数据类型,现在是多数据类型,但是用现在的多数据类型可以节省很多RAM空间。

使用特权

评论回复
14
cuya| | 2010-10-7 22:17 | 只看该作者
没有动态结构一说, 可以用宏实现类似 c++ 的模板, 但也还是静态的, 无法通过变量决定。
你可以定义一个最大存储的结构, 比如你的  S3, 如果结构向下兼容; 或者如 xwj 所说, 定义一个 union, union 不增加任何空间; 或者使用不同函数处理不同数据。

使用特权

评论回复
15
McuPlayer| | 2010-10-7 22:19 | 只看该作者
1、联合
2、强制类型转换

使用特权

评论回复
16
rockli| | 2010-10-8 09:59 | 只看该作者
既然有地址了,证明有空间了。把地址强制转换为需要的指针类型然后访问即可。

使用特权

评论回复
17
Endlessss|  楼主 | 2010-10-8 10:00 | 只看该作者
S_1,S_2;S_3 的定义可能误导大家,S_1,S_2;S_3 内部成员变化很大,现在有大约200个这样的结构体,未来会扩充到500个,而且每个结构体内部成员都不同,每个结构体的所占内存差异也很大。每个结构体在内存中多次实例化,并且每次实例化的空间位置固定。具体有多少这样的结构体、放在哪个位置是用户在编程设定时决定。我只开一段内存空间。
用12楼的做法就可以了,开始想复杂了。
只要传递指针就可以了。指针所指向的内存空间可以获取到Index ,可以同过Index 查找函数指针数组,来调用不同的函数,然后在函数里面再声明结构体,指针赋值就可以了。

使用特权

评论回复
18
jack_shine| | 2010-10-8 16:55 | 只看该作者
让人看着晕乎的语句很酷,但不实用

使用特权

评论回复
19
免证入网| | 2010-10-10 12:20 | 只看该作者
先定义一个void类型指针ptr,然后根据需要转化为需要类型并赋值。试试看。我觉得应该可以实现你的要求。

使用特权

评论回复
20
刘前辈| | 2010-10-10 14:09 | 只看该作者
本帖最后由 刘前辈 于 2010-10-10 14:36 编辑

这是动态内存分配的问题?书上有标准应用例子:

实际上,动态为结构指针变量分配安全的地址,就相当于动态为结构分配安全内存。例如:
struct  stu        // 定义结构体
{
char  name [20];
……
……
};

main()
{
struct   stu  * student ;      // 定义结构体类型指针
init_memepool (void  xdata  *p,uint  size );     // 向系统申请一块共享、覆盖内存池
student=malloc( sizeof( struct  stu );    // 为结构类型模板动态分配安全内存块。
// 引用: student->name;
……
……
free( student );
}

这和编译器对用户程序局部变量共享、覆盖区是一个原理;——内存池的最大尺寸,等于用户程序所有分立函数中占用内存长度最大的那个函数所需要的内存字节数。其它函数内存采用覆盖技术动态共享这个内存池。
/

使用特权

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

本版积分规则

12

主题

62

帖子

0

粉丝