Byla vydána nová stabilní verze 7.6 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 140. Přehled novinek i s náhledy v příspěvku na blogu.
Byla vydána verze 1.90.0 programovacího jazyka Rust (Wikipedie). Podrobnosti v poznámkách k vydání. Vyzkoušet Rust lze například na stránce Rust by Example.
GNUnet (Wikipedie) byl vydán v nové major verzi 0.25.0. Jedná se o framework pro decentralizované peer-to-peer síťování, na kterém je postavena řada aplikací.
Byla vydána nová major verze 7.0 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Nově je postavena je na Debianu 13 (Trixie) a GNOME 48 (Bengaluru). Další novinky v příslušném seznamu.
Společnost Meta na dvoudenní konferenci Meta Connect 2025 představuje své novinky. První den byly představeny nové AI brýle: Ray-Ban Meta (Gen 2), sportovní Oakley Meta Vanguard a především Meta Ray-Ban Display s integrovaným displejem a EMG náramkem pro ovládání.
Po půl roce vývoje od vydání verze 48 bylo vydáno GNOME 49 s kódovým názvem Brescia (Mastodon). S přehrávačem videí Showtime místo Totemu a prohlížečem dokumentů Papers místo Evince. Podrobný přehled novinek i s náhledy v poznámkách k vydání a v novinkách pro vývojáře.
Open source softwarový stack ROCm (Wikipedie) pro vývoj AI a HPC na GPU od AMD byl vydán ve verzi 7.0.0. Přidána byla podpora AMD Instinct MI355X a MI350X.
Byla vydána nová verze 258 správce systému a služeb systemd (GitHub).
Byla vydána Java 25 / JDK 25. Nových vlastností (JEP - JDK Enhancement Proposal) je 18. Jedná se o LTS verzi.
Věra Pohlová před 26 lety: „Tyhle aféry každého jenom otravují. Já bych všechny ty internety a počítače zakázala“. Jde o odpověď na anketní otázku deníku Metro vydaného 17. září 1999 na téma zneužití údajů o sporožirových účtech klientů České spořitelny.
Zdravim, mam problem s jednim kodem. Po urcite dobe behu mi padne na hubu.Nevim uz jak tuto chybu osetrit. Nejsem uplne C guru... Prikladam zdrojak fce ve ktere to asi pada:
float DejTeplotu(char* OW) { unsigned err; char * buf; size_t s ; char* cesta; char* prac; if (OW == NULL) {cout << "Nulovy OW!!!"; return 0; } else { //if (OW == NULL) {cout << "Nulovy OW!!!"; return 0; break; } //cout << "Delka:" << strlen(OW); cesta = (char *) malloc(strlen("//10.99A689020800/temperaturenase")); prac = (char *) malloc(strlen(OW)); if ((cesta != NULL) && (prac !=NULL)) { cesta[0] = 0; prac = strcpy(prac,OW); cesta = strcpy(cesta,"/"); // cout << cesta; unsigned i; for (i = 0; i < strlen(prac); i++) { // cout << prac[i] << endl; cesta[i+1] = prac[i]; } cesta[i+1] = 0; strcat(cesta,"/temperature"); // cout << endl << "Vysledek:" << cesta << endl; err = OW_init("/dev/i2c-1"); if (err >= 0) { OW_set_error_print("2"); OW_set_error_level("6"); OW_get(cesta,&buf,&s) ; // OW_get("/10.99A689020800/temperature",&buf,&s) ; return stof(buf); free(buf); free(prac); free(cesta); OW_finish() ; } else { cout << "Vyskytla se chyba v inicializaci-asi malo pameti" << endl; return 0; } } else { free(cesta); free(prac); cout << "Vyskytla se chyba v inicializaci" << endl; return 0; } } }A jeste vypis z gdb:
Program received signal SIGSEGV, Segmentation fault. 0xb6a7e834 in strlen () from /lib/arm-linux-gnueabihf/libc.so.6 (gdb) bt #0 0xb6a7e834 in strlen () from /lib/arm-linux-gnueabihf/libc.so.6 #1 0xb6c77934 in std::basic_string:char, std::char_traits"char", std::allocator"char" >::basic_string(char const*, std::allocator"char" const&) () from /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 #2 0x00009550 in DejTeplotu (OW=0x32419 "1099A68902080000") at ./main.cpp:75 #3 0x00009fd0 in main () at ./main.cpp:298 (gdb)
Jsem v koncich...Kdyby nekdo mohl probehnout tento kod a nakopl mne... Dekuji
Řešení dotazu:
gdb
toho moc nevidím. Že by chybějící volba -g
při kompilaci?
Na první pohled mi přijde, že počítáš s tím, že strlen()
vrací velikost řetězce v paměti. Ve skutečnosti ale vrací délku řetězce. V paměti céčkovský řetězec ještě přidává znak 0x00, potřebuje tedy jeden bajt navíc.
Navíc je to taková sprasená ukázka kódu, že nevím, co si jen zkoušíš a co má nějaký reálný význam. Občas je dobré pro účely porady minimalizovat zdroják na co nejmenší kus, kde se problém ještě projevuje.
cpp
a jsou použity stream-y
, tak není důvod proč nepoužít std::string
a je (s tímto) pokoj.
Řádek 75 je
return stof(buf);
přičemž stof()
na argument volá konstruktor std::stringstream
, který nejdřív implicitně zavolá konstruktor std::string
. Můj tip je, že OW_get()
vrátila NULL nebo nějaký nesmyslný pointer. Protože nevím, co ta funkce dělá, nemůžu si být jistý, jestli smí vrátit NULL a jestli jste to měl ošetřit (spíš ano).
// tady bys mel mit
prac = (char *) malloc(strlen(OW) + 1);
// misto
prac = (char *) malloc(strlen(OW));
if ((cesta != NULL) && (prac !=NULL))
{
cesta[0] = 0;
// jinak je tohle blbost, jak pise kolega vyse v poznamce!!!
// protoze neni kam ulozit ukoncovaci 0x0
prac = strcpy(prac,OW);
return
okamžitě vyskočí z prováděné funkce, takže příkazy za returnem
se již neprovedou. Tvůj způsob použití return
dává tušit, že máš úplně jinou představu o jeho fungování. Funkce malloc
vrátí NULL
, pokud nemůže tvůj požadavek na alokaci paměti uspokojit a patrně právě na tom potom ten proces upadne, když se snažíš do NULL
pointeru zkopírovat jiný řetězec.
OW_get()
, jak jsem vám radil?
float DejTeplotu(string OW) { float vystup; vystup = 0; //cout << "OW:"<< OW << "delka:" << OW.length() << endl; if (OW.length() == 16) { char * buf; size_t s ; string cesta = "/"; cesta += OW; cesta += "/temperature"; if (OW_init("/dev/i2c-1") >= 0) { OW_set_error_print("2"); OW_set_error_level("6"); // OW_get("/10.99A689020800/temperature",&buf,&s) ; if (OW_get(cesta.c_str(),&buf,&s) >=0) { vystup = stof(buf); free(buf); OW_finish() ; } else { cout << "Chyba pri ziskavani teploty z cidla: " << OW << endl; } }else { cout << "Chyba pri inicializaci sbernice!" << endl; } }else { cout << "Neplatny nazev cidla!" << endl; } return vystup; }
Pominu-li coding style, který se mi moc nelíbí a navíc ani není konzistentní, měl bych výhrady hlavně ke zpracování chyb. Dojde-li k chybě, měla by funkce buď vyhodit výjimku (když už používáte C++, proč nevyužít jeho výhod?) nebo chybu signalizovat volajícímu (typicky návratovou hodnotou). Varianta, kdy funkce natvrdo vypíše chybu na chybový výstup a pak vrátí jakousi nahodilou hodnotu, kterou by dost možná mohla vrátit i pokud je všechno v pořádku, je velmi nešťastný. Jak má volající poznat, jestli dostal smysluplnou hodnotu nebo jestli došlo k chybě?
Výjimky. Je to přehledné, pohodlné a můžete si snadno zvolit, kde se bude na chybu reagovat a jaké informace je tam potřeba předat. Samozřejmě za to platíte určitým overheadem, který ale u tohoto typu aplikace nebude nijak tragický.
Jinak samozřejmě můžete použít léty prověřenou klasiku: teplota se bude ukládat do bufferu, na který dostanete pointer (v C++ můžete použít referenci) a funkce bude vracet jako návratovou hodnotu kód chyby (nebo aspoň bool OK/chyba).
for (i = 0; i < strlen(prac); i++)
{
//cout << prac[i] << endl;
cesta[i+1] = prac[i];
}
cesta[i+1] = 0;
Tiskni
Sdílej: