Mám funkci, která vrací výsledek jako číslo double v intervalu 0,0 - 100,0, mě zajímají pouze výsledky jako 99,90 ale takovy tam nebude protože nejbližší výsledek bude něco jako 99,90143. Otázka tedy je zda existuje knihovní funkce, která umí u double odříznout vše od řekněme třetího desetinného místa?
Nebo musím použít metodu vynásobit výsledek 100x a odříznout desetinná místa jako celek.
Příspěvky odeslané z IP adresy 89.102.19.–
Ano jak jsem již uvedl v úvodním příspěvku to funguje a já to používám, problém je, že na to sem tam zapomenu a pak napíšete třeba něco jako
char *sql;
sql = "CREATE TABLE Funance(" \
"ID INT PRIMARY KEY NOT NULL," \
"TEMPN TEXT NOT NULL," \
"T1 INT NOT NULL," \
"T2 INT,"
"TR REAL );";
v C je to OK v C++ ne , tak na to čumite a než vám dojde o co go lámete si hlavu kde je problém.
Kdy šlo o nějaký obskurní jazyk řeknu OK, ale C je snad i dnes základní jazyk v řadě systémů, to by těm indickým šmejdům z MS upadli ruce, aby jeho podpora byla ve VS včetetně šablon projektů ? z mého pohledu C poúžívá více lidí než nějaké F#.
Dělám věci pro MCU , proto v C, ale větší matematické a algoritmické věci se snažím nejprve odladit na PC a píšu to ve Visual studiu 2022 zpravidla jako konzolovou aplikaci pro windows. Problém je že ve VS není možnost (já jí nenašel) vygenerovat projet pro Windows v C , jen v C++, ano stačí přejmenovat soubor z .cpp na .c ,ale na to občas zapomenu a pak se divím, že mi nepřekládá některé věc, které jsou v C, ale C++ je nepodporuje.
Není nějaká možnost jak VS donutit generovat projekt v C?
To co vidíte jako kód jsou řádky 222 až 224 v hlavičkovém souboru stdio.h , což je standardni knihovna C. Zde verze z gcc v12.2 (debin 12).
Ono se to u čehokoliv o začíná lomítky blbě pozná, ale
extern char *tempnam (const char *x
je celkem klasika a základní klíčová slova jazyka C .
Jinak problém vyřešen, v parametrech C /C++ projektu byl špatně definován překladač a i c tak překládal c++, po přepnutí na C překladač se to už přeloží, sice neslinkuje, ale to chce jen nadefinovat cesty pro linker.
Pokouším se rozchodit psaní programů pro Linux ve Visual Studiu. Včera jsem celkem bez problémů vše rzhdil tak, že jsem dokázal přeložit Hello Word z VS na debianu 12.
Dnes po doplnění cest na #include, přeložím i komplikovanější věci. Nicméně narazil jsme na proglem spojeny s stdio.h.
Hlsá mi to chybu E0020 identifikátor "__builtin_free" není definovaný. usr\include\stdlib.h
jeden obrázek za 1000 slov
Poradíte?
#3 Maděj
pokud struktura Data bude obsahovat
unsigned int x;
unsigned int y;
a pdata bude ukazatel na strukturu
unsigned int x = 123;
memcpy(pDara, &x, 4);
memcpy((unsigned char*) pdata+4, &x, 4);
první memcpy nakopiruje 123 do data.x a druhe do data.y
(unsigned char*) přetypovalo ukazatel na ukaztel na uchar a jeho zvýšenín o 4 se ikaztel posune o 4 byty,
__attribute__ je sice nejvíce profláklý mechanizmus z GNU, tedy gcc, ale ne neni to gcc.
Je to pro Clang/LLVM tedy dnes hlavní firemni překladač ARM.
Agoritmus ladim ve Visual Studiu a tam použivam #pragma( pack(push, 1) )
Co to děla snad i tuším, jde o to, že ve struktuře je sice 5x uint8_t tedy vlastně 40bitů, ale v paměti to zabere jen 32bitů, což je přesně o co mi jde. V paměti se vytvoří pole těchto struktur a to je po naplnění odesláno přes DMA a SPI kamsi a to jde jen kdy to má správnou strukturu protože to končí v hw registrech IC.
typedef struct {
uint8_t staticS : 3;
uint8_t globalS : 5;
uint8_t b : 8;
uint8_t w1 : 8;
uint8_t w2 : 8;
}__attribute__((__packed__)) Fram;
Pomoci typeDef jsem vytvořil strukturu, která vlastně představuje 32 bitovou proměnou, v reálu tedy kopii něčeho jako hw registr.
Fungovat to funguje, použití
Fram fram;
fram.staticS = 0b111;
fram.w1 = 128;
Proč to sem vůbec píšu? fram.staticS nemůže být nic jiného než 0b111 a řádek fram.staticS = 0b111; je nadbytečný, Libilo by se mi pokud by staticS byla konstanta o hodnotě 0b111.
Jde to nějak?