Просто чтобы уточнить, я нахожусь на V7R3M0.
Я пытаюсь вызвать API Submit Debug Command ( QteSubmitDebugCommand ), но не получаю ожидаемых результатов, или я не получаюне правильно понимаю результаты.Я пытаюсь следовать примеру для заявления BREAK (в нижней части страницы в руководстве).Я ожидаю результатов, подобных показанным, но я не получаю те же результаты.
Мой прототип:
dcl-pr QteSubmitDebugCommand extproc(*dclcase);
rcvrDta char(128);
rcvrSiz int(10) const;
viewID int(10) const;
InputBuffer char(64) const;
InpBfrSiz int(10) const;
CompilerID char(20) const;
apiError like(apiErrDs);
end-pr;
Определения переменных:
dcl-pi *n ;
pViewID int(10) const;
pDebugCommand varchar(64) const options(*trim); // This is BREAK 10 WHEN IDX > 2
pCompilerID char(20) const; // which is valid in the test harness program
end-pi;
dcl-s receiverVariable char(128);
dcl-s i uns(5);
dcl-ds apiErrDs likeDs(apiErrDsTmp) inz;
dcl-ds resultEntryTmp template qualified;
resultType uns(10);
count uns(10);
length uns(10);
end-ds;
dcl-s receiverPtr pointer;
dcl-ds receiverData qualified based(receiverPtr);
bytesReturned int(10);
bytesAvailable int(10);
entries int(10);
resultArray dim(4) likeds(resultEntryTmp);
stringSpace char(256);
end-ds;
И я вызываю API с помощью:
QteSubmitDebugCommand(receiverVariable :%Len(receiverVariable) :pViewID
:pDebugCommand :%Len(pDebugCommand) :pCompilerID :apiErrDS);
receiverPtr = %addr(receiverVariable);
На этом этапе я выкидываю программу для проверки результатов.
В дампе я вижу:
RECEIVERDATA DS
BYTESAVAILABLE INT(10) 57 '00000039'X
BYTESRETURNED INT(10) 57 '00000039'X
ENTRIES INT(10) 3 '00000003'X
RESULTARRAY DS DIM(4)
(1)
COUNT UNS(10) 3 '00000003'X
LENGTH UNS(10) 0 '00000000'X
RESULTTYPE UNS(10) 33554432 '02000000'X
(2)
COUNT UNS(10) 10 '0000000A'X
LENGTH UNS(10) 0 '00000000'X
RESULTTYPE UNS(10) 83886080 '05000000'X
(3)
COUNT UNS(10) 10 '0000000A'X
LENGTH UNS(10) 0 '00000000'X
RESULTTYPE UNS(10) 83886080 '05000000'X
(4)
COUNT UNS(10) 1849750016 '6E40F200'X
LENGTH UNS(10) 4210752 '00404040'X
RESULTTYPE UNS(10) 3385124672 'C9C4E740'X
STRINGSPACE не отображается, но выглядит корректно
В соответствии с инструкцией должно возвращаться:
Receiver Variable
Offset Field Value
0 Bytes returned 59
Bytes available 59
Entry count 3
12 Result type BreakR(2)
Break results count 3
Reserved
24 Result type BreakPositionR(5)
Line number 7 (in my case this = 10)
Reserved
36 Result type ExpressionTextR(7)
Expression text offset 48
Expression text length 10
48 String space result > 5
Таким образом, это выглядит как запись заголовка (смещение 0) является правильным.
resultArray (1) выглядит правильно, так как значение Hex для RESULTTYPE равно '02000000'X, которое, я думаю, является BreakR.Но я ожидал, что значение в дампе будет 2, а не 33554432. Может кто-нибудь сказать мне, почему это?Я делаю что-то не так или просто неправильно понимаю, как это отображается.
resultArray (2) выглядит правильно, так как шестнадцатеричное значение RESULTTYPE равно 05000000'X, которое, я думаю, является BreakPositionR.Тот же вопрос относительно того, почему я должен смотреть на значение Hex.
resultArray (3) выглядит некорректно, поскольку значение Hex для RESULTTYPE равно '05000000'X, а в руководстве показано, что я должен был ожидать ExpressionTextR(7).
Что касается пространства строк, я не вижу ничего похожего на IDX> 2, что, как показывает руководство, следует ожидать.
Может кто-нибудь увидеть, что я делаю неправильноМой вызов или в определении прототипа.
Также, кто-то может объяснить, почему resultarray.count выглядит как обычный int, в то время как resultarray.recordtype кажется правильным только в Hex.Должен ли я смотреть на значение Hex?
Буду признателен за любые мысли.
Спасибо,
Роб
Обновление: После ответа Марка я изменил процедуру, следуя предложению Марка, и она работала правильно.Спасибо, Марк.
Вот что я закончил, изменив код на ...
dcl-s receiverPtr pointer;
dcl-ds receiverData qualified based(receiverPtr);
bytesReturned int(10);
bytesAvailable int(10);
entries int(10);
end-ds;
dcl-s resultEntryPtr pointer;
dcl-ds resultEntry qualified based(resultEntryPtr);
type uns(10) pos(1);
count uns(10) pos(5);
offset uns(10) pos(5);
length uns(10) pos(9);
end-ds;
dcl-s stringSpace char(256);
QteSubmitDebugCommand(receiverVariable :%Len(receiverVariable) :pViewID :pDebugCommand :%Len(pDebugCommand)
:pCompilerID :apiErrDS);
receiverPtr = %addr(receiverVariable);
resultEntryPtr = %addr(receiverVariable);
// We want to position the pointer to the last entry which contains
// the offset and the length of the character string.
resultEntryPtr += 12 * receiverData.entries;
stringSpace = %subst(receiverVariable: resultEntry.offset: resultEntry.length);