我有以下调用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-resultat,我用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.

更新:我试着删除两个“停止运行”,但现在由于某些原因,他减40而不是20,并打印“ER是EEN FOUT optereden”。所以他出于某种原因运行了两次COBOL程序。
更新:用GOBACK替换STOP RUN之后,它工作得很好

最佳答案

您的STOP RUN在这里返回,cob_STOP_RUN(rtd,return_status),因此调用COBOL程序后的先前代码不会运行。
如果EXIT程序在“main”程序中(至少在使用pragma的情况下,这似乎是您所拥有的),那么它被视为与STOP RUN相同。
戈巴克正在把控制权交还给你期望的地方。
如果您使用COBOL-IT API,正如已经建议的那样,那么退出程序的行为可能会有所不同。也许不是。
您使用的是一种未记录的方法来调用COBOL-IT程序。对于没有COBOL-it和与您相同的操作系统的人来说,它的行为方式是不知道的,也不可能知道的,并且有耐心以一种不明显的方式做某事。
如果你提出了一些建议却忽略了,那么很难继续回答你的问题。
再说一遍,你有任务。分配要求您使用API。你应该使用API并让你的程序正常工作。如果您稍后有时间,可以查看pragma用法以影响互操作性。

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

10-11 21:12