def错误中的Postscript无效访问

时间:2017-04-20 05:26:41

标签: postscript

我正在尝试调试一些postscript代码:

%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 0 0 600 600
/Times-Roman findfont globaldict begin /l0 10 def l0 scalefont setfont    newpath /l1 600 def 4 l1 moveto /l2 l1 def /l3 { /l4 exch def /l2 l2 l0 sub def 10 l2 moveto l4 show } bind def

我收到此错误:

Error: /invalidaccess in --def--
Operand stack:
   l3   --nostringval--
Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--       -nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push   1977   1   3   %oparray_pop   1976   1   3   %oparray_pop   --nostringval--   1960   1   3   %oparray_pop   1852   1   3   %oparray_pop   --nostringval--   %errorexec_pop   .runexec2    --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--
GPL Ghostscript 9.18: Unrecoverable error, exit code 1
Dictionary stack:
   --dict:1191/1684(ro)(G)--   --dict:3/20(G)--   --dict:82/200(L)--      --dict:3/20(G)--
Current allocation mode is local
Current file position is 234

阅读了一些文档之后我相信这是因为尝试将复合类型(括在花括号中的过程)放到globaldict上是只读的而且显然/ invalidaccess意味着你不能放置本地对象无论如何,要全球化。

无论如何可以建议添加什么代码或外卖以使这些postcript运行?

非常感谢

2 个答案:

答案 0 :(得分:2)

不要使用globaldict,简单地说。你永远不应该使用这本词典。

请改用userdict,这就是它的用途。你甚至不需要做“用户开始”这样的事情。因为当你启动PostScript程序时userdict是当前字典,你实际上必须采取慎重的行动来改变它。

答案 1 :(得分:1)

Ken的回答是正确的。这个答案只是关于这里发生了什么的更多细节。

在级别2和更高级别的PostScript中有一条规则,即全局虚拟内存不能包含对本地虚拟内存的引用。 (1级只有本地记忆。)

因此,在globaldict中放置数组(如过程)的正确方法是将其分配到全局内存中。

globaldict begin
  currentglobal true setglobal
    /l3 { /l4 exch def /l2 l2 l0 sub def 10 l2 moveto l4 show } bind def
  setglobal
end

但是,当然,您不需要在任何“正常”后记中使用全局内存 编码。如果您要定义命名资源或将常驻代码安装到打印机中,那么您可能需要进行这些体操。或者......如果...通过一些奇怪的机会......你正在使用使用多个执行线程的Display PostScript,那么你可能需要全局内存来在线程之间进行通信。