标题:问ASCAN函数问题?
只看楼主
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
vfp是解釋語言,它會把源代碼編輯並編譯爲執行代碼再執行,最終的代碼未必是源代碼看到的那樣。vfp中不少語句和函數都有這種行爲,比如select name1,實際上它先嘗試對name1求値(假如它是變量的話),然後加上""作爲別名字符串,傳給切換工作區的函數,所以你會發現這類指令,參數是變量或是字符串,它都能“聰明地”地接受。再如SQL SELECT WHERE a=b,事實上是把a=b編輯爲"a=b"放入字符串變量s中,壓入內部函數,函數再用(s)求値(祇要求値結果是邏輯型的即可),所以你會發現這類指令似乎不接受變量表達式,也是這個原因。

[此贴子已经被作者于2016-2-29 16:51编辑过]


授人以渔,不授人以鱼。
2016-02-29 16:47
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
數組,寫a(2),解釋執行時它可以知道是a[2],但build編譯時,它未必知道這是數組,有些人問編譯後出現“a不是函數”的錯誤,也是這般,因爲編譯時已經把執行代碼編譯爲函數形式了。不教他數組元素可以寫成a(2),啥事都沒有。

授人以渔,不授人以鱼。
2016-02-29 17:02
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:649
专家分:2156
注 册:2014-2-7
得分:0 
虽然楼主已经结帖,但本人感觉很多问题都还没有讲明白。下面俺也来说几句。

1. 对于一个自定义函数(或过程)来说,若想将整个数组传递给函数,必须用传址方式,这是一个基本常识。

   如:MyAscan(@a1),是将数组 a1 整体传递给了 MyAscan()。
       若改为 MyAscan(a1) 则在默认传递方式(SET UDFPARMS TO VALUE)下,是将数组a1的第一个元素 a1[1] 的值 “b”传递给了 MyAscan()。

2. ASCAN()函数很重要,其中最后一个参数 nFlag 更要搞明白,因为很多函数都带有 nFlag,把它搞明白了,可以举一反三。

3. 若要忽略 nFlag 之前的可选参数(nStartElement, nElementsSearched, nSearchColumn),可将其统一设置为 -1(其他负数也可以),如:nFd=Ascan(aMyAry,"Name2",-1,-1,-1,1)

4. nFlag 是由一个 4 位(第0-3位)二进制数组成的,转换成十进制值就是 0 - 15(帮助文件中的表一)。

   每一个二进制位控制一项功能(帮助文件中的表二)。如:第 0 位控制大小写,若其为 1 则表示忽略大小写,也就是说 0001、0011、0101、0111、1001、1011、1101、1111 代表的 1、3、5、7、9、11、13、15 都是忽略大小写的。

   既然都是忽略大小写,那么这 8 个数有何区别呢?

   上面已经说了,4个二进制位中的第 0 位控制大小写。这里,首先要解释一下第 1 位(从右边数第2位)和 第 2 位(从右边数第3位)的作用。这 2 位是控制字符串精确比较的。若第 2 位是 0,则使用系统 Set Exact ON/OFF 的设置。若第 2 位为 1,则不使用系统设置。若第1位是0,则模糊比较,第1位是1,则精确比较。

   所以,1 和 3 是完全相同的。因为 3 的二进制是 0011,虽然第1位是1(精确比较),但是由于 第 2 位是0,不覆盖系统设置,所以不起作用。
   
   若能理解 1 和 3 的区别,则其他的值也不难理解。5 是忽略大小写,且模糊比较;7 是忽略大小写,且精确比较;9 和 11是忽略大小写,返回行数;13 是忽略大小写,模糊比较,返回行数;15 是忽略大小写,精确比较,返回行数。

泉城飞狐
2016-03-02 10:19
antony521
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:168
专家分:161
注 册:2009-8-20
得分:0 
有人都研究到这种程度了
2016-03-02 10:38
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
回复 13楼 liuxingang28
3. 若要忽略 nFlag 之前的可选参数(nStartElement, nElementsSearched, nSearchColumn),可将其统一设置为 -1(其他负数也可以)
其他的函数,如果是数值参数,忽略的话,也都是写 -1?
2016-03-02 14:54
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:649
专家分:2156
注 册:2014-2-7
得分:0 
回复 15楼 mywisdom88
用 -1 去跳中间参数,这个需要具体情况具体分析,不是一般规律。

泉城飞狐
2016-03-02 16:10



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-462021-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.402403 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved