分享

数组传递摘抄

 imelee 2013-11-08

参考属性的说明:表示子程序的参数在传递数据时是否为传递数据的地址(也就是传递变量在内存中的地址);简单的说就是如果参考属性上打勾,都是传递变量的内存地址;如果不打勾则是传递变量的内容; 

但是如果所传递的参数为:数组、用户自定义数据类型、库自定义类型、文本型、字节集型,都传递的是变最在内存中的地址!也就是说当你传递的数据类型为上面的几种,不管你的参考属性是否选中都是传递变量在内存中的地址; 

当数据类型为:整数型、小数型、双精度小数型时,当参考属性没有选中时,传递的是变量的值,而不是变量的内存地址;只有当参考属性为选中时,才传递变量的内存地址;

全文地址: http://bbs./thread-176269-1-1.html


易语言表面上是不支持返回数组数据的。要达到要求,可以用参数实现,也可以自己构造整型数组结构,取结构首地址,返回首地址,这个有点点难度。关于参数实现:易语言支持参数为数组。你就先申请一个没数据的数组,传递给子程序,子程序再往里写值…




用易语言自己弄dll文件 自己做程序

怎么设计才能传递数组型的参数?

(目的:将dll中某数组传给此程序)

 


在DLL里面公开的某个子程序下面再添加一个参数  并且   把  数组 和 传址  和可空  勾上   再在这个子程序运行的最后面    把那个新添加的参数    赋值成   你需要返回的数组数据    然后调用该子程序时  填写  最下面那个参数时候   用一个新变量填写进去   运行完这个命令后    那个新变量里面的值  就是那个子程序返回的数组数据了


#以下代码可以直接复制到易语言IDE使用:

.子程序 __启动窗口_创建完毕
    .局部变量 ListArr, 文本型, , "0"
    .局部变量 i, 整数型

    _SearchFile (“C:\WINDOWS\Web\”“*.*”, ListArr) 
    .计次循环首 (取数组下标 (ListArr, ), i) 
        输出调试文本 (“File ” + 到文本 (i) + “ ” + ListArr [i]
    .计次循环尾 () 



.子程序 _SearchFile
    .参数 Dir, 文本型
    .参数 FileName, 文本型
    .参数 FileListArr, 文本型, 参考 数组
    .局部变量 search_result, 文本型

     ' 路径兼容
    .如果真 (取文本右边 (Dir, 1) ≠ “\”
        Dir = Dir + “\” 
    .如果真结束 

     ' 根目录
    search_result = 寻找文件 (Dir + FileName, ) 
    .判断循环首 (search_result ≠ “”
        .如果真 (search_result ≠ “.”  search_result ≠ “..”
            加入成员 (FileListArr, Dir + search_result) 
             ' 输出调试文本 (Dir + search_result)
        .如果真结束 
        search_result = 寻找文件 (, ) 

    .判断循环尾 () 

     ' 递归子目录
    search_result = 寻找文件 (Dir + “*.*”#子目录
    .判断循环首 (search_result ≠ “”
        .如果真 (search_result ≠ “.”  search_result ≠ “..”
            _SearchFile (Dir + search_result, FileName, FileListArr) 
        .如果真结束 
        search_result = 寻找文件 (, #子目录
    .判断循环尾 () 


#以上代码使用易代码高亮格式工具JS版格式化



关于易语言连续调用DLL导致返回值出错问题举例和解决办法

       目前在用易语言比较大点的项目的时候,大家往往采用了将功能模块封装为DLL,各模块间相互调用以及主程序整体调用的方式,这样做得好处是增强了代码或者功能重用的可能性,降低后期维护成本,同时这种开发也可以用易语言模块去做,但模块更新后都需要重新编译程序,所以DLL相对更方便一些,但是目前采用易语言编写的DLL,具有返回值(文本型)DLL中接口被连续调用的时候,会导致返回值出错(部分乱码),经过测试确认,目前无法直接解决此问题,原因:对于返回文本或字节集的DLL命令,所返回的数据是临时存放在一段内存中的,而且下次调用该DLL命令会同时销毁上次所分配的内存,所以如果在一条语句中多次调用了同一个DLL命令,就会产生冲突 ,第二次调用的同名的DLL命令会把第一次调用时所返回的数据销毁,所以就会出错,并且目前没有更好的方法解决,因为易语言不支持指针,不能象api那样接受一个缓冲区过来。
       为了减少大家使用的误区和提高程序编写的可靠性,特对本问题作如下举例说明并且归纳出两种解决方法供大家参考。

案例如下:

有一个易语言编写的DLL文件内容如下:

文件名:测试.DLL

.版本 2

.程序集 程序集1

.子程序 _启动子程序, 整数型, , 请在本子程序中放置动态链接库初始化代码

_临时子程序 ()  ' 在初始化代码执行完毕后调用测试代码
返回 (0)  ' 返回值被忽略。

.子程序 _临时子程序
' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、参数及返回值类型。

.子程序 外部接口_测试, 文本型, 公开
.参数 参_text, 文本型
参_text = 参_text + “ ”
返回 (参_text)

代码没有太多操作,只是简单的将原始文本附加一个空格。

简单的写一个调用程序。
测试调用.e
代码如下:

DLL申明:

.版本 2

.DLL命令 外部接口_测试, 文本型, "测试.dll", "外部接口_测试"
    .参数 参_text, 文本型

调用代码:

.版本 2

.程序集 窗口程序集1

.子程序 __启动窗口_创建完毕
.局部变量 局部_text, 文本型

局部_text = 外部接口_测试 (“易语言DLL调用测试”) + “ ” + 外部接口_测试 (“易语言DLL调用测试”) + “ ” + 外部接口_测试 (“易语言DLL调用测试”) + “ ” + 外部接口_测试 (“易语言DLL调用测试”)
输出调试文本 (局部_text)

输出的结果却为:
* 瓠 易语言DLL调用测试  瓠 易语言DLL调用测试

从结果可以看出,部分应该输出为“易语言DLL调用测试”,却出现了“瓠 ”,就是这样的问题。

解决办法:
办法1:

多次调用写法改为:

子程序名返回值类型公开备 注
.子程序__启动窗口_创建完毕,,,
 
.变量名类 型静态数组备 注
.局部变量局部_text,文本型,,,
 
.常量
.常量
.常量
局部_text = 外部接口_测试 (易语言DLL调用测试”)
.常量
局部_text = 局部_text + 外部接口_测试 (易语言DLL调用测试”)
.常量
局部_text = 局部_text + 外部接口_测试 (易语言DLL调用测试”)
.常量
局部_text = 局部_text + 外部接口_测试 (易语言DLL调用测试”)
.常量
局部_text = 局部_text + 外部接口_测试 (易语言DLL调用测试”)
.常量
输出调试文本 (局部_text)

输出结果:

易语言DLL调用测试  易语言DLL调用测试  易语言DLL调用测试  易语言DLL调用测试

以上方法可以解决,可以正确显示处理结果,但相对比较麻烦,尤其是对于较多类似数据处理的时候,就显得很麻烦。

办法2:

增加一个对调用进行二次处理的内部子程序,每次将数据接收并且返回,这样也可以达到效果,并且这个办法相对更加实用一些,代码如下:

程序集名保 留保 留备 注
.程序集窗口程序集1, ,
.变量名类 型数组备 注
 
.子程序名返回值类型公开备 注
.子程序__启动窗口_创建完毕,,,
 
.变量名类 型静态数组备 注
.局部变量局部_text,文本型,,,
 
.常量
.常量
局部_text = 外部接口_测试_二次处理 (易语言DLL调用测试”) + “ ”+ 外部接口_测试_二次处理 (易语言DLL调用测试”) + “ ”+ 外部接口_测试_二次处理 (易语言DLL调用测试”) + “ ”+ 外部接口_测试_二次处理 (易语言DLL调用测试”)
.常量
输出调试文本 (局部_text)
.常量
.常量
.常量
.子程序名返回值类型公开备 注
.子程序外部接口_测试_二次处理,文本型,,
.参数名.类 型.参考.可空.数组.备 注
.参数参数_文本,文本型,,
 
.常量
.常量
返回 (外部接口_测试 (参数_文本))
输出结果:

易语言DLL调用测试  易语言DLL调用测试  易语言DLL调用测试  易语言DLL调用测试
可见这样也可以得到正确结果,这种方式就可以将调用放在一条语句中,所以推荐这种处理方法。

相关文件下载


本页面地址:http://www./news/bc/e/2009093012125172.html 




调用子程序一样啊
.版本 2
.支持库 spec

.子程序 _按钮1_被单击
.局部变量 A, 数据类型1
.局部变量 sss, 整数型

A.姓名 = “袁群”
A.年龄 = 45
A.身高 = 1.71
调用子程序 (&parse_data2, , sss, 取变量地址 (A))

' parse_data2 (取变量地址 (A))


.子程序 parse_data2, 整数型
.参数 参数, 整数型
.局部变量 V, 数据类型1

置入代码 ({ 139, 93, 8, 139, 3, 137, 69, 252 })
输出调试文本 (V.姓名, V.年龄, V.身高)
返回 (0)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多