OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10019|回复: 2

外部结构体声明的问题!

[复制链接]

33

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
280
金钱
280
注册时间
2013-6-18
在线时间
15 小时
发表于 2013-8-20 20:37:14 | 显示全部楼层 |阅读模式
//起因是为了做LCD汉字显示!去了个模如下!
// ------------------  汉字字模的数据结构定义 ------------------------ //
typedef struct typFNT_GB16                 // 汉字字模数据结构
{
       signed char Index[2];               // 汉字内码索引
       char Msk[32];                       // 点阵码数据
};

/////////////////////////////////////////////////////////////////////////
// 汉字字模表                                                          //
// 汉字库: 宋体16.dot,横向取模左高位,数据排列:从左到右从上到下         //
/////////////////////////////////////////////////////////////////////////
struct typFNT_GB16 code GB_16[] =          // 数据表
{
"液", 0x00,0x80,0x40,0x44,0x37,0xFE,0x10,0x20,
      0x81,0x20,0x61,0x3C,0x22,0x44,0x0A,0x64,
      0x16,0x98,0x2B,0x48,0xE2,0x50,0x22,0x20,
      0x22,0x50,0x22,0x8E,0x23,0x04,0x22,0x00,

"晶", 0x0F,0xE0,0x08,0x20,0x08,0x20,0x0F,0xE0,
      0x08,0x20,0x08,0x20,0x0F,0xE0,0x08,0x24,
      0x7E,0xFE,0x42,0x84,0x42,0x84,0x7E,0xFC,
      0x42,0x84,0x42,0x84,0x7E,0xFC,0x42,0x84
};

// 汉字表:
// 液晶
//它定义了一个结构体,而却 GB_16[] 这个结构体数组在不同的.c文件中需要被调用!
//所以要要声明外部结构体。在网上看了下大概方法是建一个XX.C和XX.H文件,文件内容大概如下:
///xx.h
//typedef struct typFNT_GB16                 // 汉字字模数据结构
//{
//       signed char Index[2];               // 汉字内码索引
//      char Msk[32];                       // 点阵码数据
//};
//extern   typFNT_GB16 code GB_16[] ;
//xx.c
#include "xx.h"
struct typFNT_GB16 code GB_16[] =          // 数据表
{
"液", 0x00,0x80,0x40,0x44,0x37,0xFE,0x10,0x20,
      0x81,0x20,0x61,0x3C,0x22,0x44,0x0A,0x64,
      0x16,0x98,0x2B,0x48,0xE2,0x50,0x22,0x20,
      0x22,0x50,0x22,0x8E,0x23,0x04,0x22,0x00,

"晶", 0x0F,0xE0,0x08,0x20,0x08,0x20,0x0F,0xE0,
      0x08,0x20,0x08,0x20,0x0F,0xE0,0x08,0x24,
      0x7E,0xFE,0x42,0x84,0x42,0x84,0x7E,0xFC,
      0x42,0x84,0x42,0x84,0x7E,0xFC,0x42,0x84
};
////////////////////////////////////////////////////////
网上都是这样说的当我自己也是了一下,但是不行代码如下
#ifndef __LCD_H
#define __LCD_H  
struct typFNT_GB16                 // 汉字字模数据结构
{
       signed char Index[2];               // 汉字内码索引
       char Msk[32];                       // 点阵码数据
};
extern typFNT_GB16 yy[];     
#endif
///////////////////////////////////////////////////////////
#include "lcd.h"

struct typFNT_GB16  GB_16[] =          // 数据表
{
"液", 0x00,0x80,0x40,0x44,0x37,0xFE,0x10,0x20,
      0x81,0x20,0x61,0x3C,0x22,0x44,0x0A,0x64,
      0x16,0x98,0x2B,0x48,0xE2,0x50,0x22,0x20,
      0x22,0x50,0x22,0x8E,0x23,0x04,0x22,0x00,

"晶", 0x0F,0xE0,0x08,0x20,0x08,0x20,0x0F,0xE0,
      0x08,0x20,0x08,0x20,0x0F,0xE0,0x08,0x24,
      0x7E,0xFE,0x42,0x84,0x42,0x84,0x7E,0xFC,
      0x42,0x84,0x42,0x84,0x7E,0xFC,0x42,0x84
};
/////////////////////////////////////////////////////////////////////////
编译的时候报错,指示在  extern typFNT_GB16 yy[]; 地方出错!
..\HARDWARE\LCD\lcd.h(10): error:  #20: identifier "typFNT_GB16" is undefined
说是没有找到这个结构体类型!我就奇怪了,
struct typFNT_GB16                 // 汉字字模数据结构
{
       signed char Index[2];               // 汉字内码索引
       char Msk[32];                       // 点阵码数据
};
这个不就是他的类型么!不懂了,据网上说:
对于声明外部构造类型(结构体,共用体)变量,要注意两点,这两点也是和声明外部基本类型变量的区别。
一、声明外部构造类型变量时,该文件中必须要有构造类型的定义实体,否则会报错。
二、声明外部构造类型变量时,不能省略变量类型,否则也会报错。(声明外部基本类型变量时,却可以省略变量类型)。
我好想也没有出错吧,找了一下午到不到是哪里错了!不知道是什么原因!
大家一起来看看吧!
一知半解!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

25

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-8-19
在线时间
0 小时
发表于 2013-8-20 20:56:51 | 显示全部楼层
新的数据结构typFNT_GB16定义出错了,正确的如下:

// ------------------  汉字字模的数据结构定义 ------------------------ //
typedef struct                  // 汉字字模数据结构
{
       signed char Index[2];               // 汉字内码索引
       char Msk[32];                       // 点阵码数据
}typFNT_GB16;

你先把typedef这个关键字的用法搞懂了再说好不!

数据结构定义:typedef   原数据类型   新数据类型;
应用:新数据类型 变量名;


struct typFNT_GB16  GB_16[] ;
怎么也应该是:
extern struct typFNT_GB16  GB_16[] ;

基本语法。

回复 支持 反对

使用道具 举报

33

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
280
金钱
280
注册时间
2013-6-18
在线时间
15 小时
 楼主| 发表于 2013-8-21 09:21:55 | 显示全部楼层
回复【2楼】Ting:
---------------------------------
我一直以为 typFNT_GB16就是结构体的名字,
其实 struct typFNT_GB16才是结构体名字,,
记得C++里面好像可以省略 struct的。是我混淆了!
一知半解!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-14 17:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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