Ответ 1
Если вы вернете int
, вы можете напрямую проверить переменную RETURN-CODE
и не нужно вообще использовать предложение RETURNING
.
Если вы хотите использовать его: a int
соответствует retvar USAGE BINARY-LONG
.
Я изучаю 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. Есть ли очевидная ошибка новичка в моем коде здесь?
Если вы вернете int
, вы можете напрямую проверить переменную RETURN-CODE
и не нужно вообще использовать предложение RETURNING
.
Если вы хотите использовать его: a int
соответствует retvar USAGE BINARY-LONG
.
Несколько пояснений по другим комментариям и ответам.
Как уже говорилось, вы смешиваете 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
, который требует завершения области действия.
Просто случайная мысль, но попробуйте использовать comp 5 для поля int. Im ржавый по точному синтаксису, но он похож на это:
TSI-ID 9999 comp 5.
Comp 5 - двоичное представление (попробуйте найти более подробную информацию в google)