Каковы некоторые распространенные причины того, почему сценарий DXL будет работать в DOORS, но не тогда, когда он запускается в пакетном режиме? - PullRequest
0 голосов
/ 21 мая 2019

У меня есть сценарий dxl, который работает при запуске в приложении DOORS, но не работает при запуске в пакетном режиме. Я не уверен, почему это будет. При работе в пакетном режиме я получаю следующую ошибку:

doors: утверждение не выполнено, строка 3173, document.cpp:! Nls _ («неожиданно: корень дерева не имеет атрибута имени») стек

Я знаю, что создание графического интерфейса и тому подобное может вызвать эту ошибку, но я этого не делаю. Странно, что скрипт перестает работать в разных модулях и разных частях модулей. Таким образом, скрипт каждый раз запускается в разных областях 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)

}

1 Ответ

0 голосов
/ 21 мая 2019

Это может случиться со всем, что может зависеть от представления. Пакетный режим для DOORS может быть привередливым. Кроме того, DOORS не совсем осторожно относится к управлению памятью - если вы можете, возможно, имеет смысл разделить ваш код на разделы, один из которых запускает облегченный набор, который запускает другой код внутри функции 'eval_'. Это поможет более равномерно распределять память (уловка, которую я использовал для полной инвентаризации ссылок нашей базы данных - более 16000 модулей открыто и закрыто!)

Чтобы ответить на ваши изменения:

Код, который вы показываете, это Layout DXL, который оценивается при отображении представления, в частности, функция displayRich пытается взять строку с расширенным текстом и поместить ее в соответствующий столбец, но этот столбец не существует. , поскольку контекст представления не создается в пакетном режиме.

Простым решением было бы обернуть весь код в:

if(!isBatch){
     // Your Code Here
}

Это гарантирует, что DXL рассчитывается только в том случае, если пользователь запускает DOORS в не пакетном режиме.

...