Dle plánu dnes ve 13:00 proběhne veřejný test eDokladů. Jeho cílem je ověřit připravenost aplikace a související infrastruktury na vysokou souběžnou zátěž před podzimními komunálními volbami.
Byla vydána nová verze 3.47 frameworku Flutter (Wikipedie) pro vývoj mobilních, webových i desktopových aplikací a nová verze 3.13 souvisejícího programovacího jazyka Dart (Wikipedie).
Byla vydána nová verze 26.1 linuxové distribuce Manjaro (Wikipedie). Její kódové jméno je Bian-May. Ke stažení je v edicích GNOME, KDE PLASMA a XFCE.
Na akci Made by Google 2026 (YouTube) byla oficiálně představena jedenáctá generace telefonů Pixel s novým čipem Google Tensor G6 a hodinky Pixel Watch 5.
Národní úřad pro kybernetickou a informační bezpečnost (NÚKIB) se spolu s partnery z dalších zemí připojil ke společnému upozornění (Joint Cybersecurity Advisory) týkajícímu se probíhající kybernetické kampaně skupiny LAUNDRY BEAR zaměřené na uživatele e-mailové platformy Zimbra Collaboration Suite (ZCS) nejméně od července 2025. NÚKIB doporučuje organizacím využívajícím Zimbra Collaboration Suite neprodleně ověřit, zda
… více »Intel vydal 42 upozornění na bezpečnostní chyby ve svých produktech. Současně vydal verzi 20260811 mikrokódů pro své procesory.
Sny o designu GNOME Shellu, článek s náhledy a videi, představuje dlouhodobou vizi týmu GNOME pro vylepšení uživatelského rozhraní GNOME Shellu. Zatímco nedávné verze přinášely spíše drobné úpravy, designéři nyní plánují zásadnější změny.
Byla vydána nová verze 10.5 sady aplikací pro SSH komunikaci OpenSSH. Přináší řadu důležitých bezpečnostních oprav, vylepšení funkcí a oprav chyb. Nově vyžaduje podporu ECC (Elliptic Curve Cryptography) v libcrypto, včetně křivky NISTP521.
Byla vydána nová verze 10.6 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. S novými obrazy pro Orange Pi 4 Pro, Orange Pi Zero 3W a Odroid M1/M1S/M2. Přehled novinek v poznámkách k vydání.
Námořní drony používané elitními jednotkami britského královského námořnictva tajně posílaly údaje do Číny. Stroje vybavené čínskými komponenty měly být využívány pro vojenské operace na Blízkém východě. Kamery na dálkově řízených průzkumných člunech K3 Scout byly vybavené součástkami, které bez vědomí britského námořnictva odesílaly informace do spojeného zařízení v Číně. Britské námořní síly využívaly flotilu námořních dronů
… více »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
Tiskni
Sdílej: