搜索
bottom↓
回复: 47

结构体的一种用法。

[复制链接]

出0入0汤圆

发表于 2009-8-17 21:48:18 | 显示全部楼层 |阅读模式
在C语言书上,结构体是作为最后的部分内容,我们当时上课是选学的,没有看过,看别人的程序也很少提到。LCD12864中文显示的程序,LCD是没有字库的,要自己写字库。常见写法是uchar code table[32][32] ,然后将字模加进去。但是如果汉字有很多是重复显示的话,生成了很多重复的代码。
今天看到一本书上这样利用结构体定义的字模。写的很简练。
个人看了下,举个例子,
struct typFNT_GB16
{
        unsigned char index[2];
        char ms;
};
struct typFNT_GB16 code GB_16[]= {       
"液",0x01,
"我",0x02,
"想",0x05
};
char dis_hz(uchar *hz)
{
        uchar k;
                for(k=0;k<6;k++)
        {
                if(hz[0] == GB_16[k].index[0] && hz[1] == GB_16[k].index[1])
                        break;
        }
        return         GB_16[k].ms;
}
void main()
{
        P1=dis_hz("我");
        P2=dis_hz("想");
        while(1);
}
这样的汉字寻找要方便得多。
如果想看看的话,下载下来自己看吧!实现的功能很简单,很普通。但程序是第一次见人这样写字模。分享出来,看到的初学者会大吃一惊的。我的表达能力不太好。点击此处下载 ourdev_471999.rar(文件大小:26K) (原文件名:12864.rar)

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2009-8-17 22:34:43 | 显示全部楼层
刚好正在搞这个收藏下学习先

出0入0汤圆

发表于 2009-8-17 23:56:48 | 显示全部楼层
记号

出0入0汤圆

发表于 2009-8-18 00:23:45 | 显示全部楼层
mark

出0入4汤圆

发表于 2009-8-18 07:18:01 | 显示全部楼层
make

出0入0汤圆

发表于 2009-8-18 08:09:54 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-8-18 08:39:54 | 显示全部楼层
大吃一斤

出70入0汤圆

发表于 2009-8-18 09:33:41 | 显示全部楼层
不错,有点想法

出0入0汤圆

发表于 2009-8-18 09:41:57 | 显示全部楼层
这个写法着实不错,便于管理,但是如果字模多了,那搜索时间可能就会比较费时,比如你要显示的的汉字刚好他的index是最后一个.

出0入0汤圆

发表于 2009-8-18 09:45:32 | 显示全部楼层
先做个记号.

出0入0汤圆

发表于 2009-8-18 09:46:09 | 显示全部楼层
顶一下

出0入0汤圆

发表于 2009-8-18 10:04:47 | 显示全部楼层
先做个记号

出0入0汤圆

发表于 2009-8-18 10:04:50 | 显示全部楼层
嗯  一直这么用

出0入0汤圆

发表于 2009-8-18 10:37:35 | 显示全部楼层
这个有意思。但是,你程序中,C语言里面,可以直接使用汉字吗?
struct typFNT_GB16 code GB_16[]= {
"液",0x01,
"我",0x02,
"想",0x05
};
这里的,液、我、想,三个字,可以直接使用吗?

出0入0汤圆

发表于 2009-8-18 10:49:21 | 显示全部楼层
PICC好象不能编译通过,原因是不识别汉字

出0入0汤圆

发表于 2009-8-18 10:57:37 | 显示全部楼层
那这样也真够郁闷, picc

出0入0汤圆

 楼主| 发表于 2009-8-18 14:55:32 | 显示全部楼层
回复8楼
这个写法着实不错,便于管理,但是如果字模多了,那搜索时间可能就会比较费时,比如你要显示的的汉字刚好他的index是最后一个.
的确。这种说法,只用于少数的固定汉字显示。如果是显示汉字不固定,就要挂字库,或用有字库的显示元件。那样根据内码直接算出是第几个汉字,要快多了。
回复13楼。
我只keil,cvavr,iccavr,gccavr中试了试,可以通过。pic上的东西,没有试过。
用了3年的C语言,只到看过这个程序,我才知道有sizeof这个函数。用来查看那什么东西/因为原程序是gccavr的,我以为是编译器的专有的内容。在论坛sou了一下,才知道是C语言的内容。
LS说PICC不支持,现在你写个支持的啊!一定赚发了。^@^

出0入0汤圆

发表于 2009-8-18 15:20:59 | 显示全部楼层
"用了3年的C语言,只到看过这个程序,我才知道有sizeof这个函数。"

sizeof不是函数,
sizeof是C语言关键字,是C语言运算符。
(运算符和函数是不一样的)

sizeof(a) ,如果a是一个变量,括号也可以不要,可写成sizeof a

出0入0汤圆

发表于 2009-8-18 17:37:31 | 显示全部楼层
sizeof(a)
好像时计算长度什么的吧。

出0入0汤圆

发表于 2009-8-18 18:55:19 | 显示全部楼层
sizeof是一种运算符,你不需要加载任何头文件即可以用。
结构体的这种用法很常用的,在windows的消息处理中就有。

出0入0汤圆

发表于 2009-8-18 19:10:42 | 显示全部楼层
C语言基础都不学的吗?

关键字有哪些都不知道,只有汗了...

sizeof,编译器会编译出常量的...

出0入0汤圆

 楼主| 发表于 2009-8-19 10:15:03 | 显示全部楼层
C语言基础学是学但是大一上C语言课,以为是计算机用的东西,没有认真学。直到大三下期学了单片机后。无意中在网上才发现单片机可以用C语言来开发,在此之前我没有见过单片机的真实面貌,只是在书上看过原理图,不要提编程啊什么的,没这概念,考试的题全是书后的例题,考前几天背下来就可以,对于二流大学的电子学生只有这样的,后来课程设计,才开始学了一点东西/见到40脚的单片机。我课程设计的题目是温度计,当然不可能做出来。因为我研究了三周的流水灯,当时一直搞不清定时器是怎么一回事。不要讲自学什么的,因为你自学的驱动是知道世界上有这么个东西,你的好奇心使你去专研,如果你根本不知道世界上有这么个东西,你学个屁啊。

sizeof是关键字,但是初学者并不常用,同为初学者,提醒一下初学者/看看积分就知道牛人了。上千分的人,很NB的。

出0入0汤圆

发表于 2009-8-19 10:29:55 | 显示全部楼层
不错,看来以后我要多用用结构体,不然都落后了。呵呵呵

出0入0汤圆

发表于 2009-8-19 12:00:18 | 显示全部楼层
楼主,你好!
想请教个问题:
在GCC AVR中,我也是和你一样的方法,但会出现警告。


我的程序部分:
struct CN16x16_STR
{
  unsigned char Index[2];
  unsigned char Line[32];
};

struct CN16x16_STR
Cn16x16Lib[] PROGMEM = {

"未",{0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x01,0x00,0x01,0x00,0xFF,0xFE,0x03,0x00,0x03,0x80,0x05,0x40,0x05,0x20,0x09,0x18,0x31,0x0E,0xC1,0x04,0x01,0x00,0x01,0x00},

"插",{0x10,0x1C,0x13,0xE0,0x10,0x20,0xFC,0x20,0x13,0xFE,0x10,0x20,0x14,0xA0,0x1B,0x2E,0x32,0x22,0xD2,0x22,0x13,0xAE,0x12,0x22,0x12,0x22,0x13,0xFE,0x52,0x02,0x20,0x00},

"入",{0x0C,0x00,0x06,0x00,0x02,0x00,0x01,0x00,0x03,0x00,0x02,0x80,0x02,0x80,0x04,0x40,0x04,0x20,0x08,0x20,0x08,0x10,0x10,0x08,0x20,0x0E,0x40,0x04,0x80,0x00,0x00,0x00},

"存",{0x03,0x00,0x02,0x00,0x7F,0xFC,0x04,0x00,0x04,0x00,0x0B,0xF8,0x18,0x10,0x10,0x20,0x30,0x20,0x57,0xFE,0x90,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0xA0,0x10,0x40},

"储",{0x10,0x20,0x18,0x24,0x15,0xFE,0x24,0x24,0x20,0x28,0x5D,0xFE,0xA4,0x20,0x24,0x40,0x25,0xFC,0x26,0x84,0x24,0xFC,0x24,0x84,0x25,0x84,0x2E,0xFC,0x24,0x84,0x00,0x00},

"卡",{0x01,0x00,0x01,0x00,0x01,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x7F,0xFE,0x01,0x00,0x01,0x00,0x01,0x40,0x01,0x30,0x01,0x18,0x01,0x0C,0x01,0x08,0x01,0x00,0x01,0x00},


};

警告内容:
warning: missing braces around initializer
warning: (near initialization for `Cn16x16Lib[0]')
但在KEIL中,却没有警告。

不知道,楼主能帮忙解答下吗?

出0入0汤圆

发表于 2009-8-19 13:30:12 | 显示全部楼层
以为是什么新技术呢。
其实自建一个索引表。
建议:还是按照汉字排放顺序编号,这样就可以用2分法 很快查到。

出0入0汤圆

发表于 2009-8-19 16:00:50 | 显示全部楼层
字符串用法错误,"液"是一个字符串,占用三个字节,前两个为汉字内码,最后一个是'\0',定义index[2]是错误的,数组越界。

出0入0汤圆

发表于 2009-8-19 16:07:01 | 显示全部楼层
直接做个编码处理程序,加到编译器的预处理里
就不需要查表了...

出0入0汤圆

 楼主| 发表于 2009-8-19 17:14:34 | 显示全部楼层
to:【23楼】 zbjzxc
人家的原程序就是在GCC里面的,至于说warning,我看就是"未",{}加了{},我不清楚是不是这样的原因。你下载来程序看看。这是一本书的例子。个人没有任何改动。
【25楼】 shark
一个汉字两个字节,加上\0是三个字节,的确是啊!但编译器并没有报错,也没有warning。而且,得到的结果也是正常的。这是什么原因呢?
【24楼】 zhonghua_li 蓝色天空
哎!只说一句话,会者不难,难者不会,

出0入0汤圆

发表于 2009-8-19 17:36:56 | 显示全部楼层
没有警告?看看这个
在GCC flash中定义如下的汉字字模结构老是报两个警告,请问是什么意思啊?

还有这个
用GCC编程几个警告信息的处理

出0入0汤圆

 楼主| 发表于 2009-8-19 19:00:34 | 显示全部楼层
【28楼】 shark
的确是啊!那也就是说很多人的定义都是有错误的。
许多教程写LCD1602的固定显示时,定义要显示的内容为uchar code tab1[2]={"ab"};uchar code tab2[3]={"cde"};//以C51为例
是不是应该多定义一个呢?
原来论坛上早有这种写法了啊!是我孤陋寡闻了!我说呢!单片机书的例程以网上摘录为主。

出0入0汤圆

发表于 2009-8-19 20:11:31 | 显示全部楼层
uchar tab1[2]={"ab"};//或等价的uchar tab1[2]="ab"

C语言还可以接受这种数组初始化的写法,最后的一个'\0'在初始化的时候被丢弃,C++是不允许这种数组越界的,直接编译“数组越界错误”(不是警告),如果你的程序考虑未来移植到C++,那最好别这么写。


to 23楼:
定义结构体数组并初始化的时候,如果结构体的成员也是构造类型,那要把结构体数组的每个成员用{}包围。
例如:
struct {
    uchar i[3];//如果你非得定义2个的话,将不能称植到C++
    uchar a;
} array[]={  
   { "你",1}, {"好",2} ,{...}
};

出330入0汤圆

发表于 2009-8-19 23:33:26 | 显示全部楼层
30楼这样一改,结构整个都清晰明朗多了。
程序只有写成这样才能使人豁然开朗、茅塞顿开。

出0入0汤圆

发表于 2009-8-19 23:40:56 | 显示全部楼层
马克

出0入0汤圆

发表于 2009-8-20 08:48:57 | 显示全部楼层
学习

出0入0汤圆

发表于 2009-8-20 10:26:53 | 显示全部楼层
谢谢。楼主!

出0入0汤圆

发表于 2009-8-20 12:18:33 | 显示全部楼层
刚才,试验了下。可以了~~哈哈~~
再次,感谢楼主分享~~

出0入0汤圆

发表于 2009-8-20 13:55:56 | 显示全部楼层
地球人都是这么做地...

出0入0汤圆

发表于 2009-8-20 14:21:20 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-8-10 21:15:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-10 21:18:36 | 显示全部楼层
用了六年了,呵呵。楼主数组下表用 3 吧。

出0入0汤圆

发表于 2010-8-10 21:24:56 | 显示全部楼层
我还做了一个跟他相关的字模生成器;只要把需要生成的字模写文本文件里,就可以自动生成类似结构体的 c 文件。



(原文件名:1.jpg)


(原文件名:3.JPG)


(原文件名:2.JPG)

出0入0汤圆

发表于 2010-8-10 22:41:46 | 显示全部楼层
看看长沙太阳人的液晶字模都是这样搞的,速度也不错。

出0入0汤圆

发表于 2010-8-11 08:49:03 | 显示全部楼层
markkkk

出0入0汤圆

发表于 2012-10-24 22:27:27 | 显示全部楼层
很旧的贴子,从字库找字

出0入0汤圆

发表于 2013-10-16 14:11:01 | 显示全部楼层
好贴,顶........................

出0入0汤圆

发表于 2013-10-21 16:18:14 | 显示全部楼层
zbjzxc 发表于 2009-8-19 12:00
楼主,你好!
想请教个问题:
在GCC AVR中,我也是和你一样的方法,但会出现警告。

我的程序部分:
struct CN16x16_STR
{
  unsigned char Index[2];
  unsigned char Line[32];
};

struct CN16x16_STR
Cn16x16Lib[] PROGMEM = {

"未",{0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x01,0x00,0x01,0x00,0xFF,0xFE,0x03,0x00,0x03,0x80,0x05,0x40,0x05,0x20,0x09,0x18,0x31,0x0E,0xC1,0x04,0x01,0x00,0x01,0x00},

"插",{0x10,0x1C,0x13,0xE0,0x10,0x20,0xFC,0x20,0x13,0xFE,0x10,0x20,0x14,0xA0,0x1B,0x2E,0x32,0x22,0xD2,0x22,0x13,0xAE,0x12,0x22,0x12,0x22,0x13,0xFE,0x52,0x02,0x20,0x00},

"入",{0x0C,0x00,0x06,0x00,0x02,0x00,0x01,0x00,0x03,0x00,0x02,0x80,0x02,0x80,0x04,0x40,0x04,0x20,0x08,0x20,0x08,0x10,0x10,0x08,0x20,0x0E,0x40,0x04,0x80,0x00,0x00,0x00},

"存",{0x03,0x00,0x02,0x00,0x7F,0xFC,0x04,0x00,0x04,0x00,0x0B,0xF8,0x18,0x10,0x10,0x20,0x30,0x20,0x57,0xFE,0x90,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0xA0,0x10,0x40},

"储",{0x10,0x20,0x18,0x24,0x15,0xFE,0x24,0x24,0x20,0x28,0x5D,0xFE,0xA4,0x20,0x24,0x40,0x25,0xFC,0x26,0x84,0x24,0xFC,0x24,0x84,0x25,0x84,0x2E,0xFC,0x24,0x84,0x00,0x00},

"卡",{0x01,0x00,0x01,0x00,0x01,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x7F,0xFE,0x01,0x00,0x01,0x00,0x01,0x40,0x01,0x30,0x01,0x18,0x01,0x0C,0x01,0x08,0x01,0x00,0x01,0x00},


};


首先语法上就有错误,最后一个,号应该去掉。

出0入0汤圆

发表于 2013-10-21 16:53:47 来自手机 | 显示全部楼层
查表,我用过,但是查找时费些时间。适合小字库。

出0入0汤圆

发表于 2013-10-24 08:31:35 | 显示全部楼层
zbjzxc 发表于 2009-8-19 12:00
楼主,你好!
想请教个问题:
在GCC AVR中,我也是和你一样的方法,但会出现警告。

所有的双引号应该改用单引号,你如"未"改成'未'
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 00:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表