深度思考
你说得对,确实是一句话
原生数组取了jz之后,WriteFile / ReadFile 一样是一条 API 搞定,文件 I/O 这块内存数组没有独占优势。
那内存数组真正的独占优势其实就这几个:
1. 地址永远不变
原生数组:重定义数组(aaa, 假, 2000) → 地址可能搬家,之前存的jz作废
内存数组:jz创建后固定,永远不会变
如果你把jz存下来给 DLL 或定时器用,原生数组哪天重定义了,jz就悬空了,内存数组不会。
2. 不用每次取地址
原生数组:每次写文件都要 jz = 取原生数组地址(aaa[1], aaa[1], 4)
内存数组:直接 ccc.写到文件("xxx.bin"),jz已经在内部存着了
省一步,不容易出错。
3. 跨语言共享数据的"标准接口"
写成 .bin 文件后,Python / C / C++ 都能直接读,格式是纯二进制裸数据,没有任何 EPL 私有头信息。原生数组虽然也能做到,但 EPL 内部数组前面有没有隐藏的长度头之类的,不确定。内存数组从 HeapAlloc 出来的就是纯裸缓冲区,100% 确定。
老实说
如果你的场景就是 EPL 内部用,原生数组 + 取地址 + Win32 API 完全够用,不需要内存数组类。
内存数组类最大的价值是:把"取地址→打开文件→写入→关闭"封装成了 写到文件() 一行调用,不用记那堆魔法数字和 API 参数,是工程便利性,不是性能优势。
| 窗口程序集名 | 保 留 | 保 留 | 备 注 |
| 窗口程序集_启动窗口 | |||
| 变量名 | 类 型 | 数组 | 备 注 |
| aaa | 整数型 | 0 | |
| bbb | 整数型 | 0 | |
| ccc | 类模块_整数型固定数组 |
| 子程序名 | 返回值类型 | 公开 | 备 注 | ||
| __启动窗口_创建完毕 | |||||
| 变量名 | 类 型 | 静态 | 数组 | 备 注 | ||
| n1 | 整数型 | |||||
| ls | 整数型 | |||||
| 局变_总数 | 整数型 | |||||
| 临时数组 | 整数型 | 0 | ||||
计次循环首 (取数组成员数 (aaa), n1)
' ls = aaa [n1]
aaa [n1] = n1
计次循环尾 ()
计次循环首 (取数组成员数 (aaa), n1)
' ls = aaa [n1]
ls = ls + aaa [n1]
' ls = aaa [n1]
计次循环尾 ()
计次循环首 (ccc.取数组成员数目 (), n1)
ccc.写整数_加速 (n1, n1)
计次循环尾 ()
计次循环首 (ccc.取数组成员数目 (), n1)
' ' 调试输出 (ccc.读整数 (n1))
ls = ls + ccc.读整数_加速 (n1)
' ' ls = ccc.读整数 (n1)
计次循环尾 ()| 子程序名 | 返回值类型 | 公开 | 备 注 | ||
| _按钮1_被单击 | |||||
| 变量名 | 类 型 | 静态 | 数组 | 备 注 | ||
| n1 | 整数型 | |||||
计次循环首 (ccc.取数组成员数目 (), n1)
ccc.写整数 (n1, n1)
计次循环尾 ()
计次循环首 (ccc.取数组成员数目 (), n1)
调试输出 (ccc.读整数 (n1))
计次循环尾 ()| i支持库列表 | 支持库注释 |
| spec | 特殊功能支持库 |
| 窗口程序集名 | 保 留 | 保 留 | 备 注 |
| 类模块_整数型固定数组, , 公开 | |||
| 变量名 | 类 型 | 数组 | 备 注 |
| 程变_数组jz | 整数型 | ||
| 程变_元素数量 | 整数型 |
| 子程序名 | 返回值类型 | 公开 | 备 注 | ||
| _初始化 | 当基于本类的对象被创建后,此方法会被自动调用 | ||||
| 子程序名 | 返回值类型 | 公开 | 备 注 | ||
| _销毁 | 当基于本类的对象被销毁前,此方法会被自动调用 | ||||
如果真 (程变_数组jz ≠ 0)
释放内存 (获取当前进程默认堆 (), 0, 程变_数组jz)
程变_数组jz = 0
程变_元素数量 = 0
| 子程序名 | 返回值类型 | 公开 | 备 注 | ||||
| 创建内存数组_整数型 | 逻辑型 | ||||||
| 参数名 | 类 型 | 参考 | 可空 | 数组 | 备 注 | ||
| 参数_数组个数 | 整数型 | ||||||
| 变量名 | 类 型 | 静态 | 数组 | 备 注 | ||
| 局变_分配大小 | 整数型 | |||||
如果真 (参数_数组个数 ≤ 0)
返回 (假)
如果真 (程变_数组jz = 0)
返回 (假)
| 子程序名 | 返回值类型 | 公开 | 备 注 | ||
| 清零 | |||||
| 子程序名 | 返回值类型 | 公开 | 备 注 | ||
| 取数组成员数目 | 整数型 | ||||
| 子程序名 | 返回值类型 | 公开 | 备 注 | ||||
| 写整数 | 逻辑型 | 有边界判断 | |||||
| 参数名 | 类 型 | 参考 | 可空 | 数组 | 备 注 | ||
| 参数_索引 | 整数型 | 参数_值 | 整数型 | ||||
如果真 (参数_索引 < 1 或 参数_索引 > 程变_元素数量)
返回 (假)
| 子程序名 | 返回值类型 | 公开 | 备 注 | ||||
| 读整数 | 整数型 | 有边界判断 | |||||
| 参数名 | 类 型 | 参考 | 可空 | 数组 | 备 注 | ||
| 参数_索引 | 整数型 | ||||||
如果真 (参数_索引 < 1 或 参数_索引 > 程变_元素数量)
返回 (0)
| 子程序名 | 返回值类型 | 公开 | 备 注 | ||||
| 写整数_加速 | 没有边界判断,需要自己把握 | ||||||
| 参数名 | 类 型 | 参考 | 可空 | 数组 | 备 注 | ||
| 参数_索引 | 整数型 | 参数_值 | 整数型 | ||||
| 子程序名 | 返回值类型 | 公开 | 备 注 | ||||
| 读整数_加速 | 整数型 | 没有边界判断,需要自己把握 | |||||
| 参数名 | 类 型 | 参考 | 可空 | 数组 | 备 注 | ||
| 参数_索引 | 整数型 | ||||||
| 变量名 | 类 型 | 静态 | 数组 | 备 注 | ||
| 局变_结果 | 整数型 | |||||
| 子程序名 | 返回值类型 | 公开 | 备 注 | ||
| 排序_快速 | |||||
如果真 (程变_元素数量 > 1)
快速排序_内部 (1, 程变_元素数量)
| 子程序名 | 返回值类型 | 公开 | 备 注 | ||||
| 快速排序_内部 | |||||||
| 参数名 | 类 型 | 参考 | 可空 | 数组 | 备 注 | ||
| 参数_左边界 | 整数型 | 参数_右边界 | 整数型 | ||||
| 变量名 | 类 型 | 静态 | 数组 | 备 注 | ||
| 局变_i | 整数型 | |||||
| 局变_j | 整数型 | |||||
| 局变_基准值 | 整数型 | |||||
| 局变_临时值 | 整数型 | |||||
判断循环首 (局变_i ≤ 局变_j)
' 内层寻找左边需要交换的元素
判断循环首 (读整数_加速 (局变_i) < 局变_基准值)
局变_i = 局变_i + 1
判断循环尾 ()
' 内层寻找右边需要交换的元素
判断循环首 (读整数_加速 (局变_j) > 局变_基准值)
局变_j = 局变_j - 1
判断循环尾 ()
' 交换并移动指针
如果真 (局变_i ≤ 局变_j)
局变_临时值 = 读整数_加速 (局变_i)
写整数_加速 (局变_i, 读整数_加速 (局变_j))
写整数_加速 (局变_j, 局变_临时值)
局变_i = 局变_i + 1
局变_j = 局变_j - 1

判断循环尾 ()
如果真 (参数_左边界 < 局变_j)
快速排序_内部 (参数_左边界, 局变_j)
如果真 (局变_i < 参数_右边界)
快速排序_内部 (局变_i, 参数_右边界)
| 子程序名 | 返回值类型 | 公开 | 备 注 | ||||
| 写到文件 | 逻辑型 | 写出到二进制 | |||||
| 参数名 | 类 型 | 参考 | 可空 | 数组 | 备 注 | ||
| 参数_文件名 | 文本型 | ||||||
| 变量名 | 类 型 | 静态 | 数组 | 备 注 | ||
| 局变_文件句柄 | 整数型 | |||||
| 局变_实际写入 | 整数型 | |||||
如果真 (局变_文件句柄 = -1 或 局变_文件句柄 = 0)
返回 (假)
| 子程序名 | 返回值类型 | 公开 | 备 注 | ||||
| 从文件读入 | 逻辑型 | 二进制读入,元素数空时 自动检测 | |||||
| 参数名 | 类 型 | 参考 | 可空 | 数组 | 备 注 | ||
| 参数_文件名 | 文本型 | 参数_元素数 | 整数型 | , 留空则自动按文件大小计算 | |||
| 变量名 | 类 型 | 静态 | 数组 | 备 注 | ||
| 局变_文件句柄 | 整数型 | |||||
| 局变_实际读取 | 整数型 | |||||
| 局变_读取结果 | 逻辑型 | |||||
| 局变_文件字节数 | 整数型 | |||||
如果真 (局变_文件句柄 = -1 或 局变_文件句柄 = 0)
返回 (假)
如果真 (是否为空 (参数_元素数))
局变_文件字节数 = 取文件大小 (局变_文件句柄, 0)
参数_元素数 = 局变_文件字节数 ÷ 4
如果真 (创建内存数组_整数型 (参数_元素数) = 假)
关闭句柄 (局变_文件句柄)
返回 (假)
| 子程序名 | 返回值类型 | 公开 | 备 注 | ||
| 取jz | 整数型 | 返回内存数组jz,可直接传给DLL | |||
| 子程序名 | 返回值类型 | 公开 | 备 注 | ||
| 取字节大小 | 整数型 | 返回元素数量×4 | |||
| 子程序名 | 返回值类型 | 公开 | 备 注 | ||||
| 拷贝到原生数组 | |||||||
| 参数名 | 类 型 | 参考 | 可空 | 数组 | 备 注 | ||
| 参数_目标数组 | 整数型 | ||||||
| 子程序名 | 返回值类型 | 公开 | 备 注 | ||||
| 从原生数组导入 | 逻辑型 | 把原生数组整块拷贝进内存数组 | |||||
| 参数名 | 类 型 | 参考 | 可空 | 数组 | 备 注 | ||
| 参数_源数组 | 整数型 | ||||||
| 变量名 | 类 型 | 静态 | 数组 | 备 注 | ||
| 局变_源jz | 整数型 | |||||
如果真 (程变_数组jz = 0)
返回 (假)
| 子程序名 | 返回值类型 | 公开 | 备 注 | ||||
| 原生数组写到文件 | 逻辑型 | 将整数型原生数组整块写入二进制文件 | |||||
| 参数名 | 类 型 | 参考 | 可空 | 数组 | 备 注 | ||
| 参数_数组 | 整数型 | 参数_文件名 | 文本型 | ||||
| 变量名 | 类 型 | 静态 | 数组 | 备 注 | ||
| 局变_jz | 整数型 | |||||
| 局变_文件句柄 | 整数型 | |||||
| 局变_实际写入 | 整数型 | |||||
如果真 (局变_文件句柄 = -1 或 局变_文件句柄 = 0)
返回 (假)
| 子程序名 | 返回值类型 | 公开 | 备 注 | ||||
| 原生数组从文件读入 | 逻辑型 | 从二进制文件读入到整数型原生数组,自动重定义大小 | |||||
| 参数名 | 类 型 | 参考 | 可空 | 数组 | 备 注 | ||
| 参数_文件名 | 文本型 | 参数_数组 | 整数型 | ||||
| 变量名 | 类 型 | 静态 | 数组 | 备 注 | ||
| 局变_jz | 整数型 | |||||
| 局变_文件句柄 | 整数型 | |||||
| 局变_实际读取 | 整数型 | |||||
| 局变_文件字节数 | 整数型 | |||||
如果真 (局变_文件句柄 = -1 或 局变_文件句柄 = 0)
返回 (假)
| 子程序名 | 返回值类型 | 公开 | 备 注 | ||
| DLL命令名 | 返回值类型 | 公开 | 备 注 | |
| 分配内存 | 整数型 | 从指定堆分配内存 (对应易语言中的 申请内存) | ||
| DLL库文件名: | ||||
| kernel32.dll | ||||
| 在DLL库中对应命令名: | ||||
| HeapAlloc | ||||
| 参数名 | 类 型 | 传址 | 数组 | 备 注 |
| hHeap | 整数型 | ' 堆句柄 | ||
| dwFlags | 整数型 | ' 分配标志 (1表示分配后自动清零) | ||
| dwBytes | 整数型 | ' 请求的字节数 | ||
| DLL命令名 | 返回值类型 | 公开 | 备 注 | |
| 获取当前进程默认堆 | 整数型 | 获取当前进程默认堆 (配合 HeapAlloc 使用) | ||
| DLL库文件名: | ||||
| kernel32.dll | ||||
| 在DLL库中对应命令名: | ||||
| GetProcessHeap | ||||
| 参数名 | 类 型 | 传址 | 数组 | 备 注 |
| DLL命令名 | 返回值类型 | 公开 | 备 注 | |
| 释放内存 | 整数型 | 释放已分配的内存块 (对应易语言中的 释放内存) | ||
| DLL库文件名: | ||||
| kernel32.dll | ||||
| 在DLL库中对应命令名: | ||||
| HeapFree | ||||
| 参数名 | 类 型 | 传址 | 数组 | 备 注 |
| hHeap | 整数型 | ' 堆句柄 | ||
| dwFlags | 整数型 | ' 释放标志 (填 0 即可) | ||
| lpMem | 整数型 | ' 要释放的内存地址 | ||
| DLL命令名 | 返回值类型 | 公开 | 备 注 | |
| 内存_填充 | ||||
| DLL库文件名: | ||||
| kernel32.dll | ||||
| 在DLL库中对应命令名: | ||||
| RtlFillMemory | ||||
| 参数名 | 类 型 | 传址 | 数组 | 备 注 |
| 目标地址 | 整数型 | |||
| 长度 | 整数型 | |||
| 填充字节 | 字节型 | |||
| DLL命令名 | 返回值类型 | 公开 | 备 注 | |
| 内存_拷贝 | ||||
| DLL库文件名: | ||||
| kernel32.dll | ||||
| 在DLL库中对应命令名: | ||||
| RtlMoveMemory | ||||
| 参数名 | 类 型 | 传址 | 数组 | 备 注 |
| 目标地址 | 整数型 | |||
| 源地址 | 整数型 | |||
| 长度 | 整数型 | |||
| DLL命令名 | 返回值类型 | 公开 | 备 注 | |
| DLL命令1 | ||||
| DLL库文件名: | ||||
| 在DLL库中对应命令名: | ||||
| DLL命令1 | ||||
| 参数名 | 类 型 | 传址 | 数组 | 备 注 |
| DLL命令名 | 返回值类型 | 公开 | 备 注 | |
| 写整数到地址 | ||||
| DLL库文件名: | ||||
| kernel32.dll | ||||
| 在DLL库中对应命令名: | ||||
| RtlMoveMemory | ||||
| 参数名 | 类 型 | 传址 | 数组 | 备 注 |
| 目标地址 | 整数型 | ' 目标内存地址(值传递) | ||
| 源值 | 整数型 | |||
| 长度 | 整数型 | ' 固定填 4 | ||
| DLL命令名 | 返回值类型 | 公开 | 备 注 | |
| 从地址读整数 | ||||
| DLL库文件名: | ||||
| kernel32.dll | ||||
| 在DLL库中对应命令名: | ||||
| RtlMoveMemory | ||||
| 参数名 | 类 型 | 传址 | 数组 | 备 注 |
| 目标变量 | 整数型 | |||
| 源地址 | 整数型 | ' 要读取的内存地址(值传递) | ||
| 长度 | 整数型 | ' 固定填 4 | ||
| DLL命令名 | 返回值类型 | 公开 | 备 注 | |
| 内存拷贝到数组 | ||||
| DLL库文件名: | ||||
| kernel32.dll | ||||
| 在DLL库中对应命令名: | ||||
| RtlMoveMemory | ||||
| 参数名 | 类 型 | 传址 | 数组 | 备 注 |
| 目标首元素 | 整数型 | |||
| 源地址 | 整数型 | ' 传内存数组的jz(整数值) | ||
| 长度 | 整数型 | ' 拷贝的字节数 | ||
| DLL命令名 | 返回值类型 | 公开 | 备 注 | |
| DLL命令2 | ||||
| DLL库文件名: | ||||
| 在DLL库中对应命令名: | ||||
| DLL命令2 | ||||
| 参数名 | 类 型 | 传址 | 数组 | 备 注 |
| DLL命令名 | 返回值类型 | 公开 | 备 注 | |
| 创建文件 | 整数型 | |||
| DLL库文件名: | ||||
| kernel32.dll | ||||
| 在DLL库中对应命令名: | ||||
| CreateFileA | ||||
| 参数名 | 类 型 | 传址 | 数组 | 备 注 |
| 文件名 | 文本型 | , 文件完整路径 | ||
| 访问模式 | 整数型 | , 写=1073741824 读=2147483648 1073741824 0x40000000 GENERIC_WRITE 写权限 2147483648 0x80000000 GENERIC_READ 读权限 可以组合:1073741824 + 2147483648 = 3221225472 = 又读又写 | ||
| 共享模式 | 整数型 | , 填0 0 不共享,别人打不开这个文件 1 FILE_SHARE_READ,别人可以同时读 2 FILE_SHARE_WRITE,别人可以同时写 | ||
| 安全属性 | 整数型 | , 填0 填 0 = 用默认安全描述符,普通程序不需要管这个。 | ||
| 创建方式 | 整数型 | , 新建=2 覆盖=4 打开=3 1 CREATE_NEW 新建,已存在则失败 —2 CREATE_ALWAYS 总是创建,已存在则截断后覆盖 ? 会截断3 OPEN_EXISTING 仅打开,不存在则失败 ?4 OPEN_ALWAYS 打开或创建,不截断 ? 不截断!5 TRUNCATE_EXISTING 截断已存在文件 截断为0,文件不存在则失败 | ||
| 标志属性 | 整数型 | , 填128 128 FILE_ATTRIBUTE_NORMAL 普通文件,无特殊属性 1 只读2 隐藏4 系统32 存档 | ||
| 模板句柄 | 整数型 | , 填0 填 0,不使用模板文件。 | ||
| DLL命令名 | 返回值类型 | 公开 | 备 注 | |
| 写文件 | 逻辑型 | |||
| DLL库文件名: | ||||
| kernel32.dll | ||||
| 在DLL库中对应命令名: | ||||
| WriteFile | ||||
| 参数名 | 类 型 | 传址 | 数组 | 备 注 |
| 文件句柄 | 整数型 | , CreateFile返回的句柄 | ||
| 缓冲区地址 | 整数型 | , 传入数组jz | ||
| 写入字节数 | 整数型 | , 元素数量×4 | ||
| 实际写入数 | 整数型 | , 接收实际写入字节数 | ||
| 重叠结构 | 整数型 | , 同步操作填0 | ||
| DLL命令名 | 返回值类型 | 公开 | 备 注 | |
| 读文件 | 逻辑型 | |||
| DLL库文件名: | ||||
| kernel32.dll | ||||
| 在DLL库中对应命令名: | ||||
| ReadFile | ||||
| 参数名 | 类 型 | 传址 | 数组 | 备 注 |
| 文件句柄 | 整数型 | , CreateFile返回的句柄 | ||
| 缓冲区地址 | 整数型 | , 传入数组jz数据直接填入 | ||
| 读取字节数 | 整数型 | , 元素数量×4 | ||
| 实际读取数 | 整数型 | , 接收实际读取字节数 | ||
| 重叠结构 | 整数型 | , 同步操作填0 | ||
| DLL命令名 | 返回值类型 | 公开 | 备 注 | |
| 关闭句柄 | 逻辑型 | |||
| DLL库文件名: | ||||
| kernel32.dll | ||||
| 在DLL库中对应命令名: | ||||
| CloseHandle | ||||
| 参数名 | 类 型 | 传址 | 数组 | 备 注 |
| 句柄 | 整数型 | , 要关闭的句柄 | ||
| DLL命令名 | 返回值类型 | 公开 | 备 注 | |
| 取原生数组地址 | 整数型 | |||
| DLL库文件名: | ||||
| kernel32.dll | ||||
| 在DLL库中对应命令名: | ||||
| lstrcpynA | ||||
| 参数名 | 类 型 | 传址 | 数组 | 备 注 |
| 目标 | 整数型 | , 传aaa[1]得到数组jz | ||
| 源 | 整数型 | , 同上传aaa[1] | ||
| 最大长度 | 整数型 | , 填4 | ||
| DLL命令名 | 返回值类型 | 公开 | 备 注 | |
| 取文件大小 | 整数型 | |||
| DLL库文件名: | ||||
| kernel32.dll | ||||
| 在DLL库中对应命令名: | ||||
| GetFileSize | ||||
| 参数名 | 类 型 | 传址 | 数组 | 备 注 |
| 文件句柄 | 整数型 | , CreateFile返回的句柄 | ||
| 高位 | 整数型 | , 填0,文件小于4GB不用管 | ||
| DLL命令名 | 返回值类型 | 公开 | 备 注 | |
| DLL命令3 | ||||
| DLL库文件名: | ||||
| 在DLL库中对应命令名: | ||||
| DLL命令3 | ||||
| 参数名 | 类 型 | 传址 | 数组 | 备 注 |
184.85 KB, 下载次数: 7, 下载积分: 精币 -2 枚
WorkBuddy
深度思考
老实说:单元素读写已经接近 EPL 的极限了
每次调用的开销拆解:
写整数_加速(索引, 值)
→ EPL 压栈/跳转(~10ns)
→ 写整数到地址 DLL IAT 跳转(~5ns)
→ RtlMoveMemory 内部(~5ns)
→ 实际写 4 字节(~1ns)
真正干活的只有最后 1ns,前面 20ns 都是调用开销。 EPL 的函数调用机制你改不了。
三条路,收益递减
路线1:批量操作(已实现,最实用)
热循环里不要逐个读,拷贝到原生数组再遍历。前面已经做过了,78ms → 47ms。
路线2:写个 C DLL 做热循环
把整个循环搬进 C 里,EPL 只调一次:
c
复制
// fastlib.c → 编译成 fastlib.dll
__declspec(dllexport) int __cdecl SumArray(int* base, int count) {
int sum = 0;
for (int i = 0; i < count; i++) {
sum += base; // 编译成单条 MOV 指令
}
return sum;
}
EPL 调用:
epl
复制
.DLL命令 求和, 整数型, "fastlib.dll", "SumArray"
.参数 基址, 整数型, , , 内存数组基址
.参数 数量, 整数型, , , 元素个数
结果 = 求和 (ccc.取基址 (), ccc.取数组成员数目 ())
一次调用完成 100 万次累加,时间接近 0。 这才是真正消灭调用开销的办法。
路线3:EPL 置入代码(内联汇编)
EPL 支持 置入代码 写机器码,但极度脆弱,换个编译器版本可能就崩:
epl
复制
.子程序 写整数_极速, , 公开, 内联汇编版,不稳定慎用
.参数 参数_地址, 整数型 ' 直接传地址,不是索引
.参数 参数_值, 整数型
' mov eax, [ebp+12] ; 取值
' mov [ebp+8], eax ; 写入地址
' 不推荐,维护成本太高
置入代码 ({ 139, 69, 12, 139, 85, 8, 137, 2 })
不推荐用在正式项目里,调试困难,一崩就整个程序挂。
建议
方法 速度 可靠性 推荐度
拷贝到原生数组 快 ? 稳定 ??? 首选
C DLL 做热循环 最快 ? 稳定 ??? 高频场景必用
置入代码 理论最快 ? 脆弱 ? 不推荐
你的量化筛选如果真到了性能瓶颈,写个 C DLL 是正路。 几十行 C 代码就能把排序、累加、筛选全做了,EPL 只负责界面和流程控制。
| 子程序名 | 返回值类型 | 公开 | 备 注 | ||||
| 原生数组写到文件 | 逻辑型 | 将整数型原生数组整块写入二进制文件 | |||||
| 参数名 | 类 型 | 参考 | 可空 | 数组 | 备 注 | ||
| 参数_数组 | 整数型 | 参数_文件名 | 文本型 | ||||
| 变量名 | 类 型 | 静态 | 数组 | 备 注 | ||
| 局变_jz | 整数型 | |||||
| 局变_文件句柄 | 整数型 | |||||
| 局变_实际写入 | 整数型 | |||||
| 局变_保存 | 整数型 | |||||
如果真 (局变_文件句柄 = -1 或 局变_文件句柄 = 0)
返回 (假)
| 欢迎光临 精易论坛 (https://bbs.ijingyi.com/) | Powered by Discuz! X3.4 |