标题:VFP封装结构类型示例(四) [结]
只看楼主
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
结帖率:100%
已结贴  问题点数:100 回复次数:17 
VFP封装结构类型示例(四) [结]
VFP封装结构类型,作为示例最后探讨一下数据结构与链表。
VFP 的 DBF 也是应用数据结构与链表的产物,学VFP的对这方面了解一下可以加深对 DBF 的理解,也可以设计其他格式的数据文件。
相关文件
StructClass_demo.rar (7.87 KB)

程序代码:
CLEAR
cDefPath = ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cDefPath)

#INCLUDE apiFuns.h
SET PROCEDURE TO apiFuns.prg, StructClass.prg ADDITIVE
LoadApi() 

ds = CREATEOBJECT("数据结构")
ds.create()
dt = CREATEOBJECT("数据表")

bufSize = ds.size
pBuffer = myMalloc(bufSize)

head = 0    && 头记录指针
last = 0    && 尾记录指针

filename = cDefPath + "test.dat"
load_data(filename)
add_data("张三", 1, 18, 170)
add_data("李四", 2, 22, 175)
list_data()
save_data(filename)

SET PROCEDURE TO
CLEAR ALL
RETURN

DEFINE CLASS 数据结构 as STRUCT_CLASS
    PROCEDURE init
        this.stInit("name", "C",10)
        this.stInit("num1", "U",1)
        this.stInit("num2", "I",2)
        this.stInit("num3", "I",4)
    ENDPROC
ENDDEFINE

DEFINE CLASS 数据表 as STRUCT_CLASS
    PROCEDURE init(ds)
        this.stInit("数据记录", "C",17)
        this.stInit("next",     "U",4)
    ENDPROC
ENDDEFINE

FUNCTION add_data(name, num1, num2, num3)
    LOCAL ptr
    ptr = dt.create()
    ds.setValue("name", name, ptr)
    ds.setValue("num1", num1, ptr)
    ds.setValue("num2", num2, ptr)
    ds.setValue("num3", num3, ptr)
    dt.setValue("next", 0,    ptr)
    IF last != 0
        dt.setValue("next", ptr,  last)
    ENDIF
    IF head == 0
        head = ptr
    ENDIF    
    last = ptr
    RETURN last
ENDFUNC

FUNCTION load_data(filename)
    IF !FILE(filename)
        RETURN 0
    ENDIF 
    LOCAL fp, ptr
    fp = myFOpen(filename, "rb")
    IF  fp == 0
        RETURN 0
    ENDIF
    head = 0
    last = 0
    IF apiFRead(pBuffer,bufSize,1,fp) == 1
        head = dt.create()
        apiMemcpy_s(head, bufSize, pBuffer, bufSize)
        dt.setValue("next", 0, head)
        last = head
    ENDIF
    DO WHILE apiFRead(pBuffer,bufSize,1,fp) == 1
        ptr = dt.create()
        apiMemcpy_s(ptr, bufSize, pBuffer, bufSize)
        dt.setValue("next", 0, ptr)
        dt.setValue("next", ptr, last)
        last = ptr
    ENDDO
    apiFClose(fp)
    RETURN head
ENDFUNC

FUNCTION save_data(filename)
    LOCAL fp, ptr
    fp = myFOpen(filename, "wb")
    IF  fp == 0
        RETURN 0
    ENDIF
    ptr = head
    DO WHILE ptr != 0
        apiFWrite(ptr, bufSize, 1, fp)
        ptr = dt.getValue("next", ptr)
    ENDDO
    apiFClose(fp)
    RETURN 1
ENDFUNC

FUNCTION list_data()
    LOCAL ptr
    ptr = head
    DO WHILE ptr != 0
        ?  ds.getValue("name", ptr)
        ?? ds.getValue("num1", ptr)
        ?? ds.getValue("num2", ptr)
        ?? ds.getValue("num3", ptr)
        ptr = dt.getValue("next", ptr)
    ENDDO
ENDFUNC

搜索更多相关主题的帖子: head VFP next RETURN this 
2022-03-30 21:07
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:25 
谢谢吹版,收藏了!

坚守VFP最后的阵地
2022-03-30 22:11
nbwww
Rank: 6Rank: 6
等 级:贵宾
威 望:10
帖 子:222
专家分:468
注 册:2021-1-9
得分:25 
收藏学习
2022-03-31 06:21
schtg
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1355
专家分:2534
注 册:2012-2-29
得分:25 
吹版,谢谢!
2022-03-31 07:17
easyppt
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:119
专家分:169
注 册:2021-11-24
得分:25 
谢谢 吹版!
2022-03-31 10:07
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
增加浮点数类型
StructClass_demo.rar (8.09 KB)


程序代码:
CLEAR
cDefPath = ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cDefPath)

#INCLUDE apiFuns.h
SET PROCEDURE TO apiFuns.prg, StructClass.prg ADDITIVE
LoadApi() 

ds = CREATEOBJECT("数据结构")
ds.create()
dt = CREATEOBJECT("数据表")

bufSize = ds.size
pBuffer = myMalloc(bufSize)

head = 0    && 头记录指针
last = 0    && 尾记录指针

filename = cDefPath + "test.dat"
load_data(filename)
add_data("三姑", 1, 18, 170,     1.1, -1.1)
add_data("六婆", 2, 22, 175,  -22.22, 22.22)
add_data("七婶", 3, 36, 180, 333.333, -333.333)
list_data()
save_data(filename)

SET PROCEDURE TO
CLEAR ALL
RETURN

DEFINE CLASS 数据结构 as STRUCT_CLASS
    PROCEDURE init
        this.stInit("name", "C",10)    && 字符串
        this.stInit("num1", "U",1)     && 无符号整数
        this.stInit("num2", "I",2)     && 有符号整数
        this.stInit("num3", "I",4)
        this.stInit("num4", "F",4)     && 单精度浮点数
        this.stInit("num5", "F",8)     && 双精度浮点数
    ENDPROC
ENDDEFINE

DEFINE CLASS 数据表 as STRUCT_CLASS
    PROCEDURE init(ds)
        this.stInit("数据记录", "C",29)
        this.stInit("next",     "U",4)
    ENDPROC
ENDDEFINE

FUNCTION add_data(name, num1, num2, num3, num4, num5)
    LOCAL ptr
    ptr = dt.create()
    ds.setValue("name", name, ptr)
    ds.setValue("num1", num1, ptr)
    ds.setValue("num2", num2, ptr)
    ds.setValue("num3", num3, ptr)
    ds.setValue("num4", num4, ptr)
    ds.setValue("num5", num5, ptr)
    dt.setValue("next", 0,    ptr)
    IF last != 0
        dt.setValue("next", ptr,  last)
    ENDIF
    IF head == 0
        head = ptr
    ENDIF    
    last = ptr
    RETURN last
ENDFUNC

FUNCTION load_data(filename)
    IF !FILE(filename)
        RETURN 0
    ENDIF 
    LOCAL fp, ptr
    fp = myFOpen(filename, "rb")
    IF  fp == 0
        RETURN 0
    ENDIF
    head = 0
    last = 0
    IF apiFRead(pBuffer,bufSize,1,fp) == 1
        head = dt.create()
        apiMemcpy_s(head, bufSize, pBuffer, bufSize)
        dt.setValue("next", 0, head)
        last = head
    ENDIF
    DO WHILE apiFRead(pBuffer,bufSize,1,fp) == 1
        ptr = dt.create()
        apiMemcpy_s(ptr, bufSize, pBuffer, bufSize)
        dt.setValue("next", 0, ptr)
        dt.setValue("next", ptr, last)
        last = ptr
    ENDDO
    apiFClose(fp)
    RETURN head
ENDFUNC

FUNCTION save_data(filename)
    LOCAL fp, ptr
    fp = myFOpen(filename, "wb")
    IF  fp == 0
        RETURN 0
    ENDIF
    ptr = head
    DO WHILE ptr != 0
        apiFWrite(ptr, bufSize, 1, fp)
        ptr = dt.getValue("next", ptr)
    ENDDO
    apiFClose(fp)
    RETURN 1
ENDFUNC

FUNCTION list_data()
    LOCAL ptr
    ?  ds.aSTRUCT[1,1] + "  "
    ?? ds.aSTRUCT[2,1] + "     "
    ?? ds.aSTRUCT[3,1] + "     "
    ?? ds.aSTRUCT[4,1] + "               "
    ?? ds.aSTRUCT[5,1] + "                 "
    ?? ds.aSTRUCT[6,1]
    ptr = head
    DO WHILE ptr != 0
        ?  ds.getValue("name", ptr)
        ?? ds.getValue("num1", ptr)
        ?? ds.getValue("num2", ptr)
        ?? ds.getValue("num3", ptr)
        ?? ROUND(ds.getValue("num4", ptr), 4)
        ?? ROUND(ds.getValue("num5", ptr), 4)
        ptr = dt.getValue("next", ptr)
    ENDDO
ENDFUNC
2022-03-31 10:19
aqyejun
Rank: 3Rank: 3
等 级:论坛游民
威 望:9
帖 子:121
专家分:99
注 册:2010-6-11
得分:0 
谢谢分享

【独叶为舟】工作室
2022-03-31 14:41
schtg
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1355
专家分:2534
注 册:2012-2-29
得分:0 
谢谢吹版!
2022-04-01 06:27
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
修改了一下
原用数组来保存分配的结构块内存地址,这样会受到数组最大数目的限制。
现改用地址链表来保存分配的内存地址,这样只会受可用内存大小的限制。


[此贴子已经被作者于2022-4-4 14:44编辑过]

2022-04-02 20:36
schtg
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1355
专家分:2534
注 册:2012-2-29
得分:0 
@吹版,辛苦啦,谢谢!
2022-04-03 05:39



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




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

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