Alternativa .toFixed nebo .toString pro C? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Alternativa .toFixed nebo .toString pro C? – C / C++ – Fórum – Programujte.comAlternativa .toFixed nebo .toString pro C? – C / C++ – Fórum – Programujte.com

 

oxidián0
Grafoman
25. 7. 2017   #1
-
0
-

Jak toto opravit v C?

void olrad2decStr(SOLRAD * solrad, SOLRAD_STR * o){
    // solrad.O3 je typ char O3[8];

    solrad.O3.ToString("N2");
    strcpy( (*o).O3, solrad.O3.ToString("N2") );

   return void;

}

aby se typ, který je double překonvertoval do proměnné char[8]? String o dvou desetinných místech.

Nahlásit jako SPAM
IP: 78.102.61.–
25. 7. 2017   #2
-
0
-

double na char* ... co třeba sprintf? Existuje i alternativa s omezením počtu znaků ve výsledku, jestli si dobře vzpomínám snprintf.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
oxidián0
Grafoman
25. 7. 2017   #3
-
0
-

#2 hlucheucho
Už jsem to vyřešil dík

snprintf( (*o).O3, 50, "%f", solrad.O3 );
Nahlásit jako SPAM
IP: 78.102.61.–
MilanL+1
Grafoman
25. 7. 2017   #4
-
0
-

#1 oxidián

použil bych sprintf
u výstupního char pokud ho chceš používat dál, je třeba mít rezervován dostatečný počet míst včetně pozice pro desetinou čárku/tečku a ukončovací znak "\0" tzn 4 místa na desetinou část ",xx\0" + rozsah celé části, bez koncové \0  se ti do toho přimíchají data co jsou za tím char polem dokud to nenarazí na 0x00 což je pro char ukončovací znak.

char vystup [10];
sprintf(vystup,"%.2f\0",doublecislo);

Nahlásit jako SPAM
IP: 91.139.9.–
25. 7. 2017   #5
-
0
-

#4 MilanL
to \0 je tam zbytečné. sprintf tam ukončovací znak dává automaticky. Použití snprintf má výhodu, umožňuje omezit počet znaků výsledného řetězce a  tím omezit riziko nežádoucího zásahu mimo alokovanou paměť. I snprintf dává automaticky ukončovací znak viz http://www.cplusplus.com/reference/cstdio/snprintf/

hu

Nahlásit jako SPAM
IP: 195.178.67.–
25. 7. 2017   #6
-
0
-

#3 oxidián
"%f" ti nedává požadovaný počet des. míst. Ten musíš specifikovat, takže pro 2 des. místa je vhodnější "%0.2f"

Edit: u snprintf by měl druhý parametr být počet bytů v buferu. Pokud bufer je char buf[8] pak by druhý parametr snprintf měl být 8. Pokud je druhý parametr 50, očekává char buf[50]

hu

Nahlásit jako SPAM
IP: 195.178.67.–
oxidián0
Grafoman
25. 7. 2017   #7
-
0
-

Dík tak délku ještě opravím. A ještě bych potřeboval připomenout jak rozdělit dlouhý příkaz (pro printf) na více řádků

    "Station pressure (sea level) %s [mbar] "
    "Earth/sun distance R %s [AU] "
    "Solar zenith angle Z %s [°]"
    "Relative air mass %s"
    "Distance-corrected solar constant %s [W/m2]"
    "Direct irradiance on horizontal surface %s [W/m2]"
    "Diffuse irradiance %s [W/m2]"
    "Total irradiance on horizontal surface %s [W/m2]"

dá se to spojit do jednoho řetězce bez kopírování?

Nahlásit jako SPAM
IP: 78.102.61.–
MilanL+1
Grafoman
25. 7. 2017   #9
-
0
-

#7 oxidián
nemáš tam odřádkování tak jak to máš ti to na výstup hodí do jedné řádky, jinak máš 2 možnosti bud rozdělení tak jak to máš se všemi parametry na konci, nebo do výstupního pole přidávat řádek po řádku, s offsetem na délku řetězce. Hlavně je třeba mít na výstup rezervováno dostatečně velké pole. 

char vystup [512]; 

sprintf(vystup,"Station pressure (sea level) %s [mbar] \n\0",StatPres);
sprintf(vystup[strlen(vystup)],"Earth/sun distance R %s [AU] \n\0", DistSun);
sprintf(vystup[strlen(vystup)],"Solar zenith angle Z %s [°] \n\0", AZenith);

/* atd pro další řádky 
    "Relative air mass %s"
    "Distance-corrected solar constant %s [W/m2]"
    "Direct irradiance on horizontal surface %s [W/m2]"
    "Diffuse irradiance %s [W/m2]"
    "Total irradiance on horizontal surface %s [W/m2]" */

Pro jistotu bych tam ten ukončovací znak \0 dával, s CZIvo jsme sprintf na něco používali a když byl nový text kratší objevovali se tam pak na konci nesmysly (pozůstatky starých textů co byly delší).

Nahlásit jako SPAM
IP: 91.139.9.–
25. 7. 2017   #10
-
0
-

#9 MilanL
Nevím, co jsi měl za nestandartní prostředí. Nikdy nebylo potřeba u sprintf nebo snprintf dávat dodatečně znak 0x00. Podle specifikace ho tam ta funkce dává. Za ním pak zůstává v paměti smetí. U některých funkcí je nutné si ten znak vkládat sám, protože to nedělají (tuším strncpy). Vždy jsem to našel ve specifikaci, jestli funkce znak 0x00 vkládá a já nemám co řešit nebo jestli ho tam musím vložit já. 100x nic umořilo osla!

Dále je otázka, zda chtěl odřádkovat výstup. Dotaz jsem pochopil tak, že chce hooooodně dlouhý literál napsat na více řádků.

Použití strlen je pro odřádkování výstupu komplikované a neefektivní (pochybuji, že překladač zoptimalizuje). Nevím, zda mu u jeho OS (Windows XP?) bude fungovat LF. Vždy jsem používal CR, mám zafixované, že u Windows to nemůže být jinak, a vlastně ani nevím proč.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 24 hostů

Podobná vlákna

C++ pro iOS nebo Andriod — založil Luckin

Dobrá kniha nebo učebnice pro C# — založil killermax

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý