请澄清一下,我使用的是V7R3M0。
我正在尝试调用Submit Debug Command(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)看起来是正确的。
由于RESULTTYPE的十六进制值为'02000000'X,因此我认为这是BreakR,因此resultArray(1)看起来正确。但是我期望转储中的值为2而不是33554432。有人可以告诉我为什么吗?我是在做错什么还是只是误解了它的显示方式?
resultArray(2)看起来正确,因为RESULTTYPE的十六进制值为'05000000'X,我认为这是BreakPositionR。关于为什么我必须查看十六进制值的问题相同。
由于RESULTTYPE的十六进制值为'05000000'X,因此resultArray(3)看起来不正确,并且手册显示我应该一直期待ExpressionTextR(7)。
对于字符串空间,我看不到任何类似IDX> 2的内容,该手册显示了我所期望的。
任何人都可以在我的通话或原型定义中看到我在做什么。
另外,有人可以解释为什么resultarray.count看起来像一个普通的int,而resultarray.recordtype仅在十六进制中才是正确的。我应该查看十六进制值吗?
任何想法都将不胜感激。
谢谢
Rob
更新: 在Mark的回复之后,我更改了程序以遵循Mark的建议,并且该方法正常工作。谢谢马克。
这就是我结束将代码更改为...
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);
答案 0 :(得分:0)
不确定结果数组条目的格式,但是关于此API的一件事是结果数组的长度可变,并且字符串条目紧随返回的结果数组之后。这意味着,除非在结果数组中确切获得4个条目,否则您将不会在字符串空间变量中得到字符串空间。请注意,如果在结果数组条目4 x'C9C4E740 6E40F200 00404040'
中转换十六进制代码,则将有一个空终止的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个具有偏移量和长度的零件条目之一。您应该可以使用类似以下内容的子字符串:
string = %subst(ReceiverData: resultEntry.offset: resultEntry.length);