2016-11-02 42 views
5

anabilgisayar üzerinde C ile yazılmış bir satıcı paket üzerinde> COBOL Interlanguage iletişim işlevselliğini kullanıcı çıkışından var bir kısmını geçersiz kılmak için bir seçenek sunar. sağlanan C fonksiyonu prototipidir:C - ana bilgisayar

extern int SomeExit (void * Parameters, 
        void * Record1, 
        void * Record2, 
        char ComparisonType, 
        char * RankString, 
        void * NotUsed1, 
        int * NotUsed2) 

öncelikle bir COBOL dükkanı I (a DLL olarak) Enterprise COBOL 4.2 programını tanımlanır olarak IBM ILC kılavuzunda verilen kuralları takip çalışırken çıkış uygulamak için (https://www.ibm.com/support/knowledgecenter/en/SSLTBW_1.13.0/com.ibm.zos.r13.ceea400/clcccb5.htm#clcccb5) ve bu eski PAYLAŞIM sunumundaki örnekler: http://www-01.ibm.com/support/docview.wss?uid=swg27003846&aid=1 ancak sonuçta ortaya çıkan program çıkış olarak ve benim DISPLAY iletimden önce çağrılıyor. Benim varsayımım, alıcı veri yapılarını doğru şekilde beyan etmemem. Aşağıda, mevcut test kodumun bir pasajı var (adlandırma kurallarımı görmezden geliyorum - bu, aramayı kanıtlamak için bir prototiptir ve temel arama çalışmasına sahip olduğumda şirket içi standartlarımıza yeniden yazılır).

IDENTIFICATION DIVISION. 
PROGRAM-ID. "SomeExit". 
... 
LINKAGE SECTION.            
01 WS-PARAMETERS-POINTER  USAGE IS POINTER SYNCHRONIZED. 
01 SORT-PASS-RECORD1-POINTER USAGE IS POINTER SYNCHRONIZED. 
01 SORT-PASS-RECORD2-POINTER USAGE IS POINTER SYNCHRONIZED. 
01 WS-COMPARISION-TYPE   PIC X. 
01 WS-RANK-STRING-POINTER  USAGE IS POINTER SYNCHRONIZED. 
01 WS-NOT-USED1-POINTER  USAGE IS POINTER SYNCHRONIZED. 
01 WS-NOT-USED2-POINTER  USAGE IS POINTER SYNCHRONIZED. 
01 WS-RETURN     PIC S9(9) USAGE IS BINARY. 
... 
PROCEDURE DIVISION USING BY VALUE WS-PARAMETERS-POINTER  
        SORT-PASS-RECORD1-POINTER   
        SORT-PASS-RECORD2-POINTER   
        WS-COMPARISION-TYPE     
        WS-RANK-STRING-POINTER    
        WS-NOT-USED1-POINTER    
        WS-NOT-USED2-POINTER    
       RETURNING WS-RETURN.      

DISPLAY 'IN EXIT'. 
... 
MOVE 0 TO WS-RETURN. 
GOBACK. 

olağandışı sonlanma geçerli:

CEE3250C The system or user abend U 016 R=00000000 was issued.              
    From entry point main at compile unit offset +00000192 at entry offset +00000192 at address 28500ECA.  

satıcı kodu dinamik olarak DLL çağırır. DLL'yi sildiğimde, çıkışın bulunamadığını bildiren bir ileti alıyorum ve bu yüzden C kodu onu çağırmaya çalışıyor gibi görünüyor.

Ben, BY VALUE bırakarak (bu varsayılan anlamak rağmen) BY REFERENCE kullanarak ve gerçek yapısı tanımlarla POINTERs değiştirilmesi dahil PROCEDURE DIVISION USING çeşitlemelerini çalıştılar. COBOL rutinine aktarılan parametreleri nasıl yapılandıracağımı el kitabını yanlış anlamış mıyım?

Düzenleme: satıcı ile açık bir destek bileti var ama onlar henüz kullanışlı bir şey ile vermiş değil.

Teşekkür David Ben Bono öneri başına çağıran yapısının daha iyi anlaşılması dayalı bir çözüm belirlemek başardı yorumlarına

+1

Hangi abend? Hangi programda yer değiştirme? Neden her şey için DEĞERLE ', ben sadece karşılaştırma türü için düşünürdüm, diğerleri REFERANS BY? Bunun ne olduğunun farkında mısın? "SYNCHRONIZED" öğesini unutun. Neden LINKAGE SECTION öğeleriniz için WS-öneki? Kesinlikle WS-RETURN'u GOBACK'den önce bir şeye ayarlamalısınız. Enterprise COBOL'un hangi sürümü? C'den gelen çağrı DLL'den mi geliyor? Satıcıya sordunuz (lisansı destek içerir). –

+2

Bir saatte 23 görünüm ve iki upvotes. Bu bir Vay canına! bir COBOL sorusu için. Muhtemelen COBOL'lu insanlardan daha fazla C ve Mainframe'den daha fazla Mainframe olmamalıdır :-) –

+0

'PROGRAM-ID' nedir? Çıkış statik olarak bağlantılı mı, yoksa satıcı-rutininiz mi? –

cevap

4

teşekkürler.

extern int SomeExit (void * Parameters, 
        void * Record1, 
        void * Record2, 
        char ComparisonType, 
        char * RankString, 
        void * NotUsed1, 
        int * NotUsed2) 

çözüm: Bu C prototipi Verilen Kullanıcı çıkışında Bunlarla birlikte

IDENTIFICATION DIVISION.  
PROGRAM-ID. "SomeExit". 
... 
LINKAGE SECTION.  
01 WS-PARAMETERS  PIC X(10).  
01 SORT-PASS-RECORD1 PIC X(50).  
01 SORT-PASS-RECORD2 PIC X(50).  
01 WS-COMPARISON-TYPE PIC X. 
01 WS-RANK-STRING  PIC X(6).     
01 WS-NOT-USED1   PIC X.      
01 WS-NOT-USED2   PIC X.      
01 WS-RETURN   PIC S9(9) USAGE IS BINARY. 
... 
PROCEDURE DIVISION USING      
     BY REFERENCE WS-PARAMETERS  
     BY REFERENCE SORT-PASS-RECORD1 
     BY REFERENCE SORT-PASS-RECORD2 
     BY VALUE  WS-COMPARISON-TYPE 
     BY REFERENCE WS-RANK-STRING  
     BY REFERENCE WS-NOT-USED1   
     BY REFERENCE WS-NOT-USED2   
      RETURNING WS-RETURN.   
    DISPLAY 'IN EXIT'. 
    ... 
    MOVE 0 TO WS-RETURN. 
    GOBACK. 

başarıyla denilen ve satıcı mantığına bir değer döndürdü. RENT, TRUNC(BIN), DLL,EXPORTALL derlemesi için ve DYNAM(DLL),RENT'u bağlamak için aşağıdaki parametreleri kullandım. Uygulamam için gerekli değil, ancak çağrı yapan program yukarıdaki örnek çözümde kullanılan çağrılan programda bir karma durum rutin adı bekliyorsa, o zaman PGMNAME(LONGMIXED) da gerekli olacaktır.

Tüm yorumcular bana doğru yönde işaret ettikleri için teşekkür ederiz.

+1

Çözümü gönderdiğiniz için teşekkür ederiz. Daha önce farketmedim. Parametreleri kullanarak orada kodunuz varsa, bir yerlere clobberlenmiş olursunuz. DISPLAY'den çıktı almadınız mı (SYSOUT DD değil mi?)? Veya derleme/linkedit/binder seçenekleri abend'i düzeltti mi? Her neyse, iyi iş. –

+0

Cevabınızı "benim için çalışıyor" olarak işaretlemenizi öneririm ;-) –

+1

@BillWoodger evet ... parametrelerini okuyan (ancak bunları güncellemeyen) mantığa atıfta bulunduğum sorunla alakalı değil. Değişikliği yapana kadar ekran ifadesine ulaşmıyordu. –