注册 登录
编程论坛 C语言论坛

C语言字库问题,显示不对......

小焦叔叔 发布于 2020-02-22 22:10, 3304 次点击
今天一整天我都在写这个汉字字库的程序,过了很多关,但是,最后还是显示的东西看不出是什么字。有哪位热心网友,知道问题在哪,麻烦指教一下,谢谢!!!!!!


程序代码:
#include"graphics.h"
#include"stdio.h"
#include"conio.h"
#include"process.h"

void main()
{
   int gdriver=DETECT,gmode;
   FILE *fp;
   unsigned char code[2]={16,1};
   unsigned char qh,wh;
   unsigned long addr=0;
   unsigned char buf[32],*ptr;
   unsigned char i,j,k;
   unsigned char x=0,y=0;

   initgraph(&gdriver,&gmode,"C:\\TRUBOC2\\BGI");
   setbkcolor(1);
   setcolor(14);
   setaspectratio(640,480);

   qh=code[0];
   wh=code[1];
   addr=(94*(qh-1)+wh-1)*32;

   fp=fopen("E:\\HZK16","rb");
   if(fp==NULL)
   {
      exit(1);
   }
   fseek(fp,addr,0);
   fread(buf,32,1,fp);
   fclose(fp);

   ptr=buf;
   for(i=0;i<16;i++)
   {
      for(j=0;j<2;j++)
      {
     for(k=0;k<8;k++)
     {
        if(((*ptr)&0x80)==0x80)
        {
           putpixel(x+20,-y+100+240,14);
        }
        if(((*ptr)&0x80)==0x00)
        {
           putpixel(x+20,-y+100+240,1);
        }
        (*ptr)=(*ptr)<<1;
        ptr++;
        x++;
     }
      }
      x=0;
      y++;
   }

   getch();
   closegraph();
}
13 回复
#2
小焦叔叔2020-02-22 22:13
智库HZK16里头结构是怎样的?
#3
小焦叔叔2020-02-22 22:26
我下的这个是C语言的字库文件吗?

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录


里面从头到尾都是数据,还是unsigned char ...数组的文件?
那个地址怎么写?
#4
wmf20142020-02-22 23:23
https://blog.
HZK16汉字16*16点阵字库的使用及示例程序
#5
吹水佬2020-02-23 07:20
只有本站会员才能查看附件,请 登录

#include <stdio.h>

unsigned short int *GetHZ16(FILE *fp, unsigned short int *buf, unsigned char *hz)
{
    int offset = (94*(hz[0]-0xA0-1) + (hz[1]-0xA0-1)) * 32;
    fseek(fp, offset, SEEK_SET);
    fread(buf, 32, 1, fp);
    return buf;
}

void HZ16_print(unsigned short int *buf)
{
    unsigned short int cc=0, *p=buf;
    int i,j;
    for (i=0; i<16; ++i,++p)
    {
        cc = (*p>>8)|(*p<<8);
        for (j=15; j>=0; --j)
        {
            if ((cc>>j)&1)
                printf("*");
            else
                printf(" ");
        }
        printf("\n");
    }
    printf("\n");
}

int main()
{
    FILE *fp = fopen("HZK16","rb");
    if (fp == NULL)
        return 1;
    unsigned short int buf[16];
    HZ16_print(GetHZ16(fp, buf, "汉"));
    HZ16_print(GetHZ16(fp, buf, "字"));
    fclose(fp);
    return 0;
}
#6
小焦叔叔2020-02-23 14:42
我按我的习惯把你的程序改了一下,显示不对了,麻烦你帮看看哪里出了问题。

程序代码:
#include <stdio.h>

unsigned short *GetHZ16(FILE *fp, unsigned short *buf, unsigned char *hz)
{
   int offset;
   
    offset = (94*(hz[0]-0xA0-1) + (hz[1]-0xA0-1)) * 32;
   fseek(fp, offset, SEEK_SET);
   fread(buf, 32, 1, fp);
   
   return(buf);
}

void HZ16_print(unsigned short *buf)
{
   unsigned short flag=0x8000, *ptr=buf;
   int i,j;
   
   for (i=0; i<16; i++)
   {
      for (j=0; j<16; j++)
      {
           if((*ptr)&flag)
           {
               printf("*");
            }
            else
            {
                printf(" ");
            }
            flag=flag>>1;
      }
      flag=0x8000;
      ptr++;
      printf("\n");
   }
   printf("\n");
}

int main()
{
   FILE *fp = fopen("E:\\HZK16","rb");
   if (fp == NULL)
      return 1;
   unsigned short buf[16];
   HZ16_print(GetHZ16(fp, buf, ""));
   HZ16_print(GetHZ16(fp, buf, ""));
   fclose(fp);
   return 0;
}


只有本站会员才能查看附件,请 登录
#7
吹水佬2020-02-23 15:20
回复 6楼 小焦叔叔
#include <stdio.h>

unsigned short *GetHZ16(FILE *fp, unsigned short *buf, unsigned char *hz)
{
    int offset;

    offset = (94*(hz[0]-0xA0-1) + (hz[1]-0xA0-1)) * 32;
    fseek(fp, offset, SEEK_SET);
    fread(buf, 32, 1, fp);
    return(buf);
}

void HZ16_print(unsigned short *buf)
{
    unsigned short flag=0x8000, ptr;
    int i,j;
    for (i=0; i<16; i++)
    {
        ptr = (buf[i]>>8)|(buf[i]<<8);
        for (j=0; j<16; j++)
        {
            if((ptr)&flag)
            {
                printf("*");
            }
            else
            {
                printf(" ");
            }
            flag=flag>>1;
        }
        flag=0x8000;
        printf("\n");
    }
    printf("\n");
}

int main()
{
    FILE *fp = fopen("E:\\HZK16","rb");
    if (fp == NULL)
        return 1;
    unsigned short buf[16];
    HZ16_print(GetHZ16(fp, buf, "汉"));
    HZ16_print(GetHZ16(fp, buf, "字"));
    fclose(fp);
    return 0;
}
#8
小焦叔叔2020-02-23 16:00
不用回我了,我已经弄成功了。
#9
小焦叔叔2020-02-23 21:46
版主:我用图形模式可以显示汉字了,但是,只能显示数字较小的字,最大到2274(蛾字)。再加大数字就会出错,换了unsigned long根本显示不了。我换成用字符模式,想验证哪里出错,unsigned long做数据类型,就算直接给变量赋值,显示的数字也没对过,这是为什么?你经验丰富,麻烦帮我解释解释,谢谢!!!!!!

我写的程序(图形模式,成功了):

程序代码:
#include"graphics.h"
#include"stdio.h"
#include"conio.h"
#include"process.h"

void main()
{
   int gdriver=DETECT,gmode;
   FILE *fp;
   unsigned char code[2]={22,74};
   unsigned int offset=((code[0]-1)*94+(code[1]-1))*32;
   unsigned char buf[32];
   unsigned char i,j,k;
   unsigned char x=0,y=0;
   unsigned char flag=0x80;

   initgraph(&gdriver,&gmode,"C:\\TRUBOC2\\BGI");
   setbkcolor(0);
   setcolor(10);

   fp=fopen("E:\\HZK16","rb");
   if(fp==NULL)
   {
      exit(1);
   }
   fseek(fp,offset,0);
   fread(buf,32,1,fp);

   for(i=0;i<16;i++)
   {
      for(j=0;j<2;j++)
      {
     for(k=0;k<8;k++)
     {
        if(buf[i*2+j]&(flag>>k))
        {
           putpixel(x,y+20,10);
           x++;
        }
        else
        {
           putpixel(x,y+20,0);
           x++;
        }
     }
      }
      x=0;
      y++;
   }

   getch();
   closegraph();
   fclose(fp);
}


显示一个“蛾”字,是我能显示的最后一个字。

只有本站会员才能查看附件,请 登录


下面是我测试offset赋值的程序,就算直接给unsigned long赋值,也不会显示正确结果。
换成unsigned char ,超过一定数值也会显示错误!

程序代码:
#include"stdio.h"
#include"conio.h"

void main()
{
   unsigned long offset=((16-1)*94+(1-1))*32;

   printf("\n%lu",offset);

   getch();
}


TURBOC2.0的平台,我真的佩服它,算个乘法都出错......
#10
forever742020-02-24 00:23
在16位平台上,整型常量默认为16位有符号数,常量表达式也是。
long offset=((code[0]-1)*94L+code[1]-1)*32L;

我对楼主您顽固地坚持学习使用TC这一行为表现出来的与社会脱节的前景表示忧虑。
#11
吹水佬2020-02-24 05:56
只有本站会员才能查看附件,请 登录
#12
吹水佬2020-02-24 06:03
以下是引用小焦叔叔在2020-2-23 21:46:19的发言:

换了unsigned long根本显示不了。我换成用字符模式,想验证哪里出错,unsigned long做数据类型,就算直接给变量赋值,显示的数字也没对过,这是为什么?
TURBOC2.0的平台,我真的佩服它,算个乘法都出错......

TURBOC2.0没用过,用sizeof(unsigned long)看看
#13
吹水佬2020-02-24 07:14
以下是引用forever74在2020-2-24 00:23:05的发言:

对楼主您顽固地坚持学习使用TC这一行为表现出来的与社会脱节的前景表示忧虑。

楼主玩嵌入的,可能喜欢TC的简洁,尤其是自带图形库。
#14
小焦叔叔2020-02-24 12:32
你说对了,我没读过大学,这些都是自己自学的,单片机编程做得不错,但是没人给我指怎样赚钱的路...
1