- NagyZ blogja
- A hozzászóláshoz be kell jelentkezni
- 1570 megtekintés
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
- A hozzászóláshoz be kell jelentkezni
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 ;-)
- A hozzászóláshoz be kell jelentkezni
Mi lenne az előnye annak, hogy a belépési pont kötelezően egy osztály?
KisKresz
- A hozzászóláshoz be kell jelentkezni
jobban illeszkedne az egesz az OO paradigmahoz, de ez persze eros IMHO :)
- A hozzászóláshoz be kell jelentkezni
De a C++ nem tisztán OO nyelv. :-)
KisKresz
- A hozzászóláshoz be kell jelentkezni
A Java sem :)
- A hozzászóláshoz be kell jelentkezni
öhm.. azt hiszem erre szokták igy szétválasztani a definiciot, hogy a c++ objektub orientált, azaz vannak ojjektumok, a java meg ojjektum alapú, amikor "minden" ojjektum
- A hozzászóláshoz be kell jelentkezni
> viszont maga a belepesi pont a progamba meg mindig nem egy osztaly
Ennél nagyobb C++ bajod sose legyen. Hány sorba kerül a workaround? :-)
- A hozzászóláshoz be kell jelentkezni
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.. :)
- A hozzászóláshoz be kell jelentkezni
Nem igazán látom, hogy ez hol a C++ problémája. Egyrészt Java-ban sem tudsz ilyet csinálni, másrészt az nem C++ sara, hogy a kernelt nem C++-ban írták, vagy ha igen, akkor nem eléggé OO API-t csináltak hozzá.
- A hozzászóláshoz be kell jelentkezni
ott a cpp sara, hogy mi a halalert nem tudok adott peldany adott metodusara mutato pointert atadni, miert kell, hogy static legyen.
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
> Hja, hogy ezt egy C kernel nem támogatja...
Melyik rendszer hívásra gondolsz?
- A hozzászóláshoz be kell jelentkezni
Mivel egy C kódnak fogalma sincs róla, hogyan kellene meghívni egy objektum egy metódusát, ezért azt hiszem, hogy bármelyikre. (feltéve, hogy a szóbanforgó kernel, amivel beszégetni kell, C-ben íródott)
- A hozzászóláshoz be kell jelentkezni
wrapperek csodakra kepsek. Nem olyan nagy was is das, C++ szintaxikai cokor osztalyt irni ra, hogy minde OO erzesu ember boldok lehessen.
Amit nem lehet megirni assemblyben, azt nem lehet megirni.
- A hozzászóláshoz be kell jelentkezni
Erről a wrapperről szól az egész thread itt alant.
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
he? tudnam hasznalni, ott a JNI, csak mivel ugye ez nem x86, igy nem olyan egyszeru javazni rajta. lehetni lehet, csak meg nem probaltam :)
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
ahogy az elsonel irtad, ugy csinalom most.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Őőőő, 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
- A hozzászóláshoz be kell jelentkezni
akkor reportold:)
- A hozzászóláshoz be kell jelentkezni
Az lesz, ha lesz egy kis időm...
Illetve le kell ellenőriznem linuxon, elvégre win-en a 4.3 nem épp official...
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
hm, csak en vagyok vele ugy, vagy olvashatobb az, ahogy jelenleg csinalom? :)
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
ebben igazad van. jelenleg ket helyen hasznalok ilyeneket, igy nem veszes, de ha ez a szam megugrana, akkor mar megfontolando. :)
- A hozzászóláshoz be kell jelentkezni
"van csomo olyan kernellel beszelgeto dolog"
Azaz kettő? :))
Sebaj, én jól szórakoztam amíg összedobtam. Azt hiszem ez már a perverzitás kategória...
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
1. static_cast
const_cast-tal leveszed a const-ot a típusról.
Szerk. A 2. kérdést nem értem. :-)
Szerk2. Bár most elbizonytalanodtam. Referenciával működött a const_cast is.
KisKresz
- A hozzászóláshoz be kell jelentkezni
"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
- A hozzászóláshoz be kell jelentkezni
Ha van egy nem-const valtozod, akkor azt nem kell explicite const-ta alakitani, ugyanis ez az irany implicit.
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
enis erre gondoltam volna, ha gcc be nem szolt volna, de lehet, csak haluztam. holnap megnezem.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
"template <typename C,void (C::*MF)(),C* PC>
"
...
callback=callback_func<Call,&Call::me,&c>;
Ejha (; Bazzeg, leborulok.
- A hozzászóláshoz be kell jelentkezni
:)
Tudnád mennyit szívtam ezzel a rohadt tagfüggvény-mutató szintaxissal, mire a fordító megette... Hiába ha az ember ritkán használ valamit...
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
Es a JNA?
https://jna.dev.java.net/
- A hozzászóláshoz be kell jelentkezni
Az szerintem win only. Itt meg valami beágyazott rendszert emlegettek... :)
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
"JNA has been built and tested on OSX (ppc, x86, x86_64), linux (x86, amd64), FreeBSD/OpenBSD (x86, amd64), Solaris (x86, amd64, sparc, sparcv9) and Windows (x86, amd64). "
- A hozzászóláshoz be kell jelentkezni
| grep -i embedded | wc -l
0
Ne felejtsuk el, hogy ezeket a cuccokat joreszt (g)libc-hez irtak, es nem embedded libc-khez (uC pl.)
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
Ugyanitt:
"If JNA has not yet been built on for your platform, you may need to tweak the build.xml and native/Makefile build configurations so that your platform is recognized."
ha le tudja ra forgatni, lass csodat, lesz JNA-ja. Ennyi.
- A hozzászóláshoz be kell jelentkezni
Bocs, akkor félrenéztem...
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
+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
- A hozzászóláshoz be kell jelentkezni
php kiddiektol ments meg uram minket ;)))
ennek a cuccnak a procija tud elvileg javat futtatni, csak nem akartam Jinivel szenvedni, mert a kernellel kell beszelgetnem :)
de majd ha nem a hataridok miatt faj a fejem, kiprobalom milyen sebesseggel fut. :)
- A hozzászóláshoz be kell jelentkezni
van olyan fejlesztő, akinek a határidők miatt fáj a feje? :)
- A hozzászóláshoz be kell jelentkezni
hat, par het csuszas utan amin a ceg bukik sokpenzt, el tudom kepzelni, hogy egy "Koszonjuk Zoltan, hogy a kollegank volt!" mondattal fogadnanak :)
- A hozzászóláshoz be kell jelentkezni
Legalabb 1 kerdest feltehetnel, mert igy az eletben nem erjuk el a 300 postot ide =D
Igy csak annyit lehet irni: "Hatigen."
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
ahahahah :D
amint normal rendszert (szerver oldalt) akarsz fejleszteni valami nagyobb vason, java uberel mindent. Java EE for prezident ;]
- A hozzászóláshoz be kell jelentkezni
Felteve, ha csak azt az egyetlen alkalmazast akarod futatni a nagyobb vason, es nem akarsz kodot modositani, mas esetben szinte minden jobb.
Amit nem lehet megirni assemblyben, azt nem lehet megirni.
- A hozzászóláshoz be kell jelentkezni
? Prod kornyezetben ritkan modosit az ember kodot, amugy meg redeploy es ennyi.
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
Kb. negyed evente vagy havonta, ha nem lennek bugok, egyebkent gyakrabban.
Classok memoria foglalsa vicces dolog, restart megfontolondo komolyabb deployok utan.
Amit nem lehet megirni assemblyben, azt nem lehet megirni.
- A hozzászóláshoz be kell jelentkezni
FUD, troll, stb.
kepzeld, mar lehet ugy is redeployolni applikaciot, hogy megmaradnak a sessionok, meg mindenfele csoda dolog. meghamar ennyire production vagy, akkor ugye nem egy gepen futtatod?
hidd el, nagyon nagy helyeken fut nagyon jol productionben JEE alkalmazas.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Azert ahol mar J2EE-re adjak a fejuket, ott legyen mar legalabb egy dzsunkaszerver tesztgepnek...
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Node ez miben Java specifikus?
- A hozzászóláshoz be kell jelentkezni
Semmiben.
Amit nem lehet megirni assemblyben, azt nem lehet megirni.
- A hozzászóláshoz be kell jelentkezni
Ezt php-vel is el lehet jatszani, ettol meg a j2ee nem szar...
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
Hol mondtam, hogy szar? Legfejlebb azt mondtam, hogy nem mindig a legjobb valasztas.
Amit nem lehet megirni assemblyben, azt nem lehet megirni.
- A hozzászóláshoz be kell jelentkezni