一个对新人有帮助的问题(300)

  • 主题发起人 主题发起人 hfghfghfg
  • 开始时间 开始时间
另外在格式化(也就是Adjust函数)中我偷懒了,对于补位的位置和调整,应该使用一个计数器从两端向中间缩减,当两端之差小于不大于1时,停止调整。不想多写代码了,所以,偷懒,基于编码自身的特点,直接case搞定。
 
另外说一下我用的是格式化方式也就是补齐方式。如果将格式化加入核心算法中,那速度就要慢5倍以上,所以数据应用系统中的编码通常都是固定的,很多方面也是基于这个原因。基于正常情况下的做法,通常都是输入一个编码验证其范围,所以格式化我认为应于核心算法剥离。另外我觉得核心算法越简单高效越易于看懂越好。你的核心也很简单,但是调整过程非常、很不清晰,可能我太菜了,读起来很费解,而且有些例程的归属也不明确。对你的记录和数据结构也有点看不懂。最好是你能注释一下,尤其是你的数据结构。
 
to dark_power你说的很对 所作IO越少,条件判定和筛选越少,运行越快。我一般写程序 就是尽量避免 字符串赋值或者 多个字符串 连加其实我的本意是想提醒那些新手,不要把字符串操作不当回事。没想到 你这样的老手 也出来了我前一段时间和一个人聊天他说delphi写的程序慢我看看了代码里边大量的 pos copy str1:=s1+s2+s3+':'+s4;还有其他的 一些字符串操作然后我和他继续聊他动辄就说 这个技术 那个技术什么线程池啊 啥的 估计是在那个学校学的吧格式化部分的这部分如果这个人 写估计又少不了 pos copy了我就感觉到怪怪的一些基本的东西还是注意的 其实很多基本的东西很重要我待会另外开贴送分
 
TNumRec = record Col: array[0..FilterMaxColCount - 1] of TColRec;// 每列的具体内容 Colcount: Integer;//列的数量 例如 101-201-301-401-501-601 就是6列 end; TColRec = record P: PChar; // 这一列的值 Length: Integer;// 这一列的长度 end;请dark_power 拿分http://www.delphibbs.com/delphibbs/dispq.asp?lid=3981276
 
首先,郑重声明一点: 那就是我也是个新手,而且是个菜鸟,而且是很菜很菜很菜的那种。只是有时窃喜。。。拿分就不比了,我对分数不敢兴趣,我也学到好多东西,没什么理由搜刮别人,无功不受禄。如果你实在要给,不如给我讲讲你的算法。自己的设想,设计,理解和应用感受,这个比给我多少分都值。一定要注释啊,你的算法比较复杂,且抽象,注释太少了,要读起来太费事,所以我放弃了。但你一定要给我解释解释啊。另外,经常听很多人说Delphi这不行那不好,连个链表啥的都没有。真服了这些人了,只要他稍微看看Delphi自带的帮助都不会丢这个人。TList,TStack,TQueue...很多数据结构都有啊。另外觉得你用的记录类型,觉得用StringList应该可以更好,在不与外部直接交互的情况下,string是非常高效的。当然,传出去时用PChar()强转一下就行了。
 
我的 那个其实 谈不上 算法就是 把 一个 字符串 拆分成 多个 TColRec 而已只是 TColRec 中的p 是个指针而已下面 这个 函数是做 拆分 字符串的只是我比较 习惯用pchar 所以代码写的不好这个纯粹是 个人习惯 而已procedure Num2NumRec(v: pchar; len: integer; var Num: TNumRec);var p: pchar; i: integer; PCol: PColRec;begin Num.Colcount := 0; if len <= 0 then exit; p := v; PCol := @(Num.Col[0]); PCol.Length := 0; for i := 1 to len do begin if p^ = FilterSeparator then begin inc(PCol); PCol^.Length := 0; end else begin if PCol^.Length = 0 then begin PCol^.P := p; inc(Num.Colcount); end; inc(PCol^.Length); end; inc(p); end;end;
 
procedure Num2NumRec(v: pchar; len: integer; var Num: TNumRec);var p: pchar; i: integer; PCol: PColRec;begin Num.Colcount := 0; if len <= 0 then exit; p := v;//首字符 PCol := @(Num.Col[0]);//指向首列 PCol.Length := 0; for i := 1 to len do begin if p^ = FilterSeparator then //是分割符 begin inc(PCol); //指向下一列 或者说 一个新列将要开始 PCol^.Length := 0;//新的这列长度 置 0 (初始化) end else begin if PCol^.Length = 0 then //该列 的 首字符 begin PCol^.P := p;//记录下 该列 的首字符的 地址 inc(Num.Colcount);// 总列数 加 1 end; inc(PCol^.Length);//该列 长度加 1 end; inc(p);////指向下一个字符 end;end;
 
这样的话,那么最终Num中将是这样: 指向字串的首地址 1st分隔符后的字串 2nd分隔符后的字串 ∧ ∧ ∧ —>空指针 | | | |PCol:(('Axx-xx-Axx',3), ('xx-Axx',2), ('Axx',1), (nil,0))Colcount: 3嗯,你并没有拷贝数据只是设定了指针指向一些特定位置,嗯,这确实很快。下面呢?
 
下面呢?其他就没啥了我的代码 思想就是 想 告诉 新人 不要 把字符串赋值 不当回事其他的 就没有啥 好说的了但是就目前来看 没人 喜欢 讨论这样的问题。
 
现在哪里还有什么新人啊。如果真的统计一下,每年结束使用delphi的人,比开始使用delphi的还多。
 
搞不清为什么要一个这样的编号,无事找事。直接一个整型ID:UInt64最大值:18446744073709551615 可以包含地球上的每一粒沙子。
 
回家好好研究下
 
to lah998其实 信息编码 是有其他用途用信息编码 的方式 也是常用的啊有时 用 UInt64有时 用 GUID有时 用 信息编码有时 用 时间戳有时 用 。。。。。每种方式 都有优点 都有缺点再者 每个人的 习惯也不同啊 有人喜欢臭豆腐 有人喜欢马苏里奶酪俺是喜欢 吃着火锅 还白兰地
 
关键,信息编码通常是混合式的,字符与数字混合。就像铅笔的硬度编号是10H--HB--9B,不是仅仅用数字就能表示的。
 
学习中...学习中...
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部