2016-10-22 3 views
12

Я изучаю 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. Есть ли очевидная ошибка новичков в моем коде здесь?

+4

УФ для «кобола» и «просто для удовольствия» в том же предложении :) и более серьезно также для межязыкового общения, которые сложны. –

+1

Проверьте представление памяти для PIC 9 (4). Прошло более 25 лет с тех пор, как я работал с COBOL, но IIRC PIC 9 (4) не хранится как int. Поэтому вы не можете назначать значения целому числу в C и ожидать, что он будет выглядеть ОК в COBOL. Может быть, конвертировать C-int в неисчерпаемую 4-байтную строку из ASCII-цифр? –

+3

Вы получаете точно X'67 ', который является ASCII для' C '? Нет ведущих или конечных пробелов или чего-нибудь еще?В принципе, вы должны описывать свои данные в программе COBOL точно так же, как это определяет программа C. Такая же длина, тот же тип. Посмотрите на руководство пользователя GnuCOBOL от Gary Cutler для V2 (вы должны использовать V2, если вы этого еще не сделали) для доступных ИСПОЛЬЗОВАНИЙ. –

ответ

8

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

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

+2

Изменение PIC 9 (4) до BINARY-LONG разрешило его. Поскольку функция tdSensor никогда не возвращает ничего больше, чем 255, я переключился на BINARY-CHAR UNSIGNED. Спасибо! – Deps

1

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

TSI-ID 9999 comp 5. 

Comp 5 является двоичным представлением (попробуйте поиск Google для получения более подробной информации)

8

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

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

Попробуйте

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, который требует завершения области действия.

+0

Спасибо! Я так многому умудряюсь этими ответами и комментариями! :) – Deps

+1

@ Deps, тогда вам, вероятно, понравится, http://open-cobol.sourceforge.net/faq/index.html –

Смежные вопросы