Чтобы уточнить, я использую V7R3M0.
Я пытаюсь вызвать команду отправки отладки (QteSubmitDebugCommand ) API, но не получил ожидаемых результатов или неправильно их понял. Я пытаюсь следовать примеру инструкции 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) выглядит правильно, поскольку шестнадцатеричное значение RESULTTYPE равно '02000000'X, что, как мне кажется, является BreakR. Но я ожидал, что значение в дампе будет 2, а не 33554432. Может кто-нибудь сказать мне, почему это так? Я что-то делаю не так или просто не понимаю, как это отображается?
ResultArray (2) выглядит правильно, поскольку шестнадцатеричное значение RESULTTYPE равно '05000000'X, что, как мне кажется, является BreakPositionR. Тот же вопрос, почему я должен смотреть на значение Hex.
ResultArray (3) выглядит некорректно, поскольку шестнадцатеричное значение 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);