所以我想从我的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来解决问题。
答案 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";