注册 登录
编程论坛 VFP论坛

老车赞数组

惬意_甬车 发布于 2021-10-21 20:05, 3297 次点击
___2021年10月21日

  很幸运,还记得1987年刚开始学编程时,买了一本32开本的编程书,如果没记错的话那本书的作者是谭皓强,书中写了这样一句话:“充分应用数组,可以节省磁盘,提高运行速度,简化与优化程序”。从那时起本人便与数组结下了不解之缘,三十多年来对数组的热爱有增无减。这句话让中车受益匪浅,让老车受益终生。
  很奇怪,不知为何数组这么好的东西却没有得到广泛应用,老车感到很痛心,于是便不停的呼吁。数组是VFP的,老车并没有申请专利,呼吁编程应用数组老车肯定得不到钱的,完全是为了同仁受益,振兴VFP。
  很遗憾,老车呼吁应用数组时常遭遇反对,特别是在算法群时。还记得反对应用数组的反复声称数组是淘汰技术,VFP9.0中依然保留数组是为了向前兼容。然而老车在VFP9.0帮助中查到了多处大幅扩充了数组的说明,证明了并非为了向前兼容,而是大力提倡:
只有本站会员才能查看附件,请 登录

  在辩论数组应用技术优劣时,老车得到了数组应用高人的支持:
只有本站会员才能查看附件,请 登录

  数组淘汰论的声音逐步消失了,可还时常有人拿其与CURSOR表或基本DBF表对比功能,其实这是对数组认知不足所至,是还停留在拿数组只当记录信息载体的层面,还没有把数组提高到做为编程工具层面。数组与表虽然都是数据的载体、并且还可以互相转换,但其功能并没有可比性。数组是如同命令、函数、控件的编程工具,CURSOR表或基本DBF是数据载体。
  数组虽然也可以作为数据的载体,但因其受内存容量所限、没有表的索引、筛选、统计等功能,做数据载体用时并不如表。就如同筷子与烧火棍都是叉东西用的,吃饭时用烧火棍叉不好用,烧火时用筷子叉也不好用。
  数组绝非是仅仅把单个变量串起来、排成排,更重要的是VFP还赋予了它相当多的功能、能解决许多复杂问题、玩出许多花样。特别是VFP还赋予了数组与表结构、数组与表、数组与记录互换的特异功能,这是VFP数组独一无二、绝无仅有的。
  数组的容量大的很,特别是VFP9.0扩充之后,大到如果不是拿数组当表用做数据的载体,只是编程用几乎是用不完的。早年因不知道容量这么大,应用还有些注意节约,唯恐突破指标上限,近年来只要需要,数量上就无所顾及,大有不用白不用之感。记得曾经有一位业界大师得知VFP数组容量这么大、功能这么强,懊悔VFP还有这么大一块资源多年一直在闲置。
  数组应用需要一个从量变到质变的过程,遇到相关场景马上能构思出数组要如何构建如何应用,久而久之便形成了一种思维。
  老车大力提倡数组应用、是源于三十多年来大力应用数组。老车的程序中遍布着数百数组,数万数组元素。老车认为没充分应用数组,相当于少用了一种编程工具。
  
  下面举一个简单的例子对比一下,希望同仁、特别是初学者能对“充分应用数组,可以节省磁盘、提高运行速度、简化与优化程序”这句话有更高的认识、激发起应用数组的热情:

在AA表第3行第2列写入一个数据,读取一个数据:
SELECT AA  &&写入
GO 3
REPLQCE 字段2 WITH 10

SELECT AA  &&读取
GO 3
BB=字段2

在AA数组第3行第2列写入一个数据,读取一个数据:
AA(3,2)=10  &&写入
BB= AA(3,2) &&读取

  相比之下简化是显而易见了,优化则需要从量变到质变逐步形成思维。运行速度数组应该是表的数十倍、数百倍或更多,因为数组是电流操作,表要移动指针、属机械操作。

老车的数组应用实例之一:
只有本站会员才能查看附件,请 登录

老车的数组应用实例之二:
只有本站会员才能查看附件,请 登录



[此贴子已经被作者于2021-10-21 20:24编辑过]

28 回复
#2
自由而无用2021-10-21 21:11
null

[此贴子已经被作者于2021-11-4 17:44编辑过]

#3
吹水佬2021-10-21 21:56
array与table不要孤立看待。
实际应用中array与table的关系是很密切,从array到table,或从table到array是很平常的事。
array的数据关系相对简单,而table是关系数据库的组成部份,是相关联系的数据集。
至于用array或用table来处理数据谁效率高,这与数据之间的联系和规模有关,要视实际情况而论。

#4
惬意_甬车2021-10-21 22:11
以下是引用吹水佬在2021-10-21 21:56:24的发言:

array与table不要孤立看待。
实际应用中array与table的关系是很密切,从array到table,或从table到array是很平常的事。
array的数据关系相对简单,而table是关系数据库的组成部份,是相关联系的数据集。
至于用array或用table来处理数据谁效率高,这与数据之间的联系和规模有关,要视实际情况而论。

完全认同!
#5
惬意_甬车2021-10-22 06:36
回复 3楼 吹水佬
吹水佬大师好:谢谢您的关注!谢谢您的参与!
本人在写文档管理软件,起名“书斋”,单机版初步写完,这几天试着写几篇稿测试软件。壮着胆子贴到贵论坛,得到大师关注评论甚感惊喜!下面是这篇稿在“书斋”中浏览状态的切图,还望大师在稿件与软件两方面多提宝贵意见。诚挚的感谢!
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2021-10-22 07:15编辑过]

#6
吹水佬2021-10-22 10:30
以下是引用惬意_甬车在2021-10-21 20:05:28的发言:

  很遗憾,老车呼吁应用数组时常遭遇反对,特别是在算法群时。

没什么好遗憾的吧,玩算法可能比较注重效率。
在VFP来说,对于数据规模较大和运算复杂度较高时,用数组来处理不一定是好的方法,甚至是不可能只用数组来处理。
首先要明确VFP运行环境是解释执行过程的,对于循环指令的执行过程运行效率并不高,尤其是循环的层次和深度大时更明显,而用数组处理数据大都时是离不开循环指令。
数组的应用还是有一定的局限性,可用数组来处理小块数据、间接的数据存取、简单的运算。

提到算法,顺便提个问题,怎样用数组来处理排序:
对于二维数组,按 第1列(顺序)+ 第2列(逆序)排序(不涉及到表)
例:原二维数组
 1  11
 2  21
 3  31
 1  12
 2  22
 3  32
结果:排序后数组
 1  12
 1  11
 2  22
 2  21
 3  32
 3  31



#7
惬意_甬车2021-10-22 11:07
回复 6楼 吹水佬
呵呵!东北方言:行家伸伸手,便知有没有。大师就是大师,一下子就打到数组七寸上了。
老车也是觉得两维数组排序只能声明按哪列升序或降序排序,不能应用 与、或、非 是缺陷。看来讨论问题是大有益处的,还就是刚才老车想到,如遇那种场景分两次、再多分N次,是否能取得希望的效果呢?因没遇到过那种场景没实践过,突发奇想。见笑了!
#8
吹水佬2021-10-22 11:42
以下是引用惬意_甬车在2021-10-21 20:05:28的发言:
 
在AA表第3行第2列写入一个数据,读取一个数据:
SELECT AA  &&写入
GO 3
REPLQCE 字段2 WITH 10

SELECT AA  &&读取
GO 3
BB=字段2

在AA数组第3行第2列写入一个数据,读取一个数据:
AA(3,2)=10  &&写入
BB= AA(3,2) &&读取

  相比之下简化是显而易见了,优化则需要从量变到质变逐步形成思维。运行速度数组应该是表的数十倍、数百倍或更多,因为数组是电流操作,表要移动指针、属机械操作。

表面上看,表与数组差别好大,虽然说是“电流操作”与“机械操作”的差别,但两者也有好多相似的方面。
表与数组都属“结构类型”,数组也许相对叫简单的结构类型。
表数据运算时也要载入内存进行,在内存运算时,两者应该差别不大。
表是以文件形式存在,存取数据时有I/O操作过程,这个过程也是比较耗费,某种情况下会给人感觉表比数组效率低。




#9
惬意_甬车2021-10-22 13:27
回复 8楼 吹水佬
感觉与吹水佬大师交流很享受,我们都能坦诚的讲出各方面的利与弊。老车前面就讲过“数组做数据载体用时并不如表”;大师这里也讲了“某种情况下会给人感觉表比数组效率低”。毫不夸张的说,这样坦诚友好的讨问题几年都没遇到过了。

上面的讨论值得注意的一个问题是:单说计算表也可能是在内存中进行,与数组差别不大。但表的数据还是要读写磁盘的,数组就不用了。

前面吹水佬大师精准的打到了数组的七寸,为了活跃一下论坛气氛,老车也打一下表的七寸。哈哈!
CC=AA(3,2)+BB(2,3)
如果AA与BB都是表,就算是都在打开的状态,但都不在当前记录哦,试写最少要几条语句能完成、要写多少代码?试想复杂一些的计算数组该有多么简捷?
#10
吹水佬2021-10-22 20:19
以下是引用惬意_甬车在2021-10-22 13:27:09的发言:

CC=AA(3,2)+BB(2,3)
如果AA与BB都是表,就算是都在打开的状态,但都不在当前记录哦,试写最少要几条语句能完成、要写多少代码?试想复杂一些的计算数组该有多么简捷?
不能单纯用几条语句或简单的算式来得出什么结论。
表AA与数组AA是不能比的,如果要比的话,数组的数据处理能力与表的数据处理能力根本就没法比,表比数组强大得多了。在表数据处理过程中数组只能充当配角,不可能用数组来替代表。
#11
吹水佬2021-10-22 20:39
以下是引用惬意_甬车在2021-10-22 13:27:09的发言:

试写最少要几条语句能完成、要写多少代码?试想复杂一些的计算数组该有多么简捷?

就拿6楼的排序问题说,用表来处理,用一条简单的语句就可以,相对用数组来处理有多么简捷。
都得出“多么简捷”的结论,到底谁简捷?
所以,编程重在思路,而不是用什么指令、用什么语句和用什么编程语言,能过海就是神仙。

#12
xuminxz2021-10-22 20:50
当在多个同结构的表之间,进行高频次、记录数不多的数据交换时,数组确实快些。比如几百班、几千门课的自动排课中,用时差别很大。不过那是十几年前小内存(以百兆为单位)、7200r以下机械硬盘的时代。现在用的大内存,特别是固态硬盘的情况下,差别可能不大了。
方便性可能还是表好些,特别是字段多,或者对不同的表进行基本相同的操作时,用表代码通用性更好。有时用DBF表也不错,只有给表命名习惯统一就好。我从不用ls,lsls做需要保留的临时表,into dbf 一般都是这两个,退出时删除一下就好了。

[此贴子已经被作者于2021-10-22 20:57编辑过]

#13
惬意_甬车2021-10-22 21:35
呵呵!不知不觉的讨论又进入了歧途。VFP的最大亮点是DBF表,DBF表是VFP的魂。VFP中的其它命令、函数、控件等,当然也包括数组,哪个能与DBF表相比呢?可但是VFP只玩DBF表行吗?是否还需要有命令、函数、控件等,当然也包括数组的配合呢?老车开盘就说过如果拿数组当表用不如表好用,还说过数组与表没有可比性。说句笑谈,那DBF表与命令函数相比谁更好呢?哈哈!
老车只是觉得数组是个好东西,应用得好能简化与优化程序......,这么好这么大一块东西不充分应用太可惜,呼吁呼吁,仅此而已。谢谢关注本帖、谢谢参与本帖!
#14
吹水佬2021-10-23 09:51
以下是引用惬意_甬车在2021-10-22 21:35:03的发言:
呵呵!不知不觉的讨论又进入了歧途。

共同探讨问题怎会“进入了歧途”,编程不就是从不断发现错误或不足中得到不断的完善和发展吗?

以下是引用惬意_甬车在2021-10-22 21:35:03的发言:
VFP的最大亮点是DBF表,DBF表是VFP的魂。VFP中的其它命令、函数、控件等,当然也包括数组,哪个能与DBF表相比呢?

严谨的说,整个VFP中的一切都是一个统一体,绝不能随便将VFP中的东西对立起来比这个比那个,是吧? 否则这样比来比去有什么意义。所谓掌中十指有长短,各有其所能,各尽所能就好了。

以下是引用惬意_甬车在2021-10-22 21:35:03的发言:
可但是VFP只玩DBF表行吗?是否还需要有命令、函数、控件等,当然也包括数组的配合呢?老车开盘就说过如果拿数组当表用不如表好用,还说过数组与表没有可比性。

只用DBF表而不需要用命令、函数...,这样写出来的VFP程序哪里有?这个应该不是问题的问题,没什么讨论价值。

以下是引用惬意_甬车在2021-10-22 21:35:03的发言:
说句笑谈,那DBF表与命令函数相比谁更好呢?哈哈!

这个问题是个重复性的问题,上面已经讨论过。

以下是引用惬意_甬车在2021-10-22 21:35:03的发言:
老车只是觉得数组是个好东西,应用得好能简化与优化程序......,这么好这么大一块东西不充分应用太可惜,呼吁呼吁,仅此而已。

其实整个VFP都是个好东西,现在被暗杀了而得不到发展才是真正的可惜。

#15
吹水佬2021-10-23 10:10
以下是引用惬意_甬车在2021-10-21 20:05:28的发言:
  很奇怪,不知为何数组这么好的东西却没有得到广泛应用,老车感到很痛心,于是便不停的呼吁。

我就不觉得奇怪,更不会感到很痛心,也不会去呼吁。
人的认识过程会受到各自客观现实的影响,对待同一个问题不同的人有各自的看法也好正常。
不管用什么编程语言写程序,相信都会用到数组去处理问题,在使用数组的问题上可能有不同的做法,也无需太过执着有点抽象的“广泛应用”。
#16
惬意_甬车2021-10-23 10:13
回复 14楼 吹水佬
所以我们广大狐友要加强团结,共同努力振兴VFP!
#17
sam_jiang2021-10-23 11:03
哈哈,感觉像神仙打架。。。
#18
foxfans2021-10-23 11:57
#19
吹水佬2021-10-23 15:36
以下是引用sam_jiang在2021-10-23 11:03:35的发言:

哈哈,感觉像神仙打架。。。

有什么法器,显露一下。
#20
sam_jiang2021-10-24 11:20
回复 19楼 吹水佬
哈哈,神仙打架,百姓看热闹。
#21
吹水佬2021-10-24 11:47
以下是引用sam_jiang在2021-10-24 11:20:53的发言:

哈哈,神仙打架,百姓看热闹。

打架就不敢
知道老车是何方神圣吗?
老车的队伍可不是“沙家浜”胡传魁的队伍才十几个人七八条枪,不用打只动口就能用口水把你淹死
#22
惬意_甬车2021-10-24 12:13
以下是引用sam_jiang在2021-10-24 11:20:53的发言:

哈哈,神仙打架,百姓看热闹。


唯恐天下不乱
期待热闹观看
老车偃旗息鼓
退避三舍逃难
#23
惬意_甬车2021-10-24 12:25
东风吹,战鼓擂。
怼战老车怕过谁?
今遇贵坛吹水佬,
一回弃甲又丢盔。

#24
惬意_甬车2021-10-24 12:43
大败弃甲又丢盔,
逃出百里头不回。
举手摸摸头还在,
感谢上帝命没没。
#25
sam_jiang2021-10-24 12:53
回复 22楼 惬意_甬车
呵呵,玩笑话,别在意啊。

看到还有这么多foxer,很开心啊。
#26
惬意_甬车2021-10-24 12:57
狐友交流互学习,
何必逐字逐句批。
老车哪见这阵仗,
三十六策走上计。

#27
zhken2021-10-24 21:12
临时表比数组容易操作,性能也不错,用完就扔,不用大多顾忌
#28
shenlancwz2021-10-28 11:15
VFP中用好表才是效率最高最科学最便捷的,数组无法与表相比。
#29
shenlancwz2021-10-28 19:35
VFP 是的特色之一就是管理关系型数据库,其核心就是.dbf表,用数组管理数据,浪费了这个开发软件赋予的功能。
Polaris
1