设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 4038|回复: 27
打印 上一主题 下一主题

[有事请教] 这是逼着姐造一遍轮子的节奏么

[复制链接]

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
23124
在线时间
2387 小时
注册时间
2005-10-15
帖子
1166

开拓者

跳转到指定楼层
1
发表于 2017-11-21 14:32:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
INI 代码复制
  1. [阿尔西斯]
  2. profile=剑士一枚
  3. age=28
  4. gender=
  5. height=175
  6. weight=60
  7. is_dual_wield=false
  8. is_hero=true
  9. [帕吉尔]
  10. profile=脑后有反骨的仔排
  11. age=45
  12. gender=
  13. height=192
  14. weight=80
  15. is_dual_wield=true
  16. is_hero=false

RUBY 代码复制
  1. Reader = Win32API.new("kernel32", "GetPrivateProfileString", "ppppip", "i")
  2.   value = "\0" * 65534
  3.   Reader.call("阿尔西斯", "gender", "nil", value, 65534, NOTE_FILE_NAME)
  4.   p value.strip!


RUBY 代码复制
  1. Reader = Win32API.new("kernel32", "GetPrivateProfileStringW", "ppppip", "i")
  2.   value = "\0" * 65534
  3.   Reader.call("阿尔西斯", "gender", "nil", value, 65534, [font=&quot]NOTE_FILE_NAME[/font])
  4.   p value.strip!



俩都试了,各种打出nil,nil,nil,nil,nil,nil,nil.......

点评

然而只要将[]里的内容换为英文就没有任何问题了……  发表于 2017-11-21 14:32
SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。

Lv5.捕梦者 (版主)

梦石
28
星屑
10170
在线时间
4673 小时
注册时间
2011-8-22
帖子
1279

开拓者

2
发表于 2017-11-21 14:36:32 | 只看该作者
试试GetPrivateProfileStringW?

点评

那就不太了解啦……win32api用得不多,可能在pack/unpack的时候需要什么额外处理?  发表于 2017-11-21 15:46
我的第二段代码啊……带A的带W的不带的,ini的8种文件格式,3X8=24个华丽丽的nil……  发表于 2017-11-21 14:37
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
36154
在线时间
10726 小时
注册时间
2009-3-15
帖子
4807
3
发表于 2017-11-21 14:40:54 | 只看该作者
UTF8????????????

点评

默认,ansi, UTF8 有rom,无rom, UTF16有rom无rom,UTF16BE有rom无rom全试了 搭配A版W版公版全试了,全失败  发表于 2017-11-21 14:48
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
35143
在线时间
4165 小时
注册时间
2007-12-15
帖子
10061
4
发表于 2017-11-21 15:09:48 | 只看该作者
听不太懂,感觉是对中文不友好,
少年……不对……中年大气有~
励志开发纯中文编程电脑系统吧XD

点评

我们计算机原理老师将汇编的时候也老这么说2333,比如说寄存器不叫AX,BX叫做甲乙丙丁,指令不是MOV,LEA叫移动,取地址,让老外蒙圈儿去XD  发表于 2017-11-21 15:34
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

5
发表于 2017-11-21 15:45:11 | 只看该作者
···用英文啊···
感觉这有点自讨苦吃
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
36154
在线时间
10726 小时
注册时间
2009-3-15
帖子
4807
6
发表于 2017-11-21 15:57:48 | 只看该作者
本帖最后由 soulsaga 于 2017-11-21 16:25 编辑

那GAME.INI是怎么读取的?
http://ytomy.sakura.ne.jp/tkool/ ... =interface_win32api
这脚本有何用?看不懂...


RUBY 代码复制
  1. #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
  2. #_/    ◆ Win32API用インターフェース - KGC_InterfaceForWin32API ◆ XP/VX ◆
  3. #_/    ◇ Last update : 2007/11/26 ◇
  4. #_/----------------------------------------------------------------------------
  5. #_/  汎用的な Win32API 用のインターフェースです。
  6. #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
  7.  
  8. class Win32API
  9.   WINDOW_CLASS = (defined?(::Cache) ? "RGSS2 Player" : "RGSS Player")
  10.   STRING_BUF_SIZE = 255
  11.   #--------------------------------------------------------------------------
  12.   # ○ INIファイルを読み込む
  13.   #     section : セクション名
  14.   #     key     : キー
  15.   #     default : キーが存在しない場合のデフォルト値
  16.   #     inifile : 読み込むINIファイルのパス
  17.   #--------------------------------------------------------------------------
  18.   def self.GetPrivateProfileString(section, key, default, inifile)
  19.     get_ini = Win32API.new(
  20.       'kernel32.dll', 'GetPrivateProfileStringA', %w(p p p p l p), 'l')
  21.     buf = "\0" * (STRING_BUF_SIZE + 1)
  22.     get_ini.call(section, key, default, buf, STRING_BUF_SIZE, inifile)
  23.     return buf.delete!("\0")
  24.   end
  25.   #--------------------------------------------------------------------------
  26.   # ○ ウィンドウハンドルを取得
  27.   #     window_class : ウィンドウクラス名
  28.   #     window_title : ウィンドウのタイトル
  29.   #--------------------------------------------------------------------------
  30.   def self.FindWindow(window_class, window_title)
  31.     find_window = Win32API.new('user32.dll', 'FindWindowA', %w(p p), 'l')
  32.     return find_window.call(window_class, window_title)
  33.   end
  34.   #--------------------------------------------------------------------------
  35.   # ○ アクティブウィンドウハンドルを取得
  36.   #--------------------------------------------------------------------------
  37.   def self.GetActiveWindow
  38.     active_window = Win32API.new('user32.dll', 'GetActiveWindow', %w(v), 'l')
  39.     return active_window.call
  40.   end
  41.   #--------------------------------------------------------------------------
  42.   # ○ ゲーム画面のウィンドウハンドルを取得する
  43.   #--------------------------------------------------------------------------
  44.   def self.GetHwnd
  45.     name = GetPrivateProfileString("Game", "Title", "", "./Game.ini")
  46.     return FindWindow(WINDOW_CLASS, name)
  47.   end
  48. end



点评

game.ini里没有中文  发表于 2017-11-21 19:48
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
13560
在线时间
2753 小时
注册时间
2014-10-4
帖子
756

R考场第七期纪念奖

7
发表于 2017-11-21 16:43:35 | 只看该作者
本帖最后由 SixRC 于 2017-11-21 16:46 编辑

试了一下 终于成功了
GetPrivateProfileStringA 或者 W
A的话 阿尔西斯需要转码成 ANSI ini 路径也是
就能成功获取gender 不过得到的是 ANSI 需要自己转回去
W的话 就都得用 Unicode UTF-8不行
不清楚内部的机制 查找 阿尔西斯 这串字符的时候 大概有什么出入
必须得全用 ANSI 或者 Unicode 吧
成功的代码
RUBY 代码复制
  1. WideCharToMultiByte=Win32API.new('kernel32','WideCharToMultiByte','llplplll','l')
  2. MultiByteToWideChar=Win32API.new('kernel32','MultiByteToWideChar','llplpl','l')
  3. def utf8_to_uni(str)
  4.   len=MultiByteToWideChar.call(0xFDE9,0,str,-1,0,0)
  5.   str2="\0"*len
  6.   MultiByteToWideChar.call(0xFDE9,0,str,-1,str2,len)
  7.   str2
  8. end
  9. Reader = Win32API.new("kernel32", "GetPrivateProfileStringW", "ppppip", "i")
  10. value = "\0" * 65534
  11. aa="阿尔西斯"
  12. aa=utf8_to_uni("阿尔西斯")
  13. k= "gender"
  14. k=utf8_to_uni(k)
  15. ini=Dir.pwd+"/a.ini"
  16. ini=utf8_to_uni(ini)
  17. Reader.call(aa, k, "nil", value, 65534, ini)
  18. p value.strip!


记得把 ini 保存成 Unicode
哪个方便用哪个吧

点评

把轮子里的eval去掉后直接返回字符串的结果是……10000次0.42s……API法的价值已经不大了  发表于 2017-11-21 20:21
测试完了,用API的方法快33%左右(10000次0.4s vs 0.6s),但是经常运行出内存访问错误(十回运行得三四回内存错误),估计靠谱的还是得优化轮子……  发表于 2017-11-21 20:17
多谢,但是读一个字符串就要调三个API,我需要考虑调用代价的事了……一会评估一下速度去  发表于 2017-11-21 19:48

评分

参与人数 1+1 收起 理由
SailCat + 1 我很赞同

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
23124
在线时间
2387 小时
注册时间
2005-10-15
帖子
1166

开拓者

8
 楼主| 发表于 2017-11-21 19:38:20 | 只看该作者
然而我已经造了轮子……
一会评估一下大量的检索哪个比较快吧
RUBY 代码复制
  1. def self.read_ini(section, parameter, default, filename)
  2.     begin
  3.       File.open(filename) do |f|
  4.         ks = "[#{section}]\n"
  5.         kp = parameter + "="
  6.         flag = false
  7.         f.each_line do |l|
  8.           next unless l == ks or flag
  9.           flag = (l == ks or l[0] != "[")
  10.           next unless l[0...kp.length] == kp
  11.           return (eval(l[kp.length..-2]) rescue l[kp.length..-2])
  12.         end
  13.       end
  14.     rescue
  15.     end
  16.     return default
  17.   end


SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
13560
在线时间
2753 小时
注册时间
2014-10-4
帖子
756

R考场第七期纪念奖

9
发表于 2017-11-21 21:03:57 | 只看该作者
内存错误的原因在 utf8_to_uni 的第 5 行
原因是那个 len 返回值是宽字符的字数 申请空间不能是一去乘..我的疏忽
再乘个四就不会出错了

说到方法 当然是哪个方便易维护用哪个啦
读取 ini 一点效率大概是不用计较的了 大量数据不如自定义格式
用着舒服为准吧
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4593
在线时间
1205 小时
注册时间
2016-4-7
帖子
982

开拓者

10
发表于 2017-11-22 00:21:32 | 只看该作者
所以为啥不用json/xml呢
滑稽.jpg

点评

标准库里自然有 不过rm里就不要想了 全被阉割掉了 不过这种都有人写过现成的脚本  发表于 2017-11-22 14:49
ruby有内建的json/xml reader? ini的轮子够方便了……  发表于 2017-11-22 00:43
附庸的附庸不是我的附庸,女儿的女儿还是我的女儿。CK2沉迷ing
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-9-26 03:26

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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