Непечатаемый целочисленный указатель возвращается в GNU COBOL из библиотеки C

Я изучаю COBOL только для удовольствия и теперь хочу вызвать функции C из моего источника COBOL (используя GnuCOBOL).

Я могу просто вызвать функции C, однако у меня есть небольшая проблема с моей моей функцией, которая выглядит так: (Она просто обертывает еще одну функцию теми же аргументами, пока)

int getSensors( char * protocol, int protocolLen,
            char * model, int modelLen,
            int * id, int * dataTypes ) {
    return tdSensor(protocol, protocolLen, model, modelLen, id, dataTypes );
}

Моя проблема в том, что значение, возвращаемое в переменной id, впоследствии не печатается в COBOL (TSI-ID ниже). Например, возвращаемое значение может быть 67, и если я напечатаю переменную в COBOL, я получаю символ ascii 'C' вместо ожидаемого значения 0067.

Запись COBOL выглядит следующим образом:

   01 TELLSTICK-SENSOR-ITER.
       05 TSI-PROTOCOL     PIC X(50).
       05 TSI-MODEL        PIC X(50).
       05 TSI-ID           PIC 9(4).
       05 TSI-DATATYPES    PIC 9(4).
       05 TSI-RETURN       PIC S9(4).

И мой вызов выглядит следующим образом:

       CALL "getSensors" USING
           BY REFERENCE TSI-PROTOCOL BY VALUE 50
           BY REFERENCE TSI-MODEL BY VALUE 50
           BY REFERENCE TSI-ID
           BY REFERENCE TSI-DATATYPES
           RETURNING TSI-RETURN.

Я новичок в COBOL, и мои навыки C довольно ржавые, поскольку я обычно работаю на Java. Есть ли очевидная ошибка новичка в моем коде здесь?

Ответ 1

Если вы вернете int, вы можете напрямую проверить переменную RETURN-CODE и не нужно вообще использовать предложение RETURNING.

Если вы хотите использовать его: a int соответствует retvar USAGE BINARY-LONG.

Ответ 2

Несколько пояснений по другим комментариям и ответам.

Как уже говорилось, вы смешиваете COBOL USAGE DISPLAY с полями данных USAGE BINARY.

Try

01 TELLSTICK-SENSOR-ITER.                                           
       05 TSI-PROTOCOL     PIC X(50).                               
       05 TSI-MODEL        PIC X(50).                               
       05 TSI-ID           USAGE BINARY-LONG.                       
       05 TSI-DATATYPES    USAGE BINARY-LONG.                       
       05 TSI-RETURN       USAGE BINARY-LONG.                       

и чтобы избежать небольшой дублирующей магической нумерации, измените значение CALL на

CALL "getSensors" USING                                             
    BY REFERENCE TSI-PROTOCOL BY VALUE LENGTH OF TSI-PROTOCOL       
    BY REFERENCE TSI-MODEL BY VALUE LENGTH OF TSI-MODEL             
    BY REFERENCE TSI-ID                                             
    BY REFERENCE TSI-DATATYPES                                      
    RETURNING TSI-RETURN

Я также удалял завершающий период в операторе вызова только потому, что; если вы когда-либо перемещаете этот код внутри блока IF, вам не придется беспокоиться о завершении полной остановки. Используйте END-CALL, если хотите, но это действительно необходимо, если у вас есть блок условного кода ON EXCEPTION, который требует завершения области действия.

Ответ 3

Просто случайная мысль, но попробуйте использовать comp 5 для поля int. Im ржавый по точному синтаксису, но он похож на это:

TSI-ID 9999 comp 5.

Comp 5 - двоичное представление (попробуйте найти более подробную информацию в google)