登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

关于C51中的结构体

作者:彪哥 栏目:单片机
关于C51中的结构体
结构体在C51中有什么优势?在定义了结构体之后不是还要单独的引用每个结构体类型的变量吗?和单独的定义每个变量有什么不同?

2楼: >>参与讨论
computer00
方便编程和理解程序。
 
3楼: >>参与讨论
彪哥
还是不太明白。
比如我定义了一个结构类型:
struct data
{
   int day;
   int mouth;
   CHAR year;
}  a;
a 为类型变量。
在引用的时候可以是:a.data , a.mouth , a.year;这3个都是可以作为普通变量引用和赋值,那这和单独定义三个普通类型的变量来引用有什么好处呀?
比如:int data,mouth;
      CHAR year;
在引用的时候也可以像上面那样用啊?请圈圈仔细解释一下吧!看了好几遍的书,并没说这有什么不同呀,结构体类型的变量的优点到底在C51中哪里可以体现呀?

4楼: >>参与讨论
eleven11
方便移植,维护,如果只是一个对象也可以不用
 

* - 本贴最后修改时间:2006-5-3 16:55:54 修改者:eleven11

5楼: >>参与讨论
computer00
这样可以把它们分配到连续的地址区,
写起程序来就容易了。

有些问题,等你用到时,自然就知道它的好处了。自己体会不到时,别人告诉你这是好处,可能你也不会这么认为的。

6楼: >>参与讨论
王紫豪
有两个好处

1、方便理解、规范编程,有共同属性的一组变量放一个结构体里;
2、用结构体可以分配一连续内存,这样跟指针结合起来,能达到比较好的目的,例如有一下结构体:
struct{
float amplitude;
float frequency;
float offset;
}waveform;

如果要保存这些参数到存储区时,只需要:
unsigned CHAR * ptr=&waveform;
unsigned CHAR i;

for(i=0;i<sizeof(waveform);i++)write_iap(PARAMETER_OFFSET+i,*(ptr+i));
同样的道理可以读出来,就不用管什么浮点数、乱七八糟的数据类型了。

 

7楼: >>参与讨论
彪哥
谢谢各位的解答,似乎是明白了一点。
楼上那位说的在保存的时候可以存在连续的空间,这个在面向51单片机的时候用的是不是不是很多?

8楼: >>参与讨论
coke
有点象C++中的class. 面向对象编程.
 
9楼: >>参与讨论
mohanwei
好理解,这是最重要的一点。
你过三个月或者半年,再看看你自己编写过的软件就知道这样写的好处了^_^

10楼: >>参与讨论
cxd731
类似C++的数据封装
将有关联的数据放在一起,方便程序的阅读和理解

11楼: >>参与讨论
123654789
把  waveform  的 地址 传 到  ptr   而 不是   * ptr
王紫豪

王紫豪

王紫豪

我 觉得    unsigned CHAR * ptr=&waveform;   有  一些 别扭

    好象 是       把  waveform  的 地址 传 到  ptr   而 不是   * ptr

                        ptr=&waveform

12楼: >>参与讨论
汽车电子
C++的类跟结构很相似的
   

13楼: >>参与讨论
hotpower
清楚明了
 
14楼: >>参与讨论
mrjialong
还是多看看c就明白了
 
15楼: >>参与讨论
fushaobing
这个问题我也正想问
谢谢

16楼: >>参与讨论
王紫豪
123456789兄弟
您所说的:

把  waveform  的 地址 传 到  ptr   而 不是   * ptr

王紫豪

王紫豪

王紫豪

我 觉得    unsigned CHAR * ptr=&waveform;   有  一些 别扭

    好象 是       把  waveform  的 地址 传 到  ptr   而 不是   * ptr

                        ptr=&waveform





首先:
1、我没错;
2、肯定你理解错了,嘿嘿!指针声明时候赋值跟生命期内赋值不是一样的,不好意思

17楼: >>参与讨论
123654789
王紫豪
王紫豪

凭感觉 应该是  如下

struct data *ptr;
struct data waveform;
ptr=&waveform;

* - 本贴最后修改时间:2006-5-9 13:03:18 修改者:123654789

18楼: >>参与讨论
王紫豪
123456789兄弟

CHAR *p=&abc;

CHAR *p;
p=&abc;
是等效的。



19楼: >>参与讨论
123654789
哦  现在 明白 了
 学习 了  谢谢 

20楼: >>参与讨论
hunao
这样写,也许更好理解: CHAR*  p=&abc;
 
21楼: >>参与讨论
123654789
这样写,也许更好理解: CHAR*  p=&abc;
这样写,也许更好理解: CHAR*  p=&abc;
                     在这里 ↑ 加上   空格
      免得 别人  误会  成  *p=&abc;   

22楼: >>参与讨论
northerns
学习了
 
23楼: >>参与讨论
eleven11
我个人还是感觉主要是便于移植和维护
举个例子:

/*********************************************************************************************************
** 函数名称: FFSAllocNewBlock
** 功能描述: 分配一个可写的块
**
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
BLOCK_INDEX FFSAllocNewBlock(FFS_INFO *pFFS, BIT16_EX *ExBuf)
{
   BLOCK_INDEX LBlockIndex;
   BLOCK_INDEX Ret;
   BLOCK_INDEX BlockIndex;
   BYTE _SecIndex;
   LONG SourStarSec;
   LONG DestStarSec;   
   LONG LErasCnt;

   if ((Ret = FindLessErasFreeBlock(pFFS->pNodeCtrl)) == INVALID_BLOCK_INDEX)
   {  
      while (TRUE)
      {
         if ((Ret = FindLessErasLogicBlock(pFFS->pNodeCtrl)) == INVALID_BLOCK_INDEX)
         {
            Ret = FindLessErasUsedBlock(pFFS->pNodeCtrl);   
         }
         else
         {
            SetLErasGrp(Ret, pFFS->pNodeCtrl);
         
            Ret = BLOCK_MAP(Ret);
         }
         
         SourStarSec = Ret * pFFS->pFInfo->SecPerBlock;
      
         pFFS->pFInfo->FlashReadExPart(pFFS->pFInfo, (BYTE *)ExBuf, SourStarSec);
      
         if (ExBuf->BadFlag != VALID_BLOCK)
         {
            FFSSetBadFlag(Ret, pFFS, ExBuf);
         }
         else
         {
            LErasCnt = ExBuf->LErasCntH * 65536 + ExBuf->LErasCntL;
            LBlockIndex = GET_EXPART_LBLOCKINDEX(ExBuf);
            _SecIndex = ExBuf->SecNo;  

            pFFS->pFInfo->FlashReadSec(pFFS->pFInfo, pFFS->Buf, SourStarSec + _SecIndex);
      
            ECCChk(pFFS->Buf, ExBuf->Ecc1);
            ECCChk(pFFS->Buf+256, ExBuf->Ecc2);   
            
            break;     
         }                  
      }
                                 
      while (TRUE)
      {
         if (pFFS->UsedBlockNum == pFFS->pFInfo->BlockPerChip)
         {
            return INVALID_BLOCK_INDEX;
         }
      
         BlockIndex = FindMoreErasFreeBlock(pFFS->pNodeCtrl);
                                        
         DestStarSec = BlockIndex * pFFS->pFInfo->SecPerBlock;
                            
         if (FFSWriteFirstSec(DestStarSec + _SecIndex, pFFS->Buf, ExBuf, pFFS, LErasCnt, LBlockIndex))
         if (FFSSecBackup(SourStarSec, DestStarSec, _SecIndex, ExBuf, pFFS, TRUE))
         {
            break;
         }
      }     
      
      BLOCK_MAP(LBlockIndex) = BlockIndex;      
   }
  
   return Ret;
}

我把与该对象有关的信息全部放在pFFS里面,包括对应的底层操作的函数,这样就很方便的进行移植和同时可以有多个相同性质对象同时运行,我要添加一个对象,只要在添加这样一个结构体就可以,我要维护他,也只需要对要维护对象结构体里面的元素进行修改就可以,如果只针对一个对象,事实上,我一般也不用结构体的

参与讨论
昵称:
讨论内容:
 
 
相关帖子
求助,哪位同仁能具体讲解一下"$"符号的含义和具体用法!
红外接收
求助:mege8中文资料
*(volatile int *)A=55是把A定义为什么??高手请啦!!
这样的时续写24WC02可以吗?
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号