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)
#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.
#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.
#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.
#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.
#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);
#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á.
#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.
#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.
#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)
#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?
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
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
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku