Debian dnes slaví 32 let. Ian Murdock oznámil vydání "Debian Linux Release" 16. srpna 1993.
Policisté zadrželi odsouzeného drogového dealera Tomáše Jiřikovského, který daroval ministerstvu spravedlnosti za tehdejšího ministra Pavla Blažka (ODS) bitcoiny v miliardové hodnotě, a zajistili i darovanou kryproměnu. Zadržení Jiřikovského může být podle ministerstva důležité k rozuzlení kauzy, která vypukla koncem května a vedla ke konci Blažka. Zajištění daru podle úřadu potvrzuje závěry dříve publikovaných právních
… více »Administrativa amerického prezidenta Donalda Trumpa jedná o možném převzetí podílu ve výrobci čipů Intel. Agentuře Bloomberg to řekly zdroje obeznámené se situací. Akcie Intelu v reakci na tuto zprávu výrazně posílily. Trump minulý týden označil Tana za konfliktní osobu, a to kvůli jeho vazbám na čínské společnosti, čímž vyvolal nejistotu ohledně dlouholetého úsilí Intelu o obrat v hospodaření. Po pondělní schůzce však prezident o šéfovi Intelu hovořil příznivě.
Společnost Purism stojící za linuxovými telefony a počítači Librem má nově v nabídce postkvantový šifrátor Librem PQC Encryptor.
VirtualBox, tj. multiplatformní virtualizační software, byl vydán v nové verzi 7.2. Přehled novinek v Changelogu. Vypíchnou lze vylepšené GUI.
Eric Migicovsky, zakladatel společnosti Pebble, v lednu oznámil, že má v plánu spustit výrobu nových hodinek Pebble s již open source PebbleOS. V březnu spustil předprodej hodinek Pebble Time 2 (tenkrát ještě pod názvem Core Time 2) za 225 dolarů s dodáním v prosinci. Včera představil jejich konečný vzhled (YouTube).
Byla oznámena nativní podpora protokolu ACME (Automated Certificate Management Environment) ve webovém serveru a reverzní proxy NGINX. Modul nginx-acme je zatím v preview verzi.
Vývojáři KDE oznámili vydání balíku aplikací KDE Gear 25.08. Přehled novinek i s náhledy a videi v oficiálním oznámení.
Společnost Perplexity AI působící v oblasti umělé inteligence (AI) podala nevyžádanou nabídku na převzetí webového prohlížeče Chrome internetové firmy Google za 34,5 miliardy dolarů (zhruba 723 miliard Kč). Informovala o tom včera agentura Reuters. Upozornila, že výše nabídky výrazně převyšuje hodnotu firmy Perplexity. Společnost Google se podle ní k nabídce zatím nevyjádřila.
Intel vydal 34 upozornění na bezpečnostní chyby ve svých produktech. Současně vydal verzi 20250812 mikrokódů pro své procesory řešící 6 bezpečnostních chyb.
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: