4D 期待一个带有指针和数组的变量

4D expecting a variable with pointers and array

这是片段:

C_TEXT(;$text)
C_POINTER()

$text:=
$vlElem:=Size of array(->)
Repeat 
    $vlElem:=$vlElem+1
    INSERT IN ARRAY(->;$vlElem)
    $vlPos:=Position(Char(Carriage return);)
    If ($vlPos>0)
        ->{$vlElem}:=Substring(;1;$vlPos-1)
        :=Substring(;$vlPos+1)
    Else 
        ->{$vlElem}:=
    End if 
Until (="")

我尝试使用以下代码片段启动该方法:

ARRAY TEXT($vtextarr;0)
C_TEXT($vtext)
$vtext:="lorem" + char(Carriage return) + "ipsum" + char(Carriage return) + "lorem"
finv_split_free_text($vtext; $vtextarr)

它报告了“4D 需要一个变量”消息。我做错了什么?

有两个问题: 1) 是你对 1 美元的使用。除了指针和对象之外,您不能直接修改参数。 2) 当没有 CR 时,您是否不清除文本变量。

您遇到的错误是在 Substring 调用中,因为您无法更改 $1 的值。您需要做的就是引用 $text 而不是 $1:

C_TEXT(;$text)
C_POINTER()

$text:=
$vlElem:=Size of array(->)

Repeat 
  $vlElem:=$vlElem+1
  INSERT IN ARRAY(->;$vlElem)
  $vlPos:=Position(Char(Carriage return);$text)
    If ($vlPos>0)
      ->{$vlElem}:=Substring($text;1;$vlPos-1)
      $text:=Substring($text;$vlPos+1)
    Else 
      ->{$vlElem}:=$text
      $text:=""  //  otherwise nothing ever clears the var
    End if
  Until ($text="")

将参数设置为局部变量,然后处理该变量。

您可能还想查看 TEXT TO ARRAY 命令。

如果您将一个对象(用 C_OBJECT、v15+ 定义)作为参数传递,您可以对特定键进行您显示的那种修改。无论如何,我们中的许多人仍然更喜欢将参数分配给本地变量。

问题出在第二个参数上:如果将其声明为指针,则必须调用传递指针的方法:

finv_split_free_text($vtext; ->$vtextarr)