[原文地址: http://www.think400.dk/adhoc_4.htm#eks0015]
问题:
使用VB 或者C 我能够很容易的增加数组的大小而不丢失原来的数据,在RPG里面是否也可能呢?
回答:
当然可以,但是你得基于指针建立数组。并且增长内存分配大小。具体看看操作码 ALLOC, REALLOC, 和 DEALLOC 。
下面是一个快速的例子:
* 数组定义--基于指针
Darray S 10 DIM(20000) BASED(PTR)
Dindex s 7 0
* memory allocation data items--不知道具体怎么翻译这个,按照我的理解,是一个指针结构
* 用于保存数组的信息,比如数组中的序号,内存大小,数组的内容
Dptr S *
Dnbr_of_elems S 5 0 INZ(10)
Dmem_size S 7 0 INZ
Dx S 10i 0
* 分配出示内存=
*(元素的初始数量 * 数组的内容的大小)
C EVAL mem_size = %size(array) * nbr_of_elems
C ALLOC mem_size ptr
C EVAL x = %elem(array)
* 循环测试
C 1 DO 50 index
* 当索引超过当前数组元素的上限时
C IF index > nbr_of_elems
* 通过加10的步长方式
*并且乘以数组元素的大小得到一个新的内存大小
C EVAL nbr_of_elems = nbr_of_elems + 10
C EVAL mem_size = %size(array) * nbr_of_elems
* 重新分配内存块,并且增长大小
C REALLOC mem_size ptr
C ENDIF
* Move数据测试
C MOVE index array(index)
*
C ENDDO
* 释放内存
C DEALLOC ptr
C EVAL *inlr = *on
Darray S 10 DIM(20000) BASED(PTR)
Dindex s 7 0
* memory allocation data items--不知道具体怎么翻译这个,按照我的理解,是一个指针结构
* 用于保存数组的信息,比如数组中的序号,内存大小,数组的内容
Dptr S *
Dnbr_of_elems S 5 0 INZ(10)
Dmem_size S 7 0 INZ
Dx S 10i 0
* 分配出示内存=
*(元素的初始数量 * 数组的内容的大小)
C EVAL mem_size = %size(array) * nbr_of_elems
C ALLOC mem_size ptr
C EVAL x = %elem(array)
* 循环测试
C 1 DO 50 index
* 当索引超过当前数组元素的上限时
C IF index > nbr_of_elems
* 通过加10的步长方式
*并且乘以数组元素的大小得到一个新的内存大小
C EVAL nbr_of_elems = nbr_of_elems + 10
C EVAL mem_size = %size(array) * nbr_of_elems
* 重新分配内存块,并且增长大小
C REALLOC mem_size ptr
C ENDIF
* Move数据测试
C MOVE index array(index)
*
C ENDDO
* 释放内存
C DEALLOC ptr
C EVAL *inlr = *on
Thanks to Mark D. Walter