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

Sprintf – C / C++ – Fórum – Programujte.comSprintf – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
oxidián0
Grafoman
24. 6. 2016   #1
-
0
-

   

imshow(sprintf("blured->gray took %d",t), gray);

error C2664: 'sprintf' : cannot convert parameter 2 from 'double' to 'const char *'

Jak to opravit abych mohl v title okna zobrazit text s číslem. t je double (ms)

Nahlásit jako SPAM
IP: 78.45.87.–
Kit+15
Guru
24. 6. 2016   #2
-
0
-

#1 oxidián
"%d" je určen pro integer, použij "%f".

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
vitamin+8
Grafoman
24. 6. 2016   #3
-
0
-

#1 oxidián
chyba ti tam prvý parameter, sprintf má takúto deklaráciu:

int sprintf ( char * str, const char * format, ... );
Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Kit+15
Guru
24. 6. 2016   #4
-
0
-

#3 vitamin
Pořád si říkám: Co jsme pánům K&R udělali, že nás takto potrestali?

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
vitamin+8
Grafoman
24. 6. 2016   #5
-
0
-

#4 Kit
Na čo narážaš?

Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
24. 6. 2016   #6
-
0
-

#5 vitamin
budu hádat: Nemám rád ukazatele :(

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Kit+15
Guru
24. 6. 2016   #7
-
0
-

#5 vitamin
Na to, že výsledkem funkce v C nesmí být žádný složitější datový typ, např. string, pole, struktura apod. Většina ostatních jazyků to nějak řeší, aby se volání funkcí nemuselo takhle ohýbat.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
24. 6. 2016   #8
-
+1
-
Zajímavé
Kit +

#7 Kit
- String to byt muze, jelikoz je to jen pointer (char *). Horsi je, kde ten string bude ulozen, pripadne kdo ho pak uvolni. Pro char[] plati to same co pro pole.

- Struktura je neco, co v C muzes vratit funkci

- Pole se vratit neda (staticke), v tom mas pravdu.

+ vetsina ostatnich jazyku vznikala z C, takze se mohly poucit z chyb.

On nicmene dela v C++, takze kdyz se chce strelit do nohy pomoci starych C funkci, tak je to jeho blbost.

Nahlásit jako SPAM
IP: 212.47.3.–
Program vždy dělá to co naprogramujete, ne to co chcete...
vitamin+8
Grafoman
24. 6. 2016   #9
-
0
-

#7 Kit
Samozrejme C môže vracať štruktúry. Problém je kde alokuješ dáta na ten string. C nemá templaty ako C++, D a iné jazyky takže to rieši tak že ako parameter funkcie je pointer na dopredu alokované dáta.

Nahlásit jako SPAM
IP: 195.28.77.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Kit+15
Guru
24. 6. 2016   #10
-
0
-

#9 vitamin
Právě to jsou ty berličky, které programátorům v C znepříjemňují život. Například v PHP funguje sprintf() tak nějak normálně i bez nich. Prostě výsledkem funkce je string.

Templaty jsem nikdy nepoužíval, takže mi dohromady nic neříkají. A doufám, že je nikdy ani potřebovat nebudu.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
oxidián0
Grafoman
24. 6. 2016   #11
-
0
-

Na co tam mám dávat pointer na řetězec? Mám to tam dát dvakrát jako pointer na řetězec (arg1) a jako konstanutu (arg2)? divné

Nahlásit jako SPAM
IP: 78.45.87.–
vitamin+8
Grafoman
24. 6. 2016   #12
-
0
-

#10 Kit
C je systémový jazyk, porovnávať ho s PHP je somarina. sprintf a iné std funkcie jazyka C su navrhnuté tak aby zbytočne nealokovaly dáta. Uživateľ sa sám rozhodne ako dáta alokuje napr alloca(), malloc(),
GC_MALLOC(), memory pooly, vlastné allocátory... V C++ je allocator ako template parameter funkcie ktora sa inlinuje takze je mozne vytvarať generické funkcie ktoré alokujú data a réžia allocatorov je zanedbateľná. V C by sa to muselo riešiť cez pointre na allokačnú funkciu a to  by spomalovalo chod programu...

Po ďalšie C je veľmi starý jazyk ktorí vznikol v dobe kedy počitače maly málo pamäte, preto je taký primitívny a preto má taký divný systém "modulov" ktorý bohužial zdedil aj C++.

Inak v jazyku D su templaty implementované veľmi pekne a netreba sa ich báť. V C++ je to "trochu" horšie :).

#11 oxidián 

int t = 42;
char str[100];	//sem sa vlozi vysledok z sprintf

sprintf(str, "blured->gray took %d", t);

puts(str);
Nahlásit jako SPAM
IP: 78.141.123.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Kit+15
Guru
24. 6. 2016   #13
-
0
-

#12 vitamin
Jazyk C by se dal srovnat spíš se strukturovaným makroasseblerem s požadavkem snadné přenositelnosti mezi platformami. Tuto roli splňuje velmi dobře. Nebýt jazyka C, nevznikl by Unix.

Jazyk PHP z jazyka C vycházel, proto také má například indexování polí od 0 místo od 1, jak bylo do té doby zvykem. Převzaty jsou i další syntaktické prvky, jako např. všechny druhy závorek, některá klíčová slova, způsob volání funkcí, středníky pro ukončení příkazu apod. Podobnost těchto jazyků není náhodná.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
oxidián0
Grafoman
24. 6. 2016   #14
-
0
-

#12 vitamin
Aha, tak dík. Já myslel že to ta funkce vrátí.

A teď asi odbočím, ale právě jsem se pokoušel rozjet tenhle kousek kódu:

gap = 6;
for (int r = 0; r < 4; r++)
		 sspom.row(r).copyTo(dst.row(r));

Mat gaps = Mat(dst.size(), dst.type(), Scalar(0,0,0));
	   
int r = - gap;


Žádná chyba, ale na posledním řádku výsledek r je 4. Já očekával -6. No mozek mi to nebral. Až jak jsem přejmenoval proměnnou r na t ve smyčce tak se to rozjelo. Ale hledal jsem chybu asi 15-20 minut.

Nahlásit jako SPAM
IP: 78.45.87.–
Kit+15
Guru
24. 6. 2016   #15
-
0
-

#14 oxidián
Není dobré používat jeden název proměnné k více účelům. V různých jazycích dostaneš rozdílné výsledky, proto by ses měl tento zlozvyk odnaučit. Hlavně kvůli přehlednosti kódu a ušetření dalších 20 minut života.

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
KIIV
~ Moderátor
+43
God of flame
24. 6. 2016   #16
-
0
-

#14 oxidián
"myslel" - nevim parametry? Otevru google, zadam  "C sprintf"   a nemusim dva dny tipovat, jake ze to ma vlastne parametry a co to vraci.

A jestli ti ten kus kodu prosel, ale haze to neco jineho, tak je uz fakt na case zmenit kompilator. Coz uz bylo zminene asi 10x :)  (respektive projit to musi, prvni r je lokalni jen pro for, druhy s nim nema co kolidovat)

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
oxidián0
Grafoman
24. 6. 2016   #17
-
0
-

#15 Kit
Já zapomněl že tam ta proměnná je. Ale problém by to dělat nemělo anebo by to mělo hodit že proměnná už byla deklarovaná.

Nahlásit jako SPAM
IP: 78.45.87.–
Kit+15
Guru
24. 6. 2016   #18
-
0
-

#17 oxidián
Když jsem zkoušel různé kompilátory C/C++ a různé přepínače, tak to buď nešlo přeložit, anebo byl výsledek -6. Vyhoď kompilátor, viz KIIV.

BTW: Proč děláš tak dlouhé funkce, že v nich přehlédneš proměnnou?

Nahlásit jako SPAM
IP: 194.228.68.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
oxidián0
Grafoman
24. 6. 2016   #19
-
0
-

#18 Kit
To nebyla dlouhá funkce. To nebylo že jsem přehlédl, ale že jsem zapomněl.

Nahlásit jako SPAM
IP: 78.45.87.–
oxidián0
Grafoman
25. 6. 2016   #20
-
0
-

Spletl jsem si sprintf s printf.

std::printf("blured->gray took %f",t)


Hlásí

error C2248: 'cv::String::String' : cannot access private member declared in class 'cv::String'

čím to je?

Nahlásit jako SPAM
IP: 78.45.87.–
KIIV
~ Moderátor
+43
God of flame
25. 6. 2016   #21
-
0
-

Tim, co to pise. Neco, co neni vlastni metoda nebo friend tridy, nemuze videt soukrome data. Ani zdedena metoda, ani trida deklarovana uvnitr jine tridy...

Nicmene je to zvlastni prave v printf. Obzvlaste, kdyz tam cekas float (%f) a zvatla to neco o cv::String::String

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
oxidián0
Grafoman
25. 6. 2016   #22
-
0
-

Měl jsem byl přesnější.

std::printf("blured->gray took %f",t); // OK
imshow(std::printf("blured->gray took %f",t), gray); // ERROR

Tak už to jede:

char str[100];
std::sprintf(str, "blured->gray took %f ms",t);
cv::imshow(str, gray);


Ještě raz dík

Nahlásit jako SPAM
IP: 78.45.87.–
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, 106 hostů

Podobná vlákna

Pomoc s sprintf — založil jmeno

Sprintf() pro WCHAR[] — založil Bigi

Sprintf formátování bool — založil hlucheucho

Sprintf - předání parametrů — založil hlucheucho

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ý