C++ vs Java..

egy beagyazott rendszerre torteno fejlesztes miatt le kellett porolnom a C++ tudasomat, de igy Java utan bevallom,
nagyon fapadosnak erzem a C++t.. :)

Hozzászólások

A fenébe is! C++, vs, Java, NagyZ... Azt hittem már, hogy valami sok hozzászólást szülő témaindító blogbejegyzés lesz. :P

hat en nem vagyok egy poliverzum, ez van ;-)

ami nem tetszik (vagy en vagyok muveletlen cpp teren, siman lehet): oke, hogy objektumorientalt, viszont maga a belepesi pont a progamba meg mindig nem egy osztaly. jo, javaban ez egy static method ugye, de legalabb osztalyon belul van ;-)

jo, ebben igazad van :)

a masik idegesito dolog akkor, hogy a C++ szabvany tiltja az olyan metodus-referenciak atadasat, ami nem static (a funktorokat most ne keverjuk ide).
ennek van is ertelme, meg nincs is. :)

van csomo olyan kernellel beszelgeto dolog, amihez en mint hasznalo csak callback fuggvenyt tudok megadni, es majd o hiv, ha van valami (ugye nem pollozgatunk, hanem event-based..)

namost idegesito workaroundolni ugy, hogy staticca kiszervezem mondjuk amit akarok inditani egy szalba/vagy amit megakarok a callbackbe hivni, es ennek atadom parameternek azt, ahonnan csinalom (azaz a thist), aztan igazabol az a callback/static metodus nem csinal semmi mast, csak meghivja a reinterpret_cast(param)->igaziMetodus() -t.. :)

Mert egy metódusnak önmagában nincs értelme, csak azzal az objektummal együtt, amihez tartozik, illetve ha static. Egyébként nem kell, hogy static legyen, átadhatod az adott példányt _és_ az adott metódust. Hja, hogy ezt egy C kernel nem támogatja...

szerk.: de visszakanyarodva a blogbejegyzés címéhez: Javaban tudsz ilyet csinálni?

Szerintem is igaza van sz-nek.

A gondod ugye lényegében az, hogy a kernel C API-t ad neked. Java-ban csak simán nem tudnád ezt használni, kéne valami Java wrapper. Ezekután miért is várod el, hogy C++ wrapper nélkül kényelmesen tudd használni? Örülj, hogy legalább tudod használni... :)

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

A JNI-t azért nem nevezném kényelmesnek. Nomeg az pont az a wrapper amit meg kell írni...
És ott meg tudnád oldani a callback problémát?

Egyébként ha nem gond, hogy a callback-et tartalmazó osztályod objektuma globális kell legyen, akkor van megoldás... Érdekel?

Illetve, ha a callback fv vissza tud adni egy előre megadott pointert, akkor ez se kell...

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

hogyne erdekelne. :)

jelenleg azt a megoldast kovetem, hogy az egy static fuggveny, aminek a parametere egy pointer az igazi peldanyra, majd azon meghivom azt a fuggvenyt, ami a kornyezetfuggo munkat vegzi.

a callback sajna nem adhat vissza semmit, ugyanugy, mint curlnal itt is csak a callbacket tudod megadni, illetve, hogy milyen pointert kapjon majd amikor valaki (a lib/a kernel/etc) meghivja.

Most ezt bevallom nem vágom...


class A
{
...
public:
    static void callback(void* obj)
    {
       static_cast<*A>(obj)->func();
    }

    void func()
...
};

Így csinálod?

Vagy így:


class A
{
...
public:
    static void callback()
    {
       statObj->func();
    }

    void func()
...
private:
    static A* statObj;
};

Vagy hogyan?

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Ez volt a kérdésem, hogy a callback kap-e valami előre megadott pointert.
Azaz, hogy a callback

void func(void*)

-e?
Mert ha igen, akkor ez kell neked:


template <class C,void (C::*MF)()>
void callback_func(void *pc)
{
	(static_cast<C*>(pc)->*MF)();
}

A használat pedig:


typedef void (*C_callback_type2)(void*);

	Call c;
	C_callback_type callback;
	callback=callback_func<Call,&Call::me>;

	(*callback)(&c);

Ha igazán perverz vagy, írhatsz egy make_callback fv-t amivel:


	callback=make_callback(&Call::me);

elég...

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Őőőő, hát make_callback-ot nekem nem sikerült, legalábbis 4.3-as gcc-n (Win):
"internal compiler error: in expand_expr_real_1, at expr.c:7314
Please submit a full bug report,
with preprocessed source if appropriate."

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Ahogy gondolod, de így csak egy (template-es) callback_func deklarációd van, amit utána 200 helyen használhatsz, mindössze annyit kell leírnod, hogy

callback_func<Call,&Call::me>

. Persze nem kötelező, ha minden fügvényhez kézzel akarsz írni egy static-ot az tényleg a te dolgod. :)

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

akkor mint rezidens cpp gurut, megkerdezlek masrol, ami valszin trivi, csak nekem ilyen nem kellett eddig ;-)
sot, akkor mar egy masik kerdes is. (ne feledd, Javas vagyok:P)

1, ha van egy stringem, hogy tudnek belole const stringet csinalni? const_cast<> elvileg jo erre, viszont nekem sir. static_cast? dynamic_cast? melyik a legjobb?

2, mitol van az, hogy egy map -nal gyorsabb a map? gondolom ha mar ugy van vele, hogy konstansok mindenutt, akkor belul csak referenciakat hasznal masolatok helyett? de ezt nem hiszem (vagyhat nem tudok rola) h lehet futasi idoben ellenorizni cppben.

"akkor mint rezidens cpp gurut, megkerdezlek masrol"
Ha nem a blogok között lennénk, már itt osztaná az észt a többi is. :)

1.
Ezért utálni fogsz, de: miért is szeretnéd ezt?
Konkrétabb példa esetleg?

2.
Attól tartok eltűntek a template paraméterek...
Szóval mi a kérdés?

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

Egyébként a trükk:


template <typename C,void (C::*MF)(),C* PC>
void callback_func()
{
	(PC->*MF)();
}

Használat: ("Call" osztály "me" függvényére)


typedef void (*C_callback_type)();

Call c; //globalis objektum
...
	C_callback_type callback;
	callback=callback_func<Call,&Call::me,&c>;

Azért kell globálisnak lennie, mert fordítási időben tudnia kell a fordítónak az objektum címét. Sajnos ezt sehogy sem tudtam megkerülni. Persze lehet, hogy csak én vagyok kevés... :)

Talán egy árnyalatnyit szebb megoldás. :)

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o

+1
a témát nézve azt hittem, valami helyes kis zöldfülű kérdi, hogy melyiket érdemes tanulni php után, aztán mindenki elmondja, hogy az a legjobb, amit ő használ, mert, és mindenki szakértő

(no jó, mondom én, aki a php-t is óbudai dialektusban beszélem)

—-—-—
int getRandomNumber() {
	return 4;//szabályos kockadobással választva.
}		//garantáltan véletlenszerű. xkcd

Legalabb 1 kerdest feltehetnel, mert igy az eletben nem erjuk el a 300 postot ide =D

Igy csak annyit lehet irni: "Hatigen."

En javat porolgatom. Meg mindig nem tudom eldonteni, hogy csunya hackek sorozata vagy valami ertelmes dolog -e.
Kurva sok mindent meg lehet oldani java -val is, de ott valahol melyen eleg csunyanak erzem. Eredetlieg nem ilyen csoda nyelvnek tervezedot, de aztan az ido folyasaval mindenfele fekete magiat bele toltak, amihez jonnek varazs toolok es classok.

Amit nem lehet megirni assemblyben, azt nem lehet megirni.

Lehet kicsit FUD-osan hangzik, de azert, mint mindennek vannak hatranyai is es mint szinte mindig ujabb megoldas beikitassal a hatrany ledolgozhato.
"Minden problema megoldasa, masik ket problema letrejottet indukalja." - egy haverom valami hasonlot szokott mondogatni.

Egyszer valaki megkerdezn, hogy hogyan lehet X resz problemat megoldani, mondok ra 3 megoldast.
Kovetkezo nap megkerdezi mi lenne, ha az A megoldast valasztanank,erre mondom annak van "a" hatranya.
Akkor legyen B , mondom annak van "b" hatranya.
Na jo akkor legyen C , en erre mondom, hogy annak van "c" hatranya.
"Baszki Turul, akkor mi legyen?"
Igazabol nekunk mindharom megfelelne. :)

Az hogy hany gepen futatom az attol fugg, hogy mire van keret az adot esetben es mik a kovetelmenyek.

Szerintem mindenki tudja, hogy nem egy helyen fut Javas megoldas. Nem veletlen, hogy Progos allashirdetesek tulnyumo resze Java -s.

Amit nem lehet megirni assemblyben, azt nem lehet megirni.

Fentebb nem teszt geprol volt szo, hanem arrol, hogy prod 2 gepbol all minimum, izles szerinti load balancerrel.

A bugok gonoszak, programozok meg inkabb :) Siman tulelhet egy bug egy dev,test rendszert minosog ellenorzokkel egyutt.

Vegyunk egy egyszeru hibat, roszul escepel valmit valaki valahol. Lehet, hogy teszt rendszeren nincs olyan adat amin kibukik. Sot az is lehet, hogy majd csak kesobb probal valaki vicces karaktereket irni.

Amit nem lehet megirni assemblyben, azt nem lehet megirni.