如果我们使用text1 = text2会有什么问题?在两个文本变量之间复制文本的正确方法是什么?

时间:2017-09-19 08:53:28

标签: ewam

我在语句text1 = text2的编译模式下遇到错误。该声明有什么问题,我们如何解决?

1 个答案:

答案 0 :(得分:0)

Wynsure Development Rules中有一节专门讨论这个问题,请查看“14.3文本”部分,我将总结: 文本变量是指向缓冲区的指针,当我们写入文本时,缓冲区会自动重新分配,因此内存位置会随着文本的增长,更改或缩小而不同。因此,指针不存在。 eWAM自动分配一个新的较大缓冲区并将旧缓冲区的内容复制到新缓冲区,释放旧缓冲区,然后更新MyText指针以指向新缓冲区。

浅分配 如果你真的不明白文本变量是如何工作的,那么这是最危险的操作。

例如,以下代码将崩溃(作为一般规则,导致崩溃的原因是访问已释放的内存位置或两次释放相同的内存位置。)

MyText2 = MyText1 写(MyText1,...) 空白(MyText1) 空白(MyText2)//崩溃

浅层赋值MyText2 = MyText1只是复制指针。它不会重复缓冲区。

将文本从一个变量复制到另一个变量时,请使用深层副本:= 如果使用=则指向原始文本var地址。然后,当您将第二个文本设置为空白时,它实际上将原始文本设置为空白(处置)。

专用文字方法 Text有许多正确处理它们的自定义方法,例如var.type.write函数 var.type.blank函数

Procedure Test
   var tmpText : Text
   tmpText.type.Write(‘Hello’, @tmpText)
   tmpText.type.blank(@tmpText)
endProc

请注意,我们总是需要在移动内容后清空旧的变量文本,以便不会发生内存泄漏。

 procedure AnotherProcedure
      Var MyText : Text
      Var tmpText : text
      tmpText= GetXXXText
      Write(MyText, tmpText )
      tmpText.type.blank(@tmpText)
    endproc