代码之家  ›  专栏  ›  技术社区  ›  U. Windl

postscript:cvs是否终止字符串缓冲区?

  •  0
  • U. Windl  · 技术社区  · 5 年前

    使用时的一个想法 cvs 是通过重新使用字符串缓冲区来帮助垃圾收集器,如

    /s 5 string def
    s 2 cvs %...
    s 66 cvs %...
    

    但是,在循环中执行此操作时,缓冲区中实际找到的字符串是:

    (-40.0)
    (-30.0)
    (-20.0)
    (-10.0)
    (0.0.0)
    (10.00)
    (20.00)
    (30.00)
    (40.00)
    

    因此,当转换结束时,字符串似乎没有终止(可在ghostscript 9.26中找到)。不幸的是,ghostscript参考手册对字符串是否终止有点沉默。

    所以问题是: 预期的行为是什么?

    当你尝试像 val str dup 2 0 put cvs 结果是 == ):

    (-40.0)
    (-30.0)
    (-20.0)
    (-10.0)
    (0.0\0000)
    (10.00)
    (20.00)
    (30.00)
    (40.00)
    

    那么,重新使用字符串缓冲区到底是个坏主意吗?

    更新1:

    我发现放在堆栈上的值是正确的,而缓冲区中的值不是:

    val s1 cvs pop            % leaves the wrong value in s1
    val s1 cvs /s2 exch def   % leaves the correct value in s2
    
    1 回复  |  直到 5 年前
        1
  •  2
  •   rici    5 年前

    cvs 将字符串(用作缓冲区)作为参数,使用转换为字符串的值参数覆盖缓冲区的初始段,然后 将该段作为间隔返回 . (请参阅plrm的568页;我懒得重新键入它。)如果您不希望在转换后的值的末尾出现垃圾,则需要使用该返回值。(但是,只要不将底层缓冲区用于其他用途,返回的值将是有效的。)