COBOL

2015-12-18 16 views
6

'da SQLite geri çağırma nasıl yazılır COBOL programlayıcım ve en son projem bir SQLite3 veritabanına bir COBOL uygulaması bağlamaktır.COBOL

Ben this guide takip etmekte ve onların çözüm benim COBOL uygulamasında gerekir tam olarak ne olduğunu. Veritabanını oluşturmayı, eklemeyi, veri eklemeyi ve veritabanını kapatmayı başarabildim ancak veri tabanından veri seçmeye çalıştığımda sorun ortaya çıkıyor.

Öğreticide, çift işaretli bir geri arama kullanırlar.

static int callback(void *NotUsed, int argc, char **argv, char **azColName){ 
    int i; 
    for(i=0; i<argc; i++){ 
     printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL"); 
    } 
    printf("\n"); 
    return 0; 
} 

WORKING-STORAGE SECTION. 
    *----------------------------------------------------------------* 

    01 sqlite3-db   pointer. 
    01 err_msg   pointer. 
    01 sqlite    pointer. 
    01 res    pointer. 

    01 notused   pointer. 
    01 argc    pic 99 comp-5. 
    01 argv    pointer. 
    01 azColName   pointer. 
    01 Writefunction-Ptr procedure-pointer. 

    procedure division. 
      set Writefunction-Ptr to entry "sqlite-callback". 

      *>Random code. 

      call "sqlite3_exec" using 
      by value sqlite3-db 
      by reference sqlQuery 
      by value Writefunction-Ptr 
      by value 0 
      by reference err_msg 
      returning rc 
      end-call 

      *>Random code. 

    stop run. 

    entry "sqlite-callback" using 
      by value notused 
      by value argc 
      by reference argv 
      by reference azColName. 

     display argc 

     goback. 
    Entry-Termination. 
o veritabanından döndürülen satır sayısı denir ve tamsayı argc sütun sayısı içerdiğinden arama çalışır

takip ediyor COBOL Çözümümün tablo içerir.

sorular geçerli: COBOL

Çift işaretçiler, nasıl temsil ettikleri nelerdir? Çözümümde bir işaretçi beyan ediyorum ve geri bildirimi "işaretçi" ile "referans olarak" arayın. COBOL'da çift işaretçiyi temsil etmenin doğru yolu olup olmadığını bilmiyor musunuz?

nasıl azColName ve argv içeriğini görüntülemek yoktur ve değil sadece bellek adresi işaretçi noktaları?

Şimdi OF ADRESİ kullanmaya çalıştı Hove, ama yine de işe almak istemezsin. Kaçırdığım bir şey olmalı.

WORKING-STORAGE SECTION. 
01 argv pointer. 

Linkage Section. 
01 link-area pic x. 

procedure division using link-area. 

*> RANDOM CODE 

    set address of link-area to argv 
    call "sqlite3_exec" using 
     by value sqlite3-db 
     by reference z"SELECT * FROM Cars" 
     by value Writefunction-Ptr 
     by value 0 
     by reference err_msg 
     returning rc 
     end-call 

*> RANDOM CODE 


entry "sqlite-callback" using 
    by value notused 
    by value argc 
    by reference argv 
    by reference azColName. 

    display argc. 

    if address of link-area not = null 
    display "Contents of new argv: " link-area 
    else 
    display "empty" 
    end-if 

    goback. 

Entry-Termination. 

alıyorum sonuç ise ifadesi her zaman yanlış olduğunu, bu nedenle dize "boş" görüntülenir: Şu anda benim çözüm gibi görünüyor. Fakat yine de argc, tablodaki sütun sayısına ayarlanır.

çalışma çözeltisi: Biz gerçekten kullandığınız derleyici bilmek gerekir

WORKING-STORAGE SECTION. 

    01 argv. 
     03 firstColumn pointer. 
     03 secondColumn pointer. 
     03 thirdColumn pointer. 

    01 azColName   pointer. 
    01 argc    pic 99 comp-5. 
    01 notused   pointer. 

    01 Writefunction-Ptr procedure-pointer. 

    *----------------------------------------------------------------- 
    Linkage Section. 

    01 Cars_Id  pic 9(2). 
    01 Cars_Name  pic X(20). 
    01 Cars_Price pic 9(10). 
    /----------------------------------------------------------------- 
    procedure division. 

    //code  

    set Writefunction-Ptr to entry "sqlite-callback". 

      initialize sqlQuery 
      move z"SELECT * FROM Cars;" to sqlQuery 


      call "sqlite3_exec" using 
      by value sqlite3-db 
      by reference sqlQuery 
      by value Writefunction-Ptr 
      by value 0 
      by reference err_msg 
      returning rc 
      end-call 

    //code 

    stop run. 



    entry "sqlite-callback" using 
      by value notused 
      by value argc 
      by reference argv 
      by reference azColName. 

     set address of Cars_Id to firstColumn 
     set address of Cars_Name to secondColumn 
     set address of Cars_Price to thirdColumn 


     display Cars_Id "|" Cars_Name "|" Cars_Price 

     goback. 
    Entry-Termination. 
+1

Hangi COBOL kullanıyorsunuz? LINKAGE SECTION olmadan derleme yapar mı? İmlecinizi, x'in LINKAGE SECTION bölümünde tanımlandığı ve istediğiniz boyut ve tür olduğu SET ADDRESS OF x işaretine bir göz atın. Bu, işaretçi tarafından işaret edilen verilere erişmenizi sağlar. –

+0

Marcus bir MicroFocus ServerExpress derleyicisi kullanıyor. – Anders

cevap

3

.

SET ifadeniz yanlış yerdeydi. argv yalnızca ENTRY çağrıldığında bir adrese sahiptir. Giriş çağrılmadan önce, ikili sıfır veya bazı öngörülemeyen çöpler olacaktır. Eğer GİRİŞ sonra hiç SET taşırsanız

, daha sonra LINK-ALANININ değerini kullanmak mümkün olmalıdır. argv hala bir adres olacak, ancak LINK-AREA (daha iyi bir isim verin, lütfen) bu adrese işaret edecek, böylece argv olarak tanımlanmalı ve LINK-AREA gerçek içeriği almak için kullanılabilir. argv.


veri ürünün adresi ile bir işaretçi geçmek derleyici kodu üretir BY REFERENCE kullanılmıştır.

PROCEDURE DIVISION USING veya ENTRY USING'da, öğe ayrıca REFERANS BY olmalıdır ve derleyici, LINKAGE SECTION tanımınızı iletilen adrese eşlemek için kod oluşturur.

Eğer BY CONTENT kullanırsanız bu benzer, ancak derleyici programınızın içinde verilerin bir kopyasını alır ve bir işaretçi yerine referanslar geçirir.PROSEDÜR KISMININ KULLANILMASINA VEYA TARAFINDAN KAYNAKLANAN GİRİŞİM'e. 10 ile birlikte, derleyici, gerçekte, standartta belirtilen veya standart derlemenizde, gerçek derleyicinizle sınırlı olmakla birlikte, gerçek değeri "geçirir". PROSEDÜR BÖLÜMÜ veya GİRİŞİNİN KULLANILMASI, BY VALUE değerini de belirtmelidir.

Tüm KULLANIMLARDA, REFERANS/İÇERİK/VALUE TARAFINDAN, tümünün aynı olması durumunda VE BY REFERENCE ile olmasını istiyorsanız, BY'yi belirtmeniz gerekmez, varsayılan değerdir.

POINTER (USAGE POINTER) iletirseniz, SET ADDRESS OF kullanarak işaret edilen verilere erişebilirsiniz. SET ADDRESS OF öğesinin LINKAGE SECTION içinde olması gerekir.

Ayrıca SET ADDRESS OF ile örtük bir işaretçi de kullanabilirsiniz. B ADRESİNİN AD ADRESİNİN ADRESİNİ AYARLAYIN, LINKAGE SECTION ile eşlenmiş olan adresin, programınızın DATA DIVISION (FILE SECTION dışındaki herhangi bir BÖLÜM) bölümünde yer alan bir öğenin b adresiyle değişecektir.

Eğer işaretçisi-name İÇİN doğru boyutu ve öğenin OF tipi ve kullanım ADRESİ sahip bir öğeyi tanımlayabilir, veri sivri-bir işaretçi tarafından görmek istiyorsanız

.

İŞARET tabii basit bir veri öğesi ya da bir veri öğesi (bir yapı) işaret olabilir.

LINKAGE SECTION konumundaki tüm öğelerin, referans alınmadan önce bir adresi olmalıdır. Bir USING'de bulunanlar derleyici tarafından adreslenebilir (ve derleyici doğru adres/öğelerin geçtiğini varsayar). Diğer tüm LINKAGE SECTION öğelerinin, ADDRESS OF tarafından ya da bir CALL'un KULLANILMASINDA ADRESİNİ geçirerek ve CALLED programın adresini ayarlayarak adreslenebilirliği olmalıdır.

+0

Çok teşekkür ederim. Geri arama şimdi çalışıyor. –