使用Pymem读取浮点值报错:Address must be int问题求助
问题原因
你错误地用read_float读取内存指针地址了——内存地址是整数类型,而read_float会返回浮点数值,导致后续计算出的地址变成浮点数(比如报错里的1994287160.0),传给要求整数地址的函数时触发类型错误。
内存指针的存储类型是整数,只有最终要读取的目标值(比如你要的northsouth坐标)才是浮点,指针链的每一步都应该用读取整数的函数。
修正方案
根据游戏进程的位数选择对应的整数读取函数:
- 32位进程:用
pm.read_int() - 64位进程:用
pm.read_ulonglong()
修正后的代码示例(假设是32位游戏,64位的话替换read_int为read_ulonglong):
from pymem import * from pymem.process import * pm = pymem.Pymem("game.exe") module = module_from_name(pm.process_handle, "game.exe").lpBaseOfDll def GetPtrAddr(base, offsets): # 指针是整数,用read_int读取(64位用read_ulonglong) addr = pm.read_int(base) for i in offsets[:-1]: # 遍历除最后一个偏移外的所有值 addr = pm.read_int(addr + i) return addr + offsets[-1] northsouth_addr = GetPtrAddr(module + 0x01B20C50, [0x38, 0x60, 0x290, 0x68, 0x140, 0x0, 0x3C]) # 最后读取浮点值 print(pm.read_float(northsouth_addr))
关键修正点
- 指针链读取修正:把
read_float换成read_int/read_ulonglong,保证地址始终是整数类型 - 循环逻辑优化:直接遍历
offsets[:-1],无需判断是否为最后一个元素,代码更简洁 - 变量命名优化:将
northsouth改为northsouth_addr,明确这是存储浮点值的地址,而非浮点值本身
内容的提问来源于stack exchange,提问作者cool
相关产品推荐
相关产品推荐

