我正在尝试调试一些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运行?
非常感谢
答案 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,那么你可能需要全局内存来在线程之间进行通信。