Я изучаю COBOL только для удовольствия и теперь хочу вызвать функции C из моего источника COBOL (используя GnuCOBOL).Непечатаемый целочисленный указатель, возвращаемый в GNU COBOL из библиотеки C
Я могу вызывать функции 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. Есть ли очевидная ошибка новичков в моем коде здесь?
УФ для «кобола» и «просто для удовольствия» в том же предложении :) и более серьезно также для межязыкового общения, которые сложны. –
Проверьте представление памяти для PIC 9 (4). Прошло более 25 лет с тех пор, как я работал с COBOL, но IIRC PIC 9 (4) не хранится как int. Поэтому вы не можете назначать значения целому числу в C и ожидать, что он будет выглядеть ОК в COBOL. Может быть, конвертировать C-int в неисчерпаемую 4-байтную строку из ASCII-цифр? –
Вы получаете точно X'67 ', который является ASCII для' C '? Нет ведущих или конечных пробелов или чего-нибудь еще?В принципе, вы должны описывать свои данные в программе COBOL точно так же, как это определяет программа C. Такая же длина, тот же тип. Посмотрите на руководство пользователя GnuCOBOL от Gary Cutler для V2 (вы должны использовать V2, если вы этого еще не сделали) для доступных ИСПОЛЬЗОВАНИЙ. –