|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
关于C51中的结构体 |
作者:彪哥 栏目:单片机 |
结构体在C51中有什么优势?在定义了结构体之后不是还要单独的引用每个结构体类型的变量吗?和单独的定义每个变量有什么不同? |
2楼: | >>参与讨论 |
作者: computer00 于 2006/5/3 1:49:00 发布:
方便编程和理解程序。 |
3楼: | >>参与讨论 |
作者: 彪哥 于 2006/5/3 16:28:00 发布:
还是不太明白。 比如我定义了一个结构类型: 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:53:00 发布:
方便移植,维护,如果只是一个对象也可以不用 * - 本贴最后修改时间:2006-5-3 16:55:54 修改者:eleven11 |
5楼: | >>参与讨论 |
作者: computer00 于 2006/5/3 16:55:00 发布:
这样可以把它们分配到连续的地址区, 写起程序来就容易了。 有些问题,等你用到时,自然就知道它的好处了。自己体会不到时,别人告诉你这是好处,可能你也不会这么认为的。 |
6楼: | >>参与讨论 |
作者: 王紫豪 于 2006/5/4 14:25:00 发布:
有两个好处 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楼: | >>参与讨论 |
作者: 彪哥 于 2006/5/4 20:52:00 发布:
谢谢各位的解答,似乎是明白了一点。 楼上那位说的在保存的时候可以存在连续的空间,这个在面向51单片机的时候用的是不是不是很多? |
8楼: | >>参与讨论 |
作者: coke 于 2006/5/5 9:06:00 发布:
有点象C++中的class. 面向对象编程. |
9楼: | >>参与讨论 |
作者: mohanwei 于 2006/5/5 21:58:00 发布:
好理解,这是最重要的一点。 你过三个月或者半年,再看看你自己编写过的软件就知道这样写的好处了^_^ |
10楼: | >>参与讨论 |
作者: cxd731 于 2006/5/6 12:05:00 发布:
类似C++的数据封装 将有关联的数据放在一起,方便程序的阅读和理解 |
11楼: | >>参与讨论 |
作者: 123654789 于 2006/5/6 18:06:00 发布:
把 waveform 的 地址 传 到 ptr 而 不是 * ptr 王紫豪 王紫豪 王紫豪 我 觉得 unsigned CHAR * ptr=&waveform; 有 一些 别扭 好象 是 把 waveform 的 地址 传 到 ptr 而 不是 * ptr ptr=&waveform |
12楼: | >>参与讨论 |
作者: 汽车电子 于 2006/5/6 22:53:00 发布:
C++的类跟结构很相似的 |
13楼: | >>参与讨论 |
作者: hotpower 于 2006/5/6 22:56:00 发布:
清楚明了 |
14楼: | >>参与讨论 |
作者: mrjialong 于 2006/5/7 2:50:00 发布:
还是多看看c就明白了 |
15楼: | >>参与讨论 |
作者: fushaobing 于 2006/5/8 8:23:00 发布:
这个问题我也正想问 谢谢 |
16楼: | >>参与讨论 |
作者: 王紫豪 于 2006/5/8 8:38:00 发布:
123456789兄弟 您所说的: 把 waveform 的 地址 传 到 ptr 而 不是 * ptr 王紫豪 王紫豪 王紫豪 我 觉得 unsigned CHAR * ptr=&waveform; 有 一些 别扭 好象 是 把 waveform 的 地址 传 到 ptr 而 不是 * ptr ptr=&waveform 首先: 1、我没错; 2、肯定你理解错了,嘿嘿!指针声明时候赋值跟生命期内赋值不是一样的,不好意思 |
17楼: | >>参与讨论 |
作者: 123654789 于 2006/5/9 13:00:00 发布:
王紫豪 王紫豪 凭感觉 应该是 如下 struct data *ptr; struct data waveform; ptr=&waveform; * - 本贴最后修改时间:2006-5-9 13:03:18 修改者:123654789 |
18楼: | >>参与讨论 |
作者: 王紫豪 于 2006/5/9 13:24:00 发布:
123456789兄弟 CHAR *p=&abc; 与 CHAR *p; p=&abc; 是等效的。 |
19楼: | >>参与讨论 |
作者: 123654789 于 2006/5/9 13:30:00 发布:
哦 现在 明白 了 学习 了 谢谢 |
20楼: | >>参与讨论 |
作者: hunao 于 2006/5/9 21:45:00 发布:
这样写,也许更好理解: CHAR* p=&abc; |
21楼: | >>参与讨论 |
作者: 123654789 于 2006/5/9 23:21:00 发布:
这样写,也许更好理解: CHAR* p=&abc; 这样写,也许更好理解: CHAR* p=&abc; 在这里 ↑ 加上 空格 免得 别人 误会 成 *p=&abc; |
22楼: | >>参与讨论 |
作者: northerns 于 2006/5/12 8:58:00 发布:
学习了 |
23楼: | >>参与讨论 |
作者: eleven11 于 2006/5/21 8:45:00 发布:
我个人还是感觉主要是便于移植和维护 举个例子: /********************************************************************************************************* ** 函数名称: 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里面,包括对应的底层操作的函数,这样就很方便的进行移植和同时可以有多个相同性质对象同时运行,我要添加一个对象,只要在添加这样一个结构体就可以,我要维护他,也只需要对要维护对象结构体里面的元素进行修改就可以,如果只针对一个对象,事实上,我一般也不用结构体的 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |