abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 04:33 | Nová verze

    Open source software pro úpravu digitálních fotografií LightZone (Wikipedie) byl vydán v nové verzi 5.0.0. LightZone je dnes k dispozici pod licencí BSD. Původně se jednalo o proprietární software vyvíjený společností Light Crafts. Ta v prosinci 2012 souhlasila s uvolněním zdrojových kódů jako open source [Wayback Machine].

    Ladislav Hagara | Komentářů: 0
    včera 17:22 | Nová verze

    Byla vydána verze 0.84 telnet a ssh klienta PuTTY (Wikipedie). Podrobnosti v přehledu nových vlastností a oprav chyb a Change Logu.

    Ladislav Hagara | Komentářů: 0
    22.5. 19:44 | IT novinky

    Microsoft představil Azure Linux 4.0 a Azure Container Linux. Na konferenci Open Source Summit North America 2026 organizované konsorciem Linux Foundation a sponzorované také Microsoftem. Azure Linux 4.0 vychází z Fedora Linuxu. Azure Container Linux je založen na projektu Flatcar. Azure Linux (GitHub, Wikipedie) byl původně znám jako CBL-Mariner.

    Ladislav Hagara | Komentářů: 0
    22.5. 12:22 | Zajímavý článek

    Nové číslo časopisu Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 165 (pdf).

    Ladislav Hagara | Komentářů: 0
    22.5. 10:55 | Nová verze

    Byla vydána verze 9.2 open source virtualizační platformy Proxmox VE (Proxmox Virtual Environment, Wikipedie) založené na Debianu. Přehled novinek v poznámkách k vydání a informačním videu.

    Ladislav Hagara | Komentářů: 5
    22.5. 09:33 | IT novinky

    Firefox 151 podporuje Web Serial API. Pro komunikaci s různými mikrokontroléry připojenými přes USB nebo sériové porty už není nutné spouštět Chrome nebo na Chromiu postavené webové prohlížeče.

    Ladislav Hagara | Komentářů: 8
    22.5. 04:44 | Nová verze

    Byla vydána nová stabilní verze 8.0 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 148. Přehled novinek i s náhledy v příspěvku na blogu.

    Ladislav Hagara | Komentářů: 0
    21.5. 21:33 | Bezpečnostní upozornění

    Ve FreeBSD byla nalezena a opravena zranitelnost FatGid aneb CVE-2026-45250. Jedná se o lokální eskalaci práv. Neprivilegovaný uživatel se může stát rootem.

    Ladislav Hagara | Komentářů: 0
    21.5. 14:33 | IT novinky

    Společnost Flipper Devices oznámila Flipper One. Zcela nový Flipper postavený od nuly. Jedná se o open-source linuxovou platformu založenou na čipu Rockchip RK3576. Hledají se dobrovolníci pro pomoc s dokončením vývoje (ovladače, testování, tvorba modulů).

    Ladislav Hagara | Komentářů: 2
    21.5. 14:00 | Nová verze

    Vývojáři Wine oznámili vydání verze 2.0 knihovny vkd3d pro překlad volání Direct3D na Vulkan. Přehled novinek na GitLabu.

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (12%)
     (8%)
     (2%)
     (14%)
     (31%)
     (4%)
     (6%)
     (3%)
     (16%)
     (26%)
    Celkem 1695 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    Rozcestník

    Interface mezi C++ a F77

    6.3.2008 10:35 | Přečteno: 1220× | Výběrový blog | poslední úprava: 10.6.2008 17:33

    Jednoduchy příklad interface mezi C++ a f77

    Minulý víkend jsem za po dlouhé době potřeboval udělat interface mezi kódem ve fortranu a kódem v C++. Jelikož jsem to již dlouho nedělal, chvíli mi trvalo, než jsem si vzpomněl, jak to udělat (neměl jsem přístup na net; při této příležitosti jsem si zas uvědomil, že bez netu jsem jako bez ruky :-( - tedy co se programování týče). Poté, co se mi to zadařilo, jsem se rozhodnul udělat si jednoduchý prográmek pro přístě, až zas budu bez netu a budu vzpomínat, jak se to dělá. Vše níže uvedené platí pro kompilátor gcc.

    Volání fortranovské rutiny z C++ je vcelku jednoduché, stačí funkci deklarovat jako externí, název je stejný jako ve fortranu, ale přídáme podtržítko. Případný parameter předáme pomocí jeho adresy:

    extern "C" {void vypisparam_(int* cislo);}
    ...
    vypisparam_(&mojeCislo);
    

    Obvykle ale potřebujeme víc. Velmi často je potřeba nějak přistupovat k proměnným ve fortranovských common blocích. Mějme následně definovaný common blok a jednoduchý fotranovský prográmek:
    test.inc:

           DOUBLE PRECISION dp1,dp2
           INTEGER int1
           COMMON/MYTEST/dp1,dp2,int1
    
    test.f:
          PROGRAM TEST
          INCLUDE 'test.inc'
          CALL NASTAV
          CALL VYPIS
          CALL VYPISPARAM(20)
          CALL VYPIS
          END
    
          SUBROUTINE NASTAV
          INCLUDE 'test.inc'
          PRINT*,'Rutina Nastav - nastavuji parametry'
          dp1 = 1.D0
          dp2 = 3.5D0
          int1 = 10
          END
    
          SUBROUTINE VYPIS
          INCLUDE 'test.inc'
          PRINT*,"Rutina Vypis:"
          PRINT*,'dp1 = ',dp1
          PRINT*,'dp2 = ',dp2
          PRINT*,'int1 = ',int1
          END
    
          SUBROUTINE VYPISPARAM(a)
          INCLUDE 'test.inc'
          INTEGER a
          dp1 = a
          dp2 = a
          int1 = a
          PRINT*,'Rutina VypisParam:'
          PRINT*,'a=',a
          END
    
    Common blok bude v C++ reprezentovat struktura. Proměnné v common bloku jsou uloženy v paměti za sebou. Inicializace tedy probíhá tak, že se ukazateli na strukturu v C++ předá adresa první proměnné common bloku z fortranu. Je proto nutné, aby proměnné ve struktuře byly stejného typu a ve stejném pořadí jako ve fortranu (pro vícerozměrná pole pak ješte je nutno dát pozor indexy). O vrácení adresy common bloku se nám postará jednoduchá fortranovská funkce:
          FUNCTION common_block_address(common_block_name)
          INCLUDE 'test.inc'
          CHARACTER*(*) common_block_name
          INTEGER common_block_address
          INTEGER aaadress
          IF(common_block_name.EQ.'MYTEST')THEN
             common_block_address = adress(dp1)
          ELSE
             PRINT*,'Neexistujici common block'
          ENDIF
          RETURN
          END
    
    Jednoduchý prográmek v C++, který volá rutiny fortranovského kódu a pracuje s proměnnými v common bloku, by mohl vypadat takto (v C++ by tedy bylo vhodnejší, abychom byli objektoví:-), vytvořit objekt, který by reprezentoval fortanovský kód):
    #include <iostream>
    
    double loc_dp1,loc_dp2;
    int loc_int1;
    
    
    struct MyTest_t{
      double dp1,dp2;
      int int1;
    };
    
    extern "C" {
      void nastav_();
      void vypis_();
      void vypisparam_(int* cislo);
    }
    
    extern "C" void* adress_(void* var){
      return var;
    }
    
    extern "C" void* common_block_address_(char*,int len);
    
    MyTest_t* fMyTest;
    void InitCommonBlock(){
      fMyTest = (MyTest_t*)common_block_address_("MYTEST",6);
    }
    
    void LocalParToFor(){
        fMyTest->dp1 = loc_dp1;
        fMyTest->dp2 = loc_dp2;
        fMyTest->int1 = loc_int1;
    }
    
    void ForToLocalPar(){
        loc_dp1 = fMyTest->dp1;
        loc_dp2 = fMyTest->dp2;
        loc_int1 = fMyTest->int1;
    }
    
    int main(){
      int aaa = 100;
      InitCommonBlock();
      nastav_();
      vypis_();
      ForToLocalPar();
      std::cout << "loc_dp1 je " << loc_dp1 << std::endl;
      std::cout << "loc_dp2 je " << loc_dp2 << std::endl;
      std::cout << "loc_int1 je " << loc_int1 << std::endl;
      vypisparam_(&aaa);
      loc_dp1 = 4.5;
      loc_dp2 = 8.3;
      loc_int1 = 15;
      LocalParToFor();
      vypis_();
      return 0;
    }
    
    Vše kompilujeme pomocí g++ a poté slikujeme dohromady společně s knihovnou gfortan, u mě např. takto:
    g++ common_block_address.o interface.o test.o -L/usr/lib/gcc/i386-redhat-linux/4.3.0/ -lgfortran        

    Hodnocení: 100 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    6.3.2008 11:14 anicka | blog: ze_zivota
    Rozbalit Rozbalit vše Re: Interface mezi C++ a F77
    Hezky clanek a pekne osklive dejavu. Staci nad clankem jen trochu privrit oci a predstavim si zdrojaky octave... :-)
    ^D
    6.3.2008 13:55 Let_Me_Be | skóre: 20 | blog: cat /proc/idea/current | Brno
    Rozbalit Rozbalit vše Re: Interface mezi C++ a F77
    Sice nechapu co to dela ve vyberu, ale jinak dobry zapisek.
    Linked in profil - Můj web - Nemůžete vyhrát hádku s blbcem. Nejdřív vás stáhne na svoji úroveň a pak ubije zkušenostmi.
    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.