标题:C语言字库问题,显示不对......
只看楼主
小焦叔叔
Rank: 1
来 自:广西 河池
等 级:新手上路
帖 子:59
专家分:2
注 册:2020-2-15
结帖率:78.57%
已结贴  问题点数:5 回复次数:13 
C语言字库问题,显示不对......
今天一整天我都在写这个汉字字库的程序,过了很多关,但是,最后还是显示的东西看不出是什么字。有哪位热心网友,知道问题在哪,麻烦指教一下,谢谢!!!!!!


程序代码:
#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();
}
搜索更多相关主题的帖子: 显示 unsigned include 字库 char 
2020-02-22 22:10
小焦叔叔
Rank: 1
来 自:广西 河池
等 级:新手上路
帖 子:59
专家分:2
注 册:2020-2-15
得分:0 
智库HZK16里头结构是怎样的?

自学成才
2020-02-22 22:13
小焦叔叔
Rank: 1
来 自:广西 河池
等 级:新手上路
帖 子:59
专家分:2
注 册:2020-2-15
得分:0 
我下的这个是C语言的字库文件吗?





里面从头到尾都是数据,还是unsigned char ...数组的文件?
那个地址怎么写?

自学成才
2020-02-22 22:26
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
https://blog.
HZK16汉字16*16点阵字库的使用及示例程序

能编个毛线衣吗?
2020-02-22 23:23
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:5 

#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;
}
2020-02-23 07:20
小焦叔叔
Rank: 1
来 自:广西 河池
等 级:新手上路
帖 子:59
专家分:2
注 册:2020-2-15
得分:0 
我按我的习惯把你的程序改了一下,显示不对了,麻烦你帮看看哪里出了问题。

程序代码:
#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;
}



自学成才
2020-02-23 14:42
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 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;
}
2020-02-23 15:20
小焦叔叔
Rank: 1
来 自:广西 河池
等 级:新手上路
帖 子:59
专家分:2
注 册:2020-2-15
得分:0 
不用回我了,我已经弄成功了。

自学成才
2020-02-23 16:00
小焦叔叔
Rank: 1
来 自:广西 河池
等 级:新手上路
帖 子:59
专家分:2
注 册:2020-2-15
得分:0 
版主:我用图形模式可以显示汉字了,但是,只能显示数字较小的字,最大到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的平台,我真的佩服它,算个乘法都出错......

自学成才
2020-02-23 21:46
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:0 
在16位平台上,整型常量默认为16位有符号数,常量表达式也是。
long offset=((code[0]-1)*94L+code[1]-1)*32L;

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

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2020-02-24 00:23



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-499365-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.125915 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved