gpt4 book ai didi

c - 执行外部函数后 printf 不工作

转载 作者:太空宇宙 更新时间:2023-11-04 04:45:58 24 4
gpt4 key购买 nike

我有以下调用 cobol 程序的 c 代码:

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

extern void VERKOOP(char *productid, char *aantal, char*resultaat);

main(int argc, char *argv[])
{
int return_status;
COB_RTD = cob_get_rtd();
char *productid = "20 ";
char *aantal = "000020";
char resultaat[30];
cob_init(rtd, 0, NULL);
printf("hallo");//prints
VERKOOP(productid, aantal, resultaat);
printf("hallo");//doesn't print
printf("resultaat:%s", resultaat);// doesn't print
cob_stop_run (rtd, return_status);
}

我正在使用 printf 查看是否正确分配了 resultaat。但是,由于某种原因,VERKOOP 之后的两行都没有打印出来。

这是 VERKOOP 的 COBOL 代码(他在这里正确填写了 LS-RESULTAAT,我用 DISPLAY 试了一下,这部分有效):

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

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT PRODUCTEN ASSIGN TO "BESTANDEN/LIJSTPRODUCTEN"
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.
77 WS-RESULTAAT PIC X(30).
LINKAGE SECTION.
01 LS-PRODUCTID PIC X(6).
01 LS-AANTAL PIC 9(6).
01 LS-RESULTAAT PIC X(30).
PROCEDURE DIVISION USING LS-PRODUCTID, LS-AANTAL, LS-RESULTAAT.

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

INITIALISEER.
OPEN I-O PRODUCTEN.
* DISPLAY WS-FILE-STATUS..

LEES-PRODUCT-IN.
MOVE LS-PRODUCTID TO WS-PRODUCTID
MOVE LS-AANTAL TO WS-AANTAL
MOVE 'OK' TO WS-RESULTAAT
* DISPLAY WS-RESULTAAT
MOVE WS-RESULTAAT TO LS-RESULTAAT.
* 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
* DISPLAY WS-FILE-STATUS
READ PRODUCTEN INVALID KEY SET PRODUCT-NIET-GEVONDEN TO TRUE
END-READ
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.

更新:我尝试删除两个“STOP RUN's”,但现在出于某种原因他减去 40 而不是 20 并打印“ER IS EEN FOUT OPGETREDEN”。所以他出于某种原因两次运行 COBOL 程序。

更新:将 STOP RUN 替换为 GOBACK 后,它可以完美运行

最佳答案

您的 STOP RUN 正在返回此处,cob_stop_run (rtd, return_status),因此调用 COBOL 程序后您之前的代码不会运行。

如果 EXIT PROGRAM 在“主”程序中(至少在 pragma-usage 的情况下,它似乎就是您所拥有的),那么它被视为与 STOP RUN 相同。

GOBACK 正在将控制权返回到您期望的位置。

如果您使用 COBOL-IT API,正如已经建议的那样,那么 EXIT PROGRAM 的行为可能会有所不同。也许不是。

您正在使用未记录的方式调用 COBOL-IT 程序。对于没有 COBOL-IT 和与您拥有相同操作系统并且有耐心以非显而易见的方式做某事的人来说,它的确切行为方式是未知的,也不可能知道。

如果建议的内容随后被您忽略,则很难继续回答您的问题。

同样,您有一个作业。作业要求您使用 API。您应该使用 API 并让您的程序运行。如果以后有时间,可以查看 pragma-usage 来影响互操作性。

关于c - 执行外部函数后 printf 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20906582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com