开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 900|回复: 17
收起左侧

[易语言纯源码] 和千问龙虾弄的一个内存数组 固定长度整数型

[复制链接]
结帖率:75% (3/4)
发表于 6 天前 | 显示全部楼层 |阅读模式   福建省福州市
分享源码
界面截图:
是否带模块: 调用了模块
备注说明: -
本帖最后由 APPLEUFO 于 2026-6-6 17:07 编辑
深度思考
你说得对,确实是一句话
原生数组取了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
置随机数种子 ()
局变_总数 = 10000000
计时器启动 ()
重定义数组 (aaa, 假, 局变_总数)
计次循环首 (取数组成员数 (aaa), n1)
' ls = aaa [n1]
aaa [n1] = n1
计次循环尾 ()
计次循环首 (取数组成员数 (aaa), n1)
' ls = aaa [n1]
ls = ls + aaa [n1]
' ls = aaa [n1]
计次循环尾 ()
计时器结束 ()
调试输出 (ls, , , )
' 调试输出 (aaa)
ls = 0
计时器启动 ()
ccc.创建内存数组_整数型 (局变_总数)
ccc.清零 ()
调试输出 (“=======================”)
计次循环首 (ccc.取数组成员数目 (), n1)
ccc.写整数_加速 (n1, n1)
计次循环尾 ()
调试输出 (“=======================”)
计次循环首 (ccc.取数组成员数目 (), n1)
' ' 调试输出 (ccc.读整数 (n1))
ls = ls + ccc.读整数_加速 (n1)
' ' ls = ccc.读整数 (n1)
计次循环尾 ()
' 调试输出 (“=======================”)
调试输出 (ls, , , )
计时器结束 ()
' 结束 ()
子程序名返回值类型公开备 注
_按钮1_被单击  
变量名类 型静态数组备 注
n1整数型 
' 写文件
ccc.创建内存数组_整数型 (100)
计次循环首 (ccc.取数组成员数目 (), n1)
ccc.写整数 (n1, n1)
计次循环尾 ()
ccc.写到文件 (“C:\数据.bin”)
ccc.清零 ()
调试输出 (“------------ ”)
' 从文件读回(自动创建数组)
ccc.从文件读入 (“C:\数据.bin”, )
计次循环首 (ccc.取数组成员数目 (), n1)
调试输出 (ccc.读整数 (n1))
计次循环尾 ()
鸣叫 ()


i支持库列表   支持库注释   
spec特殊功能支持库

  
窗口程序集名保 留  保 留备 注
类模块_整数型固定数组, , 公开   
变量名类 型数组备 注
程变_数组jz整数型  
程变_元素数量整数型  

子程序名返回值类型公开备 注
_初始化 当基于本类的对象被创建后,此方法会被自动调用

子程序名返回值类型公开备 注
_销毁 当基于本类的对象被销毁前,此方法会被自动调用
' 调试输出 (123456)
如果真 (程变_数组jz ≠ 0)
释放内存 (获取当前进程默认堆 (), 0, 程变_数组jz)
程变_数组jz = 0
程变_元素数量 = 0

子程序名返回值类型公开备 注
创建内存数组_整数型逻辑型 
参数名类 型参考可空数组备 注
参数_数组个数整数型
变量名类 型静态数组备 注
局变_分配大小整数型 
如果真 (参数_数组个数 ≤ 0)
返回 ()

局变_分配大小 = 参数_数组个数 × 4
程变_数组jz = 分配内存 (获取当前进程默认堆 (), 1, 局变_分配大小)
如果真 (程变_数组jz = 0)
返回 ()

程变_元素数量 = 参数_数组个数
返回 ()
子程序名返回值类型公开备 注
清零 
' 调用系统 API 极速将整块内存全部置为 0
内存_填充 (程变_数组jz, 程变_元素数量 × 4, 0)
子程序名返回值类型公开备 注
取数组成员数目整数型 
返回 (程变_元素数量)
子程序名返回值类型公开备 注
写整数逻辑型 有边界判断
参数名类 型参考可空数组备 注
参数_索引整数型
参数_值整数型
如果真 (参数_索引 < 1 参数_索引 > 程变_元素数量)
返回 ()

写整数_加速 (参数_索引, 参数_值)
返回 ()
子程序名返回值类型公开备 注
读整数整数型 有边界判断
参数名类 型参考可空数组备 注
参数_索引整数型
如果真 (参数_索引 < 1 参数_索引 > 程变_元素数量)
返回 (0)

返回 (读整数_加速 (参数_索引))
' =============================================================================
' ========================== 内部极速读写(私有,无边界检查) ==================
' =============================================================================
子程序名返回值类型公开备 注
写整数_加速 没有边界判断,需要自己把握
参数名类 型参考可空数组备 注
参数_索引整数型
参数_值整数型
' 写内存 (-1, 数组jz + (索引 - 1) × 4, 值, 4, 0)   慢
写整数到地址 (程变_数组jz (参数_索引 - 1) × 4, 参数_值, 4)
子程序名返回值类型公开备 注
读整数_加速整数型 没有边界判断,需要自己把握
参数名类 型参考可空数组备 注
参数_索引整数型
变量名类 型静态数组备 注
局变_结果整数型 
' 读内存 (-1, 数组jz + (索引 - 1) × 4, 结果, 4, 0)
从地址读整数 (局变_结果, 程变_数组jz (参数_索引 - 1) × 4, 4)
返回 (局变_结果)
' =============================================================================
' ========================== 快速排序 =========================================
' =============================================================================
子程序名返回值类型公开备 注
排序_快速 
如果真 (程变_元素数量 > 1)
快速排序_内部 (1, 程变_元素数量)

子程序名返回值类型公开备 注
快速排序_内部  
参数名类 型参考可空数组备 注
参数_左边界整数型
参数_右边界整数型
变量名类 型静态数组备 注
局变_i整数型 
局变_j整数型 
局变_基准值整数型 
局变_临时值整数型 
局变_i = 参数_左边界
局变_j = 参数_右边界
局变_基准值 = 读整数_加速 ( (参数_左边界 + 参数_右边界) ÷ 2)
' 外层循环:使用判断循环首
判断循环首 (局变_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, 参数_右边界)

子程序名返回值类型公开备 注
写到文件逻辑型 写出到二进制
参数名类 型参考可空数组备 注
参数_文件名文本型
变量名类 型静态数组备 注
局变_文件句柄整数型 
局变_实际写入整数型 
局变_文件句柄 = 创建文件 (参数_文件名, 1073741824, 0, 0, 2, 128, 0)
如果真 (局变_文件句柄 = -1 局变_文件句柄 = 0)
返回 ()

写文件 (局变_文件句柄, 程变_数组jz, 程变_元素数量 × 4, 局变_实际写入, 0)
关闭句柄 (局变_文件句柄)
' 总结口诀
' 写文件:创建文件(路径, &H40000000, 0, 0, 2, 128, 0)
' 读文件:创建文件(路径, &H80000000, 0, 0, 3, 128, 0)
' 读写:  创建文件(路径, &HC0000000, 0, 0, 4, 128, 0)
返回 ()
子程序名返回值类型公开备 注
从文件读入逻辑型 二进制读入,元素数空时    自动检测
参数名类 型参考可空数组备 注
参数_文件名文本型
参数_元素数整数型, 留空则自动按文件大小计算
变量名类 型静态数组备 注
局变_文件句柄整数型 
局变_实际读取整数型 
局变_读取结果逻辑型 
局变_文件字节数整数型 
局变_文件句柄 = 创建文件 (参数_文件名, 2147483648, 0, 0, 3, 128, 0)
如果真 (局变_文件句柄 = -1 局变_文件句柄 = 0)
返回 ()

' 如果没传元素数,自动从文件大小算
如果真 (是否为空 (参数_元素数))
局变_文件字节数 = 取文件大小 (局变_文件句柄, 0)
参数_元素数 = 局变_文件字节数 ÷ 4

' 创建内存数组
如果真 (创建内存数组_整数型 (参数_元素数))
关闭句柄 (局变_文件句柄)
返回 ()

局变_读取结果 = 读文件 (局变_文件句柄, 程变_数组jz, 参数_元素数 × 4, 局变_实际读取, 0)  ' 局变_实际读取= 元素个数*4
关闭句柄 (局变_文件句柄)
返回 ()
' 大于 4GB 的问题
' GetFileSize 返回 32 位,超过 4GB 会溢出截断,算不准。但对你这个场景——
' 实际上不需要担心
' 4GB 文件 = 10亿个整数
' EPL 整数型最大值 = 2147483647 ≈ 21亿
' 10 亿个整数已经接近极限了,而且 HeapAlloc 单次分配 4GB 在 32 位进程里根本分配不出来(2GB 地址空间上限)。
' 所以你的内存数组类实际上不可能超过 4GB,GetFileSize 够用。
子程序名返回值类型公开备 注
取jz整数型 返回内存数组jz,可直接传给DLL
返回 (程变_数组jz)
子程序名返回值类型公开备 注
取字节大小整数型 返回元素数量×4
返回 (程变_元素数量 × 4)
子程序名返回值类型公开备 注
拷贝到原生数组 
参数名类 型参考可空数组备 注
参数_目标数组整数型
' 传 目标数组[1] 传址 = 数组数据区起始地址,直接一次 memcpy 完成
内存拷贝到数组 (参数_目标数组 [1], 程变_数组jz, 程变_元素数量 × 4)
子程序名返回值类型公开备 注
从原生数组导入逻辑型 把原生数组整块拷贝进内存数组
参数名类 型参考可空数组备 注
参数_源数组整数型
变量名类 型静态数组备 注
局变_源jz整数型 
如果真 (程变_数组jz = 0)
返回 ()

局变_源jz = 取原生数组地址 (参数_源数组 [1], 参数_源数组 [1], 4)
内存_拷贝 (程变_数组jz, 局变_源jz, 程变_元素数量 × 4)
返回 ()
子程序名返回值类型公开备 注
原生数组写到文件逻辑型 将整数型原生数组整块写入二进制文件
参数名类 型参考可空数组备 注
参数_数组整数型
参数_文件名文本型
变量名类 型静态数组备 注
局变_jz整数型 
局变_文件句柄整数型 
局变_实际写入整数型 
局变_jz = 取原生数组地址 (参数_数组 [1], 参数_数组 [1], 4)
局变_文件句柄 = 创建文件 (参数_文件名, 1073741824, 0, 0, 2, 128, 0)
如果真 (局变_文件句柄 = -1 局变_文件句柄 = 0)
返回 ()

写文件 (局变_文件句柄, 局变_jz, 取数组成员数 (参数_数组) × 4, 局变_实际写入, 0)
关闭句柄 (局变_文件句柄)
返回 ()
子程序名返回值类型公开备 注
原生数组从文件读入逻辑型 从二进制文件读入到整数型原生数组,自动重定义大小
参数名类 型参考可空数组备 注
参数_文件名文本型
参数_数组整数型
变量名类 型静态数组备 注
局变_jz整数型 
局变_文件句柄整数型 
局变_实际读取整数型 
局变_文件字节数整数型 
局变_文件句柄 = 创建文件 (参数_文件名, 2147483648, 0, 0, 3, 128, 0)
如果真 (局变_文件句柄 = -1 局变_文件句柄 = 0)
返回 ()

' 自动根据文件大小重定义数组
局变_文件字节数 = 取文件大小 (局变_文件句柄, 0)
重定义数组 (参数_数组, 假, 局变_文件字节数 ÷ 4)
局变_jz = 取原生数组地址 (参数_数组 [1], 参数_数组 [1], 4)
读文件 (局变_文件句柄, 局变_jz, 局变_文件字节数, 局变_实际读取, 0)
关闭句柄 (局变_文件句柄)
返回 ()
子程序名返回值类型公开备 注
  
' =============================================================================
' ========================== 初始化与销毁 =====================================
' 从指定堆分配内存 (对应易语言中的 申请内存)
' 获取当前进程默认堆 (配合 HeapAlloc 使用)
' 释放已分配的内存块 (对应易语言中的 释放内存)
' 向指定内存地址写入数据 (用来实现 写内存整数型)
' 从指定内存地址读取数据 (用来实现 读内存整数型)
' =============================================================================
' 核心问题:用错了 API
' 你现在用的 WriteProcessMemory / ReadProcessMemory 是跨进程内存访问 API,每次调用都要:
' 进入内核态(ring0)
' 做安全权限检查
' 返回用户态(ring3)
' 同一个进程内读写自己的内存,根本不需要这条路,开销白白浪费了。
' 解决方案:换用 RtlMoveMemory(用户态,零内核开销)
' RtlMoveMemory 就是 memcpy,纯用户态,没有任何内核切换,是同进程内存拷贝最快的系统函数。



  
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
参数名类 型传址数组备 注


内存数组.zip

184.85 KB, 下载次数: 7, 下载积分: 精币 -2 枚


签到天数: 12 天

发表于 前天 09:37 | 显示全部楼层   浙江省宁波市
感谢分享,支持开源!!!
回复 支持 反对

使用道具 举报

签到天数: 12 天

发表于 3 天前 | 显示全部楼层   浙江省宁波市
感谢分享,支持开源!!!
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 3 天

发表于 3 天前 | 显示全部楼层   上海市上海市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)

签到天数: 10 天

发表于 4 天前 | 显示全部楼层   广东省汕头市
感谢大神分享~!
回复 支持 反对

使用道具 举报

结帖率:94% (78/83)

签到天数: 9 天

发表于 4 天前 | 显示全部楼层   福建省宁德市
支持开源~!感谢分享
回复 支持 反对

使用道具 举报

结帖率:96% (482/502)

签到天数: 10 天

发表于 4 天前 | 显示全部楼层   内蒙古自治区乌海市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)

签到天数: 12 天

发表于 4 天前 | 显示全部楼层   江西省上饶市
强大,支持。感谢
回复 支持 反对

使用道具 举报

结帖率:75% (3/4)

签到天数: 6 天

 楼主| 发表于 4 天前 | 显示全部楼层   福建省福州市
  
子程序名返回值类型公开备 注
原生数组写到文件逻辑型 将整数型原生数组整块写入二进制文件
参数名类 型参考可空数组备 注
参数_数组整数型
参数_文件名文本型
变量名类 型静态数组备 注
局变_jz整数型 
局变_文件句柄整数型 
局变_实际写入整数型 
局变_保存整数型 
' lstrcpynA会破坏arr[1],先保存再恢复
局变_保存 = 参数_数组 [1]
局变_jz = 取原生数组地址 (参数_数组 [1], 参数_数组 [1], 4)
参数_数组 [1] = 局变_保存
局变_文件句柄 = 创建文件 (参数_文件名, 1073741824, 0, 0, 2, 128, 0)
如果真 (局变_文件句柄 = -1 局变_文件句柄 = 0)
返回 ()

写文件 (局变_文件句柄, 局变_jz, 取数组成员数 (参数_数组) × 4, 局变_实际写入, 0)
关闭句柄 (局变_文件句柄)
返回 ()
' 严重警告:取原生数组地址 会破坏数据!
' 你之前文件读写测试用 1-100 没问题,是因为碰巧值小。真实数据用这个函数,arr[1] 会被破坏!



更正
回复 支持 反对

使用道具 举报

结帖率:80% (4/5)
发表于 5 天前 | 显示全部楼层   山东省潍坊市
已经顶贴,感谢您对论坛的支持!
回复 支持 反对

使用道具 举报

签到天数: 10 天

发表于 5 天前 | 显示全部楼层   河北省石家庄市
66666666666666
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备2025452707号) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

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