首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取字符在排序序列中的位置

获取字符在排序序列中的位置
EN

Stack Overflow用户
提问于 2017-03-03 21:09:40
回答 1查看 271关注 0票数 0

我正在寻找一种将ASCII文本转换成十六进制数据的方法,我指的是你可以获得的十六进制数据

代码语言:javascript
复制
MOVE X'nn'  TO MYVAR.

然后我需要像一个数字一样使用它(我猜是COMP-3)。

我试着把PIC(X)移动到PIC S9(2)V COMP-3,但不像我想的那样工作.

由于我的问题被标记为不清楚,因此进一步解释:

首先,对不起,我在深夜提出了这个问题,现在我又开始阅读了,是的,还不清楚。

现在,真正的问题是,我想使用char (比如"A")作为十六进制的数字表示来使用它作为内部表的索引。

例如,在C语言中,这可能很容易,可以:

代码语言:javascript
复制
int mynum;
char mytext;

mynum = atoi(mytext);

然后使用mychar访问数组。因此,在COBOL中,我有:

代码语言:javascript
复制
01 MY-TABLE.
    05 MY-TABLE-ITEM  PIC X OCCURS 1000.

01 MY-TEXT  PIC X 100.
01 MY-TEXT-X PIC X OCCURS 100.

然后,我想迭代MY-TEXT-X并将其转换为十六进制代码,将其存储到一个数值变量(PIC 9(n))中,以便使用它访问MY-TABLE-ITEM,如下所示:

代码语言:javascript
复制
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 100
    PERFORM TRANSFORM-DATA

    DISPLAY MY-TABLE-ITEM(MY-NUMBER)
END-PERFORM

正如我所说的,我认为我可以将一个PIC X移动到一个PIC S9(2)V COMP-3,这样数值变量就可以得到这个值,但是它并不像我预期的那样工作……

编辑:

所以我发现我的编译器不支持内部函数,所以这对我没有帮助.

编辑添加的源代码

所以,这是我使用的源代码,也显示在编译器和执行程序中。

来源:

代码语言:javascript
复制
   IDENTIFICATION DIVISION.
   PROGRAM-ID.  likeatoi.
   DATA DIVISION.
   WORKING-STORAGE SECTION.
    01  the-char                            PIC X 
                                          VALUE "K".
    01  the-result                          PIC 999.
    01  the-other-result             PACKED-DECIMAL PIC 9(8) 
                                          VALUE ZERO.
    01  FILLER 
    REDEFINES the-other-result. 
       05  FILLER                          PIC X.
       05  char-to-convert                 PIC X.
    01 num pic 9(8).
   PROCEDURE DIVISION.
   MAINLINE.
  *    with instrinsic function
  *    MOVE FUNCTION ORD ( the-char ) 
  *                              TO the-result.
       DISPLAY 
           ">"
           the-char
           "<"
           ">"
           the-result
           "<".

  *    Old School
       MOVE  the-char               TO char-to-convert.
       DISPLAY 
           ">"
           the-char
           "<"
           ">"
           the-other-result
           "<".

       MOVE the-other-result       TO num.
       DISPLAY num.

       STOP RUN.

现在,我试过的细节如下:

  1. 首先,尝试用内部函数ORD编译它: ***** 1) 0384: E User-defined word expected instead of reserved word. (scan su
  2. 使用此编译,运行程序(忽略错误):

COBOL procedure error 211 at line 17 in ./ESCRITORIO/HEX/LIKEATOI.COB (/home/dohitb/Escritorio/HEX/likeatoi.COB) compiled 17/03/05 20:37:29.

  1. 注释函数部分,然后再次编译:

Errors: 0, Warnings: 1, Lines: 37 for program LIKEATOI.

(显示COMP变量的警告,可以)

  1. 再次执行(没有"num",仍然使用comp变量): >A<> < >A<>A<
  2. 添加"num“变量,将char改为"K”,并将COMP更改为填充十进制( HEX: 4B)。 >K<> < >K<>K< 04900000

所以,正如我所说的,这两种选择都不起作用。最精确的严格现在是使用包装十进制重新定义到PIC 9,但HEX的位置高于"A“,它提供了一个"9”,所以它仍然是无效的。

我想这可能是当地的事。

最终编辑

现在,我对原始源代码做了一个变体:

代码语言:javascript
复制
   IDENTIFICATION DIVISION.
   PROGRAM-ID.  likeatoi.
   DATA DIVISION.
   WORKING-STORAGE SECTION.
    01  the-char                                    PIC X 
                                          VALUE "K".
    01  the-result                                  PIC 999.
    01  the-other-result             BINARY         PIC 9(4) 
                                          VALUE ZERO.
    01  FILLER-1
    REDEFINES the-other-result. 
       05  FILLER                          PIC X.
       05  char-to-convert                 PIC X.

    01  the-comp-result              COMP           PIC 9(4)
                                          VALUE ZERO.
    01  FILLER-2
    REDEFINES the-comp-result. 
       05  FILLER                          PIC X.
       05  char-to-convert                 PIC X.

    01  the-packed-result            PACKED-DECIMAL PIC 9(4)
                                          VALUE ZERO.
    01  FILLER-3
    REDEFINES the-packed-result. 
       05  FILLER                          PIC X.
       05  char-to-convert                 PIC X.

    01 num                                 PIC 9(8).
    01 alfa                                PIC X(20)
       VALUE 'ABCDEFGHIJabcdefghij'.
    01 FILLER REDEFINES alfa.
        05 char                            PIC X OCCURS 20.
    01 w-index                             PIC 99 VALUE ZEROES.

   PROCEDURE DIVISION.
   MAINLINE.

       PERFORM VARYING w-index FROM 1 BY 1 UNTIL w-index > 20
           MOVE char(w-index)       TO the-char

  *        Variations of "Old School" code
           MOVE the-char            TO char-to-convert OF FILLER-1
           MOVE the-char            TO char-to-convert OF FILLER-2
           MOVE the-char            TO char-to-convert OF FILLER-3

           DISPLAY 
           ">"
           the-char
           "<"
           " with BINARY >"
           the-other-result
           "<"

           MOVE the-other-result       TO num
           DISPLAY "Numeric value: " num

           DISPLAY 
           ">"
           the-char
           "<"
           " with COMP >"
           the-comp-result
           "<"

           MOVE the-comp-result       TO num
           DISPLAY "Numeric value: " num

           DISPLAY 
           ">"
           the-char
           "<"
           " with PACKED >"
           the-packed-result
           "<"

           MOVE the-packed-result       TO num
           DISPLAY "Numeric value: " num
       END-PERFORM.

       STOP RUN.

而且,让我惊讶的是,它给了我这个输出

代码语言:javascript
复制
>A< with BINARY >A<

Numeric value: 00000065

>A< with COMP >A<

Numeric value: 00000100

(等等)所以现在看来它起作用了。是不是因为我第一次尝试的时候我是在处理05级变量?

看来现在一切都结束了!

谢谢你,比尔,你将在我的项目的问候一节中看到:)

最后是一个细节。

如果我“行动”

代码语言:javascript
复制
MOVE 'A'     TO CHAR

然后做所有二进制的事情,结果是不同的.举个例子。

VALUE,"D“是68,而MOVE是60.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-05 23:04:06

您一直在使用旧编译器。它符合COBOL 85标准,但不具有1989年对该标准的扩展的固有功能。

而且,它有一种我以前从未遇到过的非标准行为,这很难完全解释(不能访问那个编译器)。

在显示中使用>和<的目的是让您始终准确地知道每个输出字段的长度。你知道是空白的还是不可打印的字符。定义为COMP和二进制的字段的显示只显示一个字符,而不是四个数字数字,这些数字通常保存在两个字节的存储中(例如INT,但限制为9999)。

因此,我建议进行移动,然后将预期的结果定义为二进制和.当定义为COMP时,无法解释的结果。

COMP结果的一个解释可能是计算字段完全由编译器实现者来定义。因此,一个系统上的COMP可能不是与另一个系统上的COMP相同的字段类型(与COMP-1、COMP-2、COMP-3 etC相同)。这就是为什么1985年标准引入了新的名称(例如二进制和打包小数点),以便它们可以在COBOL编译器之间移植。

如果您被困在使用那个编译器,您是不幸的。如果您有可能使用另一个编译器,您可以在其他选择中找到开源GnuCOBOL (我是SourceForge.Net的GnuCOBOL项目讨论区域的主持人)。如果可以的话,可以使用不同的编译器。

这里有一个示例程序,它将在现代COBOL编译器上使用本征函数ORD和以前的一种方法(而且可能仍然是这样做)。注意,如果您的COMP字段是“小endian",则在重新定义下交换填充和字段的顺序。

代码语言:javascript
复制
   IDENTIFICATION DIVISION.
   PROGRAM-ID.  likeatoi.
   DATA DIVISION.
   WORKING-STORAGE SECTION.
   01  the-char                            PIC X 
                                              VALUE "A".
   01  the-result                          PIC 999.
   01  the-other-result             BINARY PIC 9(4) 
                                              VALUE ZERO.
   01  FILLER 
        REDEFINES the-other-result. 
       05  FILLER                          PIC X.
       05  char-to-convert                 PIC X.
   PROCEDURE DIVISION.
  *    with instrinsic function
       MOVE FUNCTION ORD ( the-char ) 
                                    TO the-result
       DISPLAY 
               ">"
               the-char
               "<"
               ">"
               the-result
               "<"

  *    Old School
       MOVE  the-char               TO char-to-convert
       DISPLAY 
               ">"
               the-char
               "<"
               ">"
               the-other-result
               "<"

       STOP RUN
       .

ORD很简单,它实际上与C中的atoi相同(假设这给了您在排序序列中的位置)。

在第二种情况下,由于COBOL传统上不能有单字节二进制,所以使用重新定义的方法可以在两个字节二进制的低阶部分获得一个字符,因此整个二进制字段表示该字符的表示的“数字值”。

上述产出如下:

代码语言:javascript
复制
>A<>066<
>A<>0065<

请注意,ORD给出了排序序列中的位置(二进制零与ORD将返回1),而第二个只给出直接表示(二进制零将给出零)。

如果您只对可打印字符感兴趣,那么在使用这两个值之后,您可能想要“重基”。

注意,我感到困惑的是,您有一个编译器,它支持内联执行,但不支持内部函数。如果拒绝使用二进制文件,则使用COMP代替。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42588468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档