| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1425 人关注过本帖, 1 人收藏
标题:数组变换的问题
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
呵呵,好像是分节处出了点故障。继续努力,耐心、仔细,肯定可以的,严格按照既定思路办,一步一步验证。只要不是眉毛胡子一把抓,逐步分解确认之下,必能逼近成功。

授人以渔,不授人以鱼。
2012-04-07 23:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册


程序源码:
程序代码:
#include <Windows.h>
#include <cstdio>
#include <cstdlib>
#include <clocale>
#include <vector>
#include <bitset>
#include <conio.h>

// 数据结构
struct hzCode
{
    unsigned short unicode;        // Unicode编码
    unsigned short gbcode;        // GB2312编码
};

// 全局数据
const WCHAR K_ENTER = 0x000D;                                                                   // Enter键码
const size_t IMAGE_SIZE = 16;                                                                   // 点阵规模
const wchar_t CodeListFileName[] = L"E:\\Projects\\test\\test_hzk\\Unicode16_GB2312.DAT";       // 汉字编码对照表文件
const wchar_t zkName[] = L"E:\\Projects\\test\\test_hzk\\HZK16K";                               // 字模文件

HDC hDC = GetDC(GetConsoleWindow());                                                            // 取当前控制台窗口为绘图设备
std::vector<struct hzCode> CodeList;                                                            // 汉字编码对照表

// 函数原型
BOOL LoadCodeList(const wchar_t* FileName);
unsigned short Get_GBcode(unsigned short unicode);
VOID DrawPoint(int x, int y);
void ShowHzString(int row, int col, wchar_t hzString[], FILE* zk, int rotate = 0);
VOID ShowHz(int x, int y, wchar_t word, FILE* zk, int roatet = 0);
void Pause(void);

// 程序入口
// >>>Microsoft Specific<<<
// Alternatively, the main and wmain functions can be declared as returning void (no return value).
// If you declare main or wmain as returning void, you cannot return an exit code to the parent
// process or operating system by using a return statement. To return an exit code when main or wmain
// is declared as void, you must use the exit function.
//
void wmain(int argc, wchar_t *argv[], wchar_t *envp[])
{
    setlocale(LC_ALL, "chs");

    if (!LoadCodeList(CodeListFileName))
    {
        wprintf_s(L"汉字编码对照表%s打开失败!", CodeListFileName);
        Pause();
        return;
    }

    FILE* zk;
    errno_t error = _wfopen_s(&zk, zkName, L"rb");
    if (error != 0)
    {
        wprintf_s(L"字库%s打开失败!", zkName);
        Pause();
        return;
    }
    for (int i = 0; i < 4; ++i)
    {
        ShowHzString(i, 2, L"编程中国论坛小鱼儿欢迎您!", zk, i);
    }
    ShowHzString(5, 0, L"按回车键结束程序", zk);
    fclose(zk);

    Pause();
    ReleaseDC(NULL, hDC);       // 释放绘图设备对象
}

// 功能:装入汉字编码对照表
// 参数:FileName 编码表文件名
// 返回:装入成功为真否则为假
BOOL LoadCodeList(const wchar_t* FileName)
{
    FILE* file;
    errno_t error = _wfopen_s(&file, FileName, L"rb");
    if (error == 0)
    {
        while (!feof(file))
        {
            struct hzCode hz;
            if (fread(&hz, sizeof(hz), 1, file) == 1)
            {
                CodeList.push_back(hz);
            }
            else
            {
                error = ferror(file);
                break;
            }
        }
        fclose(file);
    }
    return (error == 0);
}

// 功能:根据Unicode查找对应GB2312编码
// 返回:如果没有对应的GB2312编码,则返回零
unsigned short Get_GBcode(unsigned short unicode)
{
    unsigned short gbcode = 0;
    std::vector<struct hzCode>::iterator it;
    for (it = CodeList.begin(); it != CodeList.end(); ++it)
    {
        if (it->unicode == unicode)
        {
            gbcode = it->gbcode;
            break;
        }
    }
    return gbcode;
}

// 功能:在指定位置显示一个汉字字符串
// 参数:(row,col) 起始行列坐标
//       hzString  需要显示的汉字字符串,用Unicode编码
//       zk        已打开的字库文件句柄
//       rotate    字符旋转方向 0-正常 1-顺转90度 2-顺转180度 3-顺转270度,默认为0
// 返回:无
void ShowHzString(int row, int col, wchar_t hzString[], FILE* zk, int rotate)
{
    for (int i = 0; hzString[i] != L'\0'; ++i)
    {
        ShowHz(row, col++, hzString[i], zk, rotate);
    }
}

// 功能:在指定位置显示单个汉字
// 参数:(row,col) 起始行列坐标
//       word  需要显示的汉字,用Unicode编码
//       zk    已打开的字库文件句柄
// 返回:无
void ShowHz(int row, int col, wchar_t word, FILE* zk, int rotate)
{
    unsigned short gbCode = Get_GBcode(word);
    if (gbCode != 0)
    {
        unsigned char quCode = (gbCode / 256) - 0xA0;                           // 区码
        unsigned char weiCode = (gbCode % 256) - 0xA0;                          // 位码
        unsigned long offset = ((quCode - 1) * 94 + (weiCode - 1)) * 32L;       // 字模偏移量
        unsigned char buffer[IMAGE_SIZE * 2];                                   // 字模数据
        fseek(zk, offset, SEEK_SET);
        fread(buffer, sizeof(buffer), 1, zk);
        int x = col * IMAGE_SIZE;
        int y = row * IMAGE_SIZE;
        switch (rotate)
        {
            case 1:
                x += IMAGE_SIZE - 1;
                break;
            case 2:
                x += IMAGE_SIZE - 1;
                y += IMAGE_SIZE - 1;
                break;
            case 3:
                y += IMAGE_SIZE - 1;
                break;
        }
        for (int i = 0; i < _countof(buffer); ++i)
        {
            std::bitset<8> byte(buffer[i]);
            for (int j = 7; j >= 0; --j)
            {
                HPEN hPen = CreatePen(PS_SOLID, 1, byte.test(j) ? RGB(255,255,255) : RGB(0, 0, 0));
                SelectObject(hDC, hPen);
                DrawPoint(x, y);
                DeleteObject(hPen);
                switch (rotate)
                {
                    case 0:
                        ++x;
                        break;
                    case 1:
                        ++y;
                        break;
                    case 2:
                        --x;
                        break;
                    case 3:
                        --y;
                        break;
                }
            }
            if (i % 2 != 0)
            {
                switch (rotate)
                {
                    case 0:
                        x = col * IMAGE_SIZE;
                        ++y;
                        break;
                    case 1:
                        y = row * IMAGE_SIZE;
                        --x;
                        break;
                    case 2:
                        x = col * IMAGE_SIZE + IMAGE_SIZE - 1;
                        --y;
                        break;
                    case 3:
                        ++x;
                        y = row * IMAGE_SIZE + IMAGE_SIZE - 1;
                        break;
                }
            }
        }
    }
    else
    {
        // 如果没有对应的汉字,则显示一个方框
        HPEN hPen = CreatePen(PS_SOLID, 1, RGB(255,255,255));
        SelectObject(hDC, hPen);
        Rectangle(hDC, col, row, col + IMAGE_SIZE - 1, row + IMAGE_SIZE - 1);
        DeleteObject(hPen);
    }
}

// 功能:描点
// 参数:(x,y)  点坐标
// 返回:无
// 注释:使用当前设置前景色
VOID DrawPoint(int x, int y)
{
    // 利用绘制椭圆方法描点
    Ellipse(hDC, x - 1, y - 1, x + 1, y + 1);
}

void Pause(void)
{
    while (_getwch() != K_ENTER)
    {
        ;
    }
}

码表对照表文件,使用我之前给你的那个。

[ 本帖最后由 TonyDeng 于 2012-4-8 03:26 编辑 ]

授人以渔,不授人以鱼。
2012-04-08 03:03
kaitianjian
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2011-10-16
收藏
得分:0 
再请教你一个问题:
  VC6.0中,给一个编辑框定义了一个控件变量:CString m_strSendData;m_strSendData = _T(""); 网上说_T是支持Unicode编码的,但是我输入汉字,
m_strSendData 存储的是汉字的区位码,若输入字母或数字,貌似就成了ASC,我要想让m_strSendData存储的也是字母或数字的Unicode区位码,
该怎么实现?

      CMSComDlg(CWnd* pParent = NULL);    // standard constructor
// Dialog Data
    //{{AFX_DATA(CMSComDlg)
    enum { IDD = IDD_MSCOM_DIALOG };
    CMSComm    m_ctrMSCom;
    CString    m_strComNo;
    CString    m_strCheckBit;
    CString    m_strRecvData;
    CString m_strSendData;   //编辑框控件变量


CMSComDlg::CMSComDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CMSComDlg::IDD, pParent)
{
    //{{AFX_DATA_INIT(CMSComDlg)
    m_strComNo = _T("");
    m_strBps = _T("");
    m_strDataBit = _T("");
    m_strStopBit = _T("");
    m_strCheckBit = _T("");
    m_strRecvData = _T("");
    m_strSendData = _T("");   //编辑框控件变量
2012-04-09 11:59
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
用_T标识的字符串,是一个宏,它是根据你程序中是否有#define _UNICODE宏定义而变化的,如果没有这个宏,_T出来的仍然是普通的DBCS编码,其现象就是你所说的那样的。一般为确保使用Unicode宽字符编码,最好直接用L""字符串——_T就是发现有那个宏时把字符串变换为L""格式。

授人以渔,不授人以鱼。
2012-04-09 13:50
kaitianjian
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2011-10-16
收藏
得分:0 
我将那改为m_strSendData = L"";还是不行,每当发送单个字母或数字时程序就会卡主,网上搜了下,说MFC默认是ASC,可以将它改为Unicode,我试着改了下,
出现了好多错误。
2012-04-09 20:00
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
是的,需要很多配合。你看我的代码,从头到尾都有各种对应的带w的输入输出函数配套用。这就是我经常说现在就要趁早适应宽字符编程习惯的原因,还学以前那种ANSI模式的,将来就知道“痛苦”两字怎么写。

授人以渔,不授人以鱼。
2012-04-09 20:03
kaitianjian
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2011-10-16
收藏
得分:0 
这样改的太多了,想了个办法,将字母和数字的区位码单独放到数组里,然后判断输入的与0xA0作比较,大于的就是汉字输入,否则是字母或数字,再从数组里拿取相应的区位码,去读取字模,但是发送数字结果正确,而无论输入什么汉字,都显示的是“烫”,搞不懂了~
  void CMSComDlg::ReadDataFromFile()
{   
    unsigned char num[2][10] = {
        {0xA3,0xA3,0xA3,0xA3,0xA3,0xA3,0xA3,0xA3,0xA3,0xA3},   //0~9的区位码
        {0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9}
    };
     char *p = m_strSendData.GetBuffer(m_strSendData.GetLength());  //输入字符的存储区域
     unsigned   char i=0, j=0;
     unsigned   char   n,qh,wh;
     unsigned   long   offset;
     FILE *fd;
     fd=fopen( "HZK16 ", "rb ");
     memset(cBuf, 0, 1024);
     while(p[i])
  for(j = 0; j < m_strSendData.GetLength()/2; j++)    //getlength返回字节数
     {
     if (p[i] <=0xA0)     //小于0xA0,输入的是数字
    {
          i++;
      n = p[i++] - '0';
       qh =num[0][n] - 0xA0;
    wh =num[1][n] - 0xA0;        
     }
    else {            //否则是汉字
    qh=p[i++]-0xa0;
     wh=p[i++]-0xa0;
      }
2012-04-16 12:20
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你这个判断法在逻辑上就不正确,主要问题显然是你还没有明白(混有)汉字的字符串的真实构造,而且对各种不同的字符编码没有区分意识。一口吃不成胖子,怎么向你解释才好呢。

授人以渔,不授人以鱼。
2012-04-16 12:31
kaitianjian
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2011-10-16
收藏
得分:0 
唉……我不是搞这方面的,为了用单片做个点阵才照着书上的例子、网上搜了些资料,去搞这个!
2012-04-16 20:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
现在有固化芯片带点阵的,本来不用自己做。

授人以渔,不授人以鱼。
2012-04-16 20:15
快速回复:数组变换的问题
数据加载中...
 
   



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

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