我有一个dxl脚本,该脚本在DOORS应用程序中运行时有效,但在以批处理模式运行时却不起作用。我不确定为什么会这样。在批处理模式下运行时,出现以下错误:
门:断言失败,行3173,document.cpp:!nls_(“意外:树根没有名称属性”)堆栈
我知道创建GUI之类的操作可能会导致此错误,但是我没有这样做。奇怪的是,脚本停止在不同的模块和模块的不同部分中运行。因此,每次运行时,脚本都会在DOORS的不同区域分解。
我认为这是可能导致批处理模式下错误的相关代码:
Buffer bsz = create
void addNewLineSeparator(Buffer& b)
{
if (length(b) > 0)
{
b += "\n"
}
}
void display(string s)
{
addNewLineSeparator(bsz)
bsz += s
}
void displayRich(string s)
{
addNewLineSeparator(bsz)
bsz += s
}
void displayRichWithColour(string s)
{
addNewLineSeparator(bsz)
bsz += s
}
void displayRichWithColor(string s)
{
addNewLineSeparator(bsz)
bsz += s
}
void display(Attr__ a)
{
string s = richText a
if (!null s)
{
displayRich s
}
}
string showOut(Object o, int depth) {
Link l
LinkRef lr
ModName_ otherMod = null
Module linkMod = null
ModuleVersion otherVersion = null
Object othero
string disp = null
string s = null
string plain, plainDisp
int plainTextLen
int count
bool doneOne = false
string linkModName = "*"
for l in all(o->linkModName) do {
otherVersion = targetVersion l
otherMod = module(otherVersion)
if (null otherMod || isDeleted otherMod) continue
othero = target l
if (null othero) {
load(otherVersion, false)
}
othero = target l
if (null othero) continue
if (isDeleted othero) continue
doneOne = true
if (depth == 1) {
s = fullName(otherMod)
if (isBaseline(otherVersion)) {
s = s " [" versionString(otherVersion) "]"
}
if (s == "")
displayRich("\\pard " " ")
else
displayRich("\\pard " s)
}
}
return s
}
for o in m do
{
print showOut(o, 1)
}
答案 0 :(得分:0)
任何可能依赖于视图的事情都可能发生这种情况。 DOORS的批处理模式可能很挑剔。另外,DOORS对于内存管理也不是很谨慎-如果可以的话,将代码分成几部分可能更有意义,其中一个部分运行一个轻量级的集合,该集合在'eval_'函数中运行其他代码。这将有助于使内存解除分配的运行更加平稳(我曾经用来对数据库进行完整链接清单的一个技巧-已打开和关闭超过16000个模块!)
要对您的编辑进行回复:
您显示的代码是Layout DXL,它在显示视图时进行评估-具体来说,“ displayRich”函数尝试获取一个RTF字符串并将其放入相应的列中-但该列不存在,因为视图上下文不是以批处理模式创建的。
一个简单的解决方法是将整个代码包装在以下位置:
if(!isBatch){
// Your Code Here
}
这将确保仅当用户以非批处理模式运行DOORS时才计算DXL。