网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
04月24日漏签0天
c语言吧 关注:801,956贴子:4,377,210
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 37回复贴,共1页
<<返回c语言吧
>0< 加载中...

如何高效返回数组地址值

  • 只看楼主
  • 收藏

  • 回复
  • Aoaoao
  • 酱油
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
大家好,最近我在用单片机写一个显示程序,想要通过对显示内容字符值的字库指针地址进行提取,因为是小容量单片机没办法把所有字符的字库都写进去,所有在代码中只写了一部分需要用到的字库,目前的解决方案是这样:使用switch判断当前的文字的GB2312编码,返回对应文字的字库数组,需要先定义数组再把数组放到switch的判断语句中,感觉有点麻烦,想把数组直接定义到return语句后面像返回字符串地址那样省事一点却不支持这样语法,大家有更好的办法吗


  • Aoaoao
  • 酱油
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
字符串本质上就是数组,这样写可以:
return ”ABCDEFG“;
但不能直接返回数组的地址,像这样就不支持:
return {1,2,3,4,5,6};


2026-04-24 00:45:13
广告
不感兴趣
开通SVIP免广告
  • 香菜味包子
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
emun aaa{
GB2312 = 0,
UTF-8 = 1,
.....
}
char character[][] = {
{<GB2312>}
{<UTF-8>},
}
get chara(enum aaa x){
return character[x];
}
你是说这样?


  • 香菜味包子
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
你不就是想实现这样的功能吗?


  • Riachard_Zhang
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我的建议是,直接重新排序文字,从0x80开始排,正好前面放ASCII,后面放汉字
显示的时候判断字符>=0x80就去汉字库提取,<0x80就去ASCII库
实际上ASCII库还可以进一步精简去掉控制字符并向前移腾出更多码位来表示汉字
我在Arduino Nano(MCU:atmega328p,2K byte SRAM、32Kbytes Flash)都实现了中文显示


  • Aoaoao
  • 酱油
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
最终还是选择使用暴力查表法😂


  • 眉间心上
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
汉字字符库用结构体数组保存


  • GTA小鸡
  • 吧主
    14
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
可以参考linux/glibc中charmap的实现:
用一个hash table保存字符映射,key是字符编码,value是字符的点阵数组


2026-04-24 00:39:13
广告
不感兴趣
开通SVIP免广告
  • 7F000001
  • 毛蛋
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
看你的描述是打算返回一串点阵数据出来,而且你似乎不想保存全局内存空间的点阵数据,只想每次都复制一份点阵数据返回。基于这一点,把点阵数据的数组放结构体里面,然后返回结构体对象是最可行的方法。如果你可以像截图代码那样接受全局空间的内存占用,那么在return前直接用static定义点阵数据数组,再返回首地址,也算是殊途同归。但是返回结构体的方式执行效率实在不敢恭维,要执行快一点,肯定要放全局内存空间,然后通过二分查表(单片机线性二分比map要经济一点)返回点阵数据数组首地址是最快的。


  • Riachard_Zhang
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这里先放一下字库和待显示字符串的样子,这是Arduino的代码所以用PROGMEM方式指定将常量存储到flash而不占用SRAM空间,因此要用pgm_read_byte_near()函数来读取而不能直接访问

然后是某个需要显示文字的函数进行文字显示
调用disp函数来显示
void disp(显示的行位置,待显示内容起始位置指针,待显示内容长度,显示的列位置,文字颜色);

这里是具体的disp函数,遇到汉字就多向右挪一个

这里是针对中英文对应的字符显示函数
其中汉字的偏移量为-0x80(因为全部人工映射过了),ASCII字符的偏移量为-32(去掉了前面的控制字符)

手动映射的方法就是把需要显示的字符放在excel里


  • damo_xu
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
如果非要用数组,就没必要用switch。你把所有的asiic码值写成数组的下标,也就是一一对应的哈希表,行不行?这是最快的,但费空间。
即
arr[77]='M'
arr[78]='N'


  • lt861287529
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
☺


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 37回复贴,共1页
<<返回c语言吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示