只是为了澄清,我在V7R3M0上。
我试图调用提交debug命令(qtesubmitdebugcommand)API,但没有回到我期望的结果,或者我不正确理解结果。我正在尝试按照示例进行断点语句(手册中页面底部附近)。我期望与显示的结果相似,但我没有得到相同的结果。
我的原型是:
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
未显示弦乐空间,但看起来确实正确
根据手册应该返回:
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)是正确的。
结果图(1)看起来很正确,因为结果类型的十六进制值为'02000000'x,我认为这是breakr。但是我期望垃圾场中的价值为2不是33554432。有人可以告诉我为什么这是吗?我是在做错事还是只是误解了它的显示方式。
结果图(2)看起来很正确,因为结果类型的十六进制值为'05000000'x,我认为这是breakpositionr。关于为什么我必须查看十六进制值的问题。
结果图(3)看起来不正确,因为结果类型的十六进制值为'05000000'x,并且我应该期望表达式Textr(7)的手册显示。
至于字符串空间,我看不到任何类似IDX> 2的内容,该手册显示我应该期望的。
任何人都可以看到我在电话中或原型定义中所做的错。
另外,有人可以解释为什么resultArray.count看起来像一个正常的int,而resultArray.recordType仅在十六进制中才看起来正确。我应该看十六进制值吗?
任何想法都将不胜感激。
谢谢,
Rob
更新:在马克的答复之后,我更改了遵循马克的建议的过程,并正确起作用。谢谢,马克。
这是我结束将代码更改为...
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);
对结果数组条目的格式不确定,但是有关此API的一件事是结果数组是可变长度,并且字符串条目立即遵循返回的结果数组。这意味着除非您在结果数组中完全获得4个条目,否则您将不会在字符串空间变量中获得字符串空间。请注意,如果您在结果数组输入4 x'C9C4E740 6E40F200 00404040'
中转换十六进制代码,则有一个null终止的EBCDIC字符串,说IDX > 2
。这是正确的位置,在第三个结果数组输入之后立即(因为API告诉您返回了3个条目)。API不知道您的RPG字段的格式,您实际上只是提供一个必须解释的缓冲区。
我通常使用基于的变量来解释诸如可变长度格式之类的内容。因此,在这种情况下,我将定义这样的内容:
dcl-ds resultEntry Qualified Based(pResultEntry);
type Uns(10) Pos(1);
count Uns(10) Pos(5);
offset Uns(10) Pos(5);
length Uns(10) Pos(9);
end-ds;
dcl-s pResultEntry Pointer;
注意resultEntry.count
和resultEntry.offset
互相覆盖,但如果条目是输入是一个偏移和长度的3型条目,则提供好名称,而不是仅计数的类型2条目。您可以以不同的方式定义此功能,但是关键是数据结构声明行上的Based
关键字。
要处理此操作,您可以做这样的事情:
pResultEntry = %addr(ReceiverData);
for ix = 1 to ReceiverData.entries;
pResultEntry += 12;
ProcessResultArrayEntry(resultEntry);
endfor;
,但是正如我之前所说的,我不确定您在结果数组条目3中所看到的3。看来,它应该是具有偏移和长度的3个部分条目之一。您应该能够使用类似的内容从文本中划出文本:
string = %subst(ReceiverData: resultEntry.offset: resultEntry.length);