澄清一下,我上的是V7R3M0。
我试图调用Submit Debug命令(Submit Debug,QteSubmitDebugCommand) API,但没有得到预期的结果,否则我就无法正确理解结果。我试着按照这个例子来做一个page语句(在手册中的页面底部附近)。我期待类似的结果所显示的,但我没有得到相同的结果。
我的原型是:
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。
resultArray(3)看起来不正确,因为RESULTTYPE的十六进制值是'05000000'X,手册显示我应该期待一个ExpressionTextR (7)。
至于字符串空间,我没有看到任何类似于IDX >2的地方,手册显示这是我应该期待的。
有人能看到我在呼叫或原型定义中做错了什么吗?
另外,有人能解释为什么resultarray.count看起来像一个普通的int,但是resultarray.recordtype只在十六进制中看起来是正确的。我应该看看十六进制值吗?
任何想法都将不胜感激。
谢谢,
抢夺
更新:在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); 发布于 2018-12-18 22:02:52
对于结果数组条目的格式不太确定,但是这个API的一件事是结果数组是可变长度的,字符串条目紧跟在返回的结果数组后面。这意味着除非结果数组中有4个条目,否则字符串空间变量中的字符串空间不会结束。请注意,如果您转换结果数组条目4 x'C9C4E740 6E40F200 00404040'中的十六进制代码,则有一个以IDX > 2结尾的空终止的EBCDIC字符串。在第三个结果数组条目之后(因为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中看到了什么,似乎它应该是具有偏移量和长度的三个部分条目之一。您应该能够使用这样的方法将文本子串出来:
string = %subst(ReceiverData: resultEntry.offset: resultEntry.length);https://stackoverflow.com/questions/53838830
复制相似问题