我有一个外部COBOL-IT功能,我想从我的C程序调用。得到错误“ERRORC2065:'productid':未声明的标识符

时间:2013-12-28 22:29:15

标签: c cobol arrays

所以我想从我的C程序调用外部COBOL-IT功能。目前我一直收到错误“ERRORC2065:'productid':未声明的标识符。同样适用于”aantal“。我的C有点生疏,因为我有一段时间没有使用它所以如果有人能帮助我,那么如果我放弃“&”它也行不通。

#include <stdio.h>
#include "libcob.h"
//#pragma linkage (verkoop, COBOL)

extern void verkoop(char *productid, char aantal*);

int main(int argc, char *argv[])
{
    COB_RTD = cob_get_rtd();
    cob_init(rtd, 0, NULL);
    char productid[6] = "000020";
    char aantal[6] = "000200";
    printf("Hello world");  
    verkoop(&productid, &aantal);
    return 0;
}

这是我感兴趣的人的verkoop函数:

*************************************************************
* VERKOOP  
*************************************************************
       IDENTIFICATION DIVISION.
       PROGRAM-ID. VERKOOP.

       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
       SELECT PRODUCTEN ASSIGN TO "BESTANDEN/PRODUCTEN"
           ACCESS MODE IS RANDOM
           ORGANIZATION IS INDEXED
           RECORD KEY IS PRODUCTID
           FILE STATUS IS WS-FILE-STATUS.

       DATA DIVISION.
       FILE SECTION.
       FD  PRODUCTEN BLOCK CONTAINS 10 RECORDS.
       01  PRODUCT.
           02 PRODUCTID PIC X(6).
           02 LEVERANCIERID PIC X(6).
           02 AANTAL PIC 9(6).
       WORKING-STORAGE SECTION.
       77  FOUT PIC X.
           88 PRODUCT-NIET-GEVONDEN VALUE 1.
       77 WS-PRODUCTID PIC X(6).
       77 WS-AANTAL PIC 9(6).
       77 WS-FILE-STATUS PIC XX.
       LINKAGE SECTION.
       01 LS-PRODUCTID PIC X(6).
       01 LS-AANTAL PIC 9(6).
       PROCEDURE DIVISION USING LS-PRODUCTID, LS-AANTAL.

       MAIN.
           PERFORM INITIALISEER
           PERFORM LEES-PRODUCT-IN
           PERFORM LEES-BESTAND
           PERFORM SLUIT-BESTAND
           STOP RUN.

       INITIALISEER.
           MOVE ZEROS TO PRODUCT
           OPEN I-O PRODUCTEN.
*          DISPLAY WS-FILE-STATUS..

       LEES-PRODUCT-IN.
           MOVE LS-PRODUCTID TO WS-PRODUCTID
           MOVE LS-AANTAL TO WS-AANTAL.
*          DISPLAY "GEEF PRODUCTID OP: "
*          ACCEPT WS-PRODUCTID
*          DISPLAY "GEEF AANTAL OP: "
*          ACCEPT WS-AANTAL.

       LEES-BESTAND.
*      DISPLAY "LEES-BESTAND"
       MOVE WS-PRODUCTID TO PRODUCTID
*      DISPLAY PRODUCTID
       READ PRODUCTEN INVALID KEY SET PRODUCT-NIET-GEVONDEN TO TRUE
       END-READ   
       DISPLAY "END-READ" WS-FILE-STATUS    
       IF PRODUCT-NIET-GEVONDEN PERFORM FOUTJE    
       ELSE 
       MOVE WS-PRODUCTID TO PRODUCTID
       SUBTRACT WS-AANTAL FROM AANTAL   
       PERFORM UPDATE-PRODUCT
       END-IF.


      UPDATE-PRODUCT.
        REWRITE PRODUCT INVALID KEY PERFORM FOUTJE.

        SLUIT-BESTAND.
*       DISPLAY "SLUIT-BESTAND"
           CLOSE PRODUCTEN.

        FOUTJE.
           DISPLAY "ER IS EEN FOUT OPGETREDEN"
*          DISPLAY WS-FILE-STATUS
           STOP RUN.

更新:我通过在代码的第一行声明productid和aantal来解决问题。

3 个答案:

答案 0 :(得分:3)

1)您的常量字符数组太小,无法保存空终止的初始字符串的值。

2)同样,你的功能声明也不正确。

extern void verkoop(char *productid, char aantal*);

应该是

extern void verkoop(char *productid, char *aantal);

(提示:看看'*'是否为aantal);

3)使用无效参数调用该函数。函数调用应该是

verkoop(productid, aantal);

您能分享一下您正在使用的编译器的更多信息吗?

答案 1 :(得分:1)

以下是“入门手册”中的示例C程序:

/* hello.c */
#include <libcob.h>
extern int say(char *hello, char *world);
int main()
{
COB_RTD = cob_get_rtd();
int ret;
int return_status;
char hello[7] = "Hello ";
char world[7] = "World!";
cob_init(rtd, 0, NULL);
ret = say(hello, world);
cob_stop_run (rtd, return_status);
return ret;
}

这显示了一种从C语言中运用COBOL-IT API的简单方法。

请注意,COBOL没有“字符串”。 COBOL中的六字节字段占用六个字节,并且不会被“null”或其他任何内容终止。

可以在COBOL程序中修改“通过引用”传递给COBOL程序的数据。程序员应该确保不应该这样做。

答案 2 :(得分:0)

您必须有其他编译错误。您对productid和aantal的声明不正确。

char productid[6] = "000020";
char aantal[6]    = "000200";

用VC ++编译显示,错误C2117:'productid':数组边界溢出

它们是一个短字节,用于字符串文字中的空终止。为什么不这样做:

char *productid = "000020";
char *aantal = "000200";