Új hozzászólás Aktív témák
-
EQMontoya
veterán
Szerinted mi az amit kezdokent C-ben egyszerubb mint C++-ban? (foleg hogy a C++ az kb 99.9%-ban felulrol kompatibilis a C-vel)
Az, hogy C++-ban kb. minden olyannal foglalkozol, amivel C-ben, de ha C-vel kezdesz, akkor nem egyszerre fogsz belezavarodni a referenciákba, pointerekbe, smart_ptr-ekbe és az érték szerinti átadásba, hanem csak a felé kapod egyszerre az arcodba.
Továbbá nem fogsz kapásból belefutni mondjuk a vptr-be, hanem lesz már némi fogalmad a függvénypointerekről, el tudod képzelni, hogy hogyan is működik az egész. -
EQMontoya
veterán
-
EQMontoya
veterán
Akkor gyorsan olvass utána a smart pointereknek. Úgy alapból a koncepciónak, hogy miről is szól ez az egész, utána pedig:
-kezdetben vala az auto_ptr
-majd lőn helyette unique_ptr
-kicsit bonyolultabb helyzetekre pedig van shared_ptr és weak_ptr (mint pl. a lentebbi, amikor több "tulajdonosa" van egy objektumnak) -
EQMontoya
veterán
válasz
katona.jozsi #3193 üzenetére
Mapet szerintem a [] op. mókás viselkedésével érdemes bemutatni.
Pl. bemeneten kapott szövegben a szavak megszámlálása és ebből statisztika készítése. (ez ugye kb. tíz sor) -
EQMontoya
veterán
válasz
jattila48 #3186 üzenetére
Simán elképzelhetőnek tartom, hogy compiler bugot fogtál.
Először azt hittem, ott lehet benne buktató, hogy egy static ptr úgy kap értéket, hogy akitől kapja, az member volt, ezért mondjuk move-olódhatna máshová, de ez már utána nem befolyásolja a staticot, mert közvetlenül mutat, nem ezen keresztül, tehát nem okoz gondot.
-
-
EQMontoya
veterán
válasz
jattila48 #3169 üzenetére
Csinálsz egy template classt, aminek van két int paramétere.
Az első hívásnál az első értelemszerűen 0, a második N.Ezzel tudod mindet példányosítani, és meghívni rajtuk valamit. Az más kérdés, hogy utána
Valahogy így:
template<int from, int to>
struct static_for
{
void operator()()
{
P<from> p;
p.doSomething();
static_for<from+1, to>()();
}
};
template<int to>
struct static_for<to, to>
{
void operator()()
{}
}; -
EQMontoya
veterán
válasz
sztanozs #3154 üzenetére
Majdnem teljesen biztos vagyok benne, hogy működik, mert van ennyire okos a fordító. Csak abban nem vagoyk biztos, hogy szabvány szerint is kell-e működnie.
dobragab: ezzel az a baj, hogy a bool is legalább egy byte, amiből valami lesz, ha xorolgatod, de az szerintem nincs garantálva a szabványban sehol, hogy két igaz értékű boolnak minden esetben pontosan ugyanolyan memóriaképpel kell rendelkeznie. Tehát simán el tudnék képzelni olyan impelentációt, amiben előfordulhat, hogy két igaz értkű bool xorolása is igazt eredményez.
-
EQMontoya
veterán
Nem értem én az embereket.
Header file, deklarál egy osztályt, tagfüggvényekkel.
Cpp fileban kifejti a függvényeket.Ez eddig ok. Majd csinálj a cpp fileba egy unnamed namspace-t, amiben létrehoz egy egy soros függvényt. Mindezt használja egy helyen.
Azért ez az igazi overengineering, le a kalappal!
Azt az egy sort nyugodtan berakhatta volna abba a függvénybe, amiből meghívta ezt a műremeket.Az ellipszilonos lyére azzal tette fel a pontot, hogy ebben az egy soros kis függvényében is volt egy unused param warning. Én meg kimentem inkább teázni...
-
EQMontoya
veterán
válasz
dobragab #3111 üzenetére
std::vector tudomásom szerint nem malloc-ot hív, hanem :: operator new-t. Ez a tény mondjuk C++ alapjai vizsgán erős.
Ez így erős egyszerűsítés. Egyrészt implementációtól függ. De nézzük akkor x86-64-en.
Std::allocator-t használ ugye alapból a foglalásra.
Utána placement new-val konstruálgat.
Ha pedig törölsz belőle, és nem a végéről, akkor op=-vel pakolja az elemeket visszafelé, majd az utolsót destruálja. (pedig nem azt törölted) -
EQMontoya
veterán
-
EQMontoya
veterán
válasz
AsterixComic #3101 üzenetére
1,
Ez egy bonyolultabb téma, kurvára nem alapokhoz való. A válasz egyébként igen, és van is létjogosultsága bizonyos esetekben. Illetve csak félig helyettesítődik ott is, mert placement new-t akkor is kell használni, de a lényeg az, hogy van, amikor szeretnénk elválasztani a memóriafoglalásokat az objektumok inicializálásától és megszüntetésétől.
Jó példa erre az vector, ami lazán fog Neked a háttérben valamekkora helyet foglalni, és oda pakolászol. -
EQMontoya
veterán
////////////////////////////////////////////////////////////////////////////////////////////////
// Internal data and functions, do not access outside of this file!
//////////////////////////////////////////////////////////////////////////////////////////////// -
EQMontoya
veterán
-
EQMontoya
veterán
válasz
jattila48 #3079 üzenetére
Szerintem a readet (elég, ha csak szignatúrájában egységes) a source-ba kellene tenni, és egyébként csak processzálás van.
Az a bajom az egybe pakolt megoldással, amiért nem is akar sézpen működni: teljesen különböző funkciókat szeretnénk bepakolni egy logikai csoportba.
-
EQMontoya
veterán
válasz
jattila48 #3066 üzenetére
Nem volt időm az egészet végigolvasni, csak úgy nagyjából látom a problémát:
-Különböző forrásokból összeszedsz valami bináris adatot
-Ezt kb. egységesen olvashatod.Szerintem ennek a két funkcionalitásnak nem egy osztályban van a helye. Amivel olvasol (legyen source), az legyen egy külön osztály, valami interface-szel. Ebből lehet leszarmaztatni sok félét, aztán az olvasgató osztályod konstruktorban paraméterként kap egy shared ptr-t egy source-ra. Így lesz raii is, mert az olvasó destruálja a shared ptrt is, ami meg magát az objektumot. A shared ptren keresztül meg hívogathat rajta mindenfélét.
-
EQMontoya
veterán
-
EQMontoya
veterán
válasz
ToMmY_hun #3050 üzenetére
Végezhető munka mellett, de szerintem nem ad annyi hasznos tudást, amennyi szopás van vele.
Főleg, hogy BME-n pl. csak nappalin van, OE-n meg van esti, de sajna eléggé gittegylet.
Ráadásul az értelmes tárgyak leginkább szabadon választhatók, amikkel nem fogsz foglalkozni, ha meló mellett végzed.Szóval én nem vágnék bele.
-
EQMontoya
veterán
válasz
mrhitoshi #3048 üzenetére
Nem fogtam fel teljesen a kódot, de ha jól értem a ciklust, csak akkor áll le a program, ha x==s && y==0 állapot áll fenn egyszerre. (legalábbis egymás epszilon sugarú környezetében van)
Valószínűleg ez nem teljesül valamilyen számítási hiba miatt soha.
Az 1g ram pedig azért van, mert mindig eltárolod az eredményt, de a végtelenségig tárolgatsz.
Valamelyik képleted lesz rossz, ennek pillanatok alatt kellene lefutnia.Erre a részre gondolok:
for (t = 0; 1; t += TIME_STEP)
{
x = get_x(type, v_0, t, alfa, k, m);
y = get_y(type, v_0, t, alfa, k, m);
//A MARGIN szerepe, hogy hova kerüljön a koordináta rendszer, margóként szolgál, és a SIZE adja meg a nagyságát.
draw_x = (int)round(SIZE * (x / s)) + MARGIN;
draw_y = (int)round(fabs(SIZE * (y / max_y) - SIZE)) + MARGIN;
graph_x = (int)round((x / s) * GRAPH);
graph_y = (int)round((y / max_y) * GRAPH);
graph_set(&graph, graph_x, graph_y);
//Itt kapja meg a koordinátákat az .svg fájloknak megfelelő stílusban.
fprintf(f, "%s %d %d ", (t == 0 ? "M" : "L"), draw_x, draw_y);
if (comp(x, s) && comp(y, 0))
{
graph_draw(&graph);
break;
}
} -
-
-
EQMontoya
veterán
válasz
jattila48 #3009 üzenetére
Ez nem a teljesítményről szólt éppen (nyilván erről 10 elemnél nem lehet beszélni), hanem arról, hogy használjuk kihasználjunk olyan működéséket, amik kényelmesek és megkönnyítik a dolgunkat.
Ha gyors kódot akarsz írni, akkor meg static array, ami alapból zero inites, és csinálod rajta ugyanezt.dobragab: kihasználtam az int zero initjét, amit a static array ugyan tud, de tömb vagy vektor nem. Illetve ha megnézed az utolsó mondatomat, a kulcsok rendezettségét és validálását is ki tudod használni.
A map azért elég jó olyan felhasználásra, amikor a kulcsaid csak az értékkészlet kis részét (<20%) fedik le.
-
EQMontoya
veterán
válasz
sztanozs #3006 üzenetére
Valami init kellene annak a randomnak, hogy ne ugyanaz potyogjon belőle mindig.
Amúgy jól elbonyolítottad Te is.
Erre való a map.
Ugye map<int, int>, aztán index operátorral rányomulsz. Mivel van defualt initializaiton a value-ra, ha nem létezett az adott key, és ezt intnél pont 0, ezért nyugodtan lehet indexelni. Másrészt kulcs szerint rendezett, tehát az első elemre, amelyiknél nem 0 a value, megvan a legkisebb generált érték.Valahogy így:
map<int,int> results;
int num_of_even=0;
srand (time(NULL));
for(int i=0; i<11; results[rand() % 11]++,++i);
for(int i=0; i<11; num_of_even += results[i], i+=2);
auto it = find_if(results.begin(), results.end(), [] (const std::pair<int, int>& v) { return v.second > 0; } );És kész is. *kezét összecsapja smiley*
Nyilván a dolog még egyszerűbb amúgy, mert a minimum simán results.begin()-ben van a feltöltés után, de jól esett megírni egy lambdát.
-
EQMontoya
veterán
válasz
Mikeboy666 #2998 üzenetére
Így tudsz randomot generálni.
Nyilván Neked 11-gyes maradék kell majd, hogy 0-10 közé essenek a random számok.A megvalósítás:
Fogsz egy for ciklust, ami 0-től 9-ig fut.
Generálsz egy randomot.
Beteszed a tömbbe.
Hozzáadod az eddigi összeghez.
Ha kisebb, mint az eddigi legkisebb, akkor felülírod az eddigi legkisebbet.
Ha páros, növeled a párost számláló változódat.Nem túl bonyolult.
-
EQMontoya
veterán
válasz
Mikeboy666 #2996 üzenetére
Mi a kérdésed, hol akadtál el?
-
EQMontoya
veterán
válasz
dobragab #2945 üzenetére
A funkcionális dekompozició azért is támogatott, mert ha nincs megszokva, akkor ésszerű esetekben sem fogja csinálni az ember.
Múltkor az egyik versenyre írtunk olyan útvonaltervezést (alapvetően dijkstra alapon), amely:
-std::func-ként vette át a súlyfüggvényt, amit használnia kell
-std::func-ként kaphatott predikátumot, ha nem bizonyos pontra, hanem a legközelebbi, adott feltételt teljesítő pontra akarsz tervezniHa ezt nem szedi szét az ember már az elején, akkor a végén orbitális cumi lesz belőle.
-
EQMontoya
veterán
válasz
jattila48 #2929 üzenetére
Hidd el, az stl cuccok elég jól optimalizáltak, és szerintem a fordítók felé is elég sok hintet tartalmaznak az implementációk. Szóval nem lesz az lassú.
Az meg a pattintott C korszak, hogy mindent megírunk magunknak, főleg a lambda függvények korában. Nyilván lehet fort meg brake-et írni, de a legtöbb esetben felesleges. -
EQMontoya
veterán
Heti golden code:
bool a = (b == c) ? true: false;
-
EQMontoya
veterán
-
EQMontoya
veterán
bool getRandomBool()
{
return rand() % 2 == 1
}
for (int i=0;i<100;++i)
cout << getRandomBool() ? ' ' : 'X';Mit ír ki?
-
EQMontoya
veterán
válasz
jattila48 #2869 üzenetére
The C++ language standard generally allows implementations to perform any optimization, provided the resulting program's observable behavior is the same as if, i.e. pretending, the program was executed exactly as mandated by the standard.
Szóval ott csak addig lesz copy elision, ameddig a copy ctr. triviális, Ha mondjuk van ott egy logolás, akkor simán le fog futni a default ctr majd a copy, mert nem optimalizálhatja ki.
-
EQMontoya
veterán
válasz
ToMmY_hun #2865 üzenetére
class A {
public:
int f();
int (A::*x)(); // <- declare by saying what class it is a pointer to
};
int A::f() {
return 1;
}
int main() {
A a;
a.x = &A::f; // use the :: syntax
printf("%d\n",(a.*a.x)()); // use together with an object of its class
}Ugyanakkor muszáj felhívom a figyelmed, hogy ha ilyet akarsz csinálni, akkor valamit nagyon elb@sztál a tervezésnél, vagy nagyon nem ismersz valami olyan patternt, amivel kiváltható lenne ez a működés. Látatlanban nem tudom, hogy pontosan mi lehet szükséged, de a visitort, decoratort, nézd meg.
-
EQMontoya
veterán
Én azért alapvetően igyekszem távol tartani magam tőle.
Persze, van, amikor kényelmesebb és tényleg van, de láttam már referenciát váró függvényt pointerrel meghívva lefordulni és lefutni az elb..ott konverziós konstruktorok miatt. Szóval amit nem használunk feltétlenül, az legyen explicit, és alap típusok esetén mindenképp. -
EQMontoya
veterán
-
EQMontoya
veterán
Ha az operátor paramétere ugyanolyan típus (vagy - mint jelen esetben - hasonló típus, ami valamelyik template paraméterében eltér), akkor mindegy, mert így is - úgy is jó lesz.
Abban igazad van, hogy teljesen más típus esetén (pl. konstanssal szorzás) nyilván nem célszerű.
Én azért azt vallom, hogy amit nem feltétlen kell frienddel megcsinálni, azt ne csináljuk. -
EQMontoya
veterán
válasz
yossarian14 #2803 üzenetére
Hol száll el, és mivel?
-
EQMontoya
veterán
válasz
yossarian14 #2798 üzenetére
int size = 10*1024*1024
char mybuffer [size];
file.rdbuf()->pubsetbuf(mybuffer,size);
(nyilván a ciklus elé rakva)Ez segít valamit?
-
EQMontoya
veterán
válasz
yossarian14 #2796 üzenetére
Ez nem lesz lassú, ha értelmesen processzálsz. Este tudok csinálni pár tesztet, de ennek nem kellene lassúnak lennie.
Nem a ciklusmagon belüli rész lassú? -
-
EQMontoya
veterán
válasz
ToMmY_hun #2784 üzenetére
RapidXML-t próbáltam, de nem kezeli a string objektumot, csak karaktertömböt, abból meg nem kérek ha nem muszáj.
A a void* azért lenne jobb, mert később még szeretném kiegészíteni a factory-t más osztályokkal is. Emvy kolléga jól látja, a Part-ból származtatott osztályok különböző tagváltozókkal, metódusokkal rendelkeznek, így a sima Part pointer visszatérés még nem elég.
A factory miért nem template class?
Az pedig, hogy a partban nincs megfelelő infó ennek eldöntésére, tervezési hiba.Ha PartSubC mellett lesz egy PatrSubD, ami szintjén jó Neked, akkor 2x fogsz castolni, és még pár módosítás múlva láncolt listát bejáva fogsz castolni (
), vagy lesz egy PartSubVirtualCD osztály, amiből leszármazik mindkettő, tehát az objektumstruktúrádat b@szod szét fölöslegesen?
-
EQMontoya
veterán
Értem, mire gondolsz, de alapvetően az ilyen esetekre is lehet valamilyen attribútumot, vagy egy virtuális függvényt (ez jobb, főleg ha az ősben van deffiniálva mondjuk, és false-t ad vissza, a megfelelő leszármazottban meg true-t), és az lényegesen elegánsabb (és gyorsabb) megoldás, mint a cast. Ha reflection-szerű megoldásra van szükség c++-ban, az gáz, azért van többszörös öröklés, hogy minden megfelelő interface-szel rendelkezhessen az adott osztály.
Emiatt én leginkább hacknek tartom, ami ugyan lehetséges az adott nyelven, de alapvetően nem ajánlott, és inkább tervezési hibára vezethető vissza.
Szerk: Meh, hamarabb írtam a választ, mint az edited.
-
EQMontoya
veterán
válasz
HussarF #2759 üzenetére
Jól értem, hogy Te most a file közepébe szeretnél írni?
Ez nem fog menni sehogy, ne erőlködj.
Ha odaseek-elsz, akkor onnantól írsz a fileba, bármi is van utána.Az ilyen problémákat úgy szokták kezelni, hogy az összes adat, amit menteni akarsz, memóriában van, és mindig kiírod a teljes filet. A beleseekelés írt fileba csak nagyon speciális körülmények között értelmes dolog.
Új hozzászólás Aktív témák
Hirdetés
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- AKCIÓ!!! GAMER PC: Új RYZEN 5 4500-5600X +GTX 1660 SUPER +16-64GB DDR4! GAR/SZÁMLA! 50 FÉLE HÁZ!
- Asus TUF 16 FA607PI - 16" 2,5K 165Hz - Ryzen 9 7845HX - 32GB - 1TB - RTX 4070 - Win11 - 1,5 év gari
- Eladó Logitech G735 gyári dobozban, kiváló állapotban!
- Eladó RODE NT-USB Mini gyári dobozban, megkímélt állapotban!
- Eladó ASUS ROG FUSION II 500 + ASUS ROG THRONE QI gyári dobozban, kifogástalan állapotban!
- Telefon felvásárlás!! iPhone 14/iPhone 14 Plus/iPhone 14 Pro/iPhone 14 Pro Max
- iKing.Hu - Apple iPhone 13 Pro Max - Graphite - Használt, újszerű
- Apple iPhone 7 128GB, Yettel függő, 1 Év Garanciával
- Csere-Beszámítás! Prémium vizhűtéses számítógép! I9 11900K / RTX 3090 / 64GB DDR4 / 1TB SSD
- BESZÁMÍTÁS! 2TB Crucial T500 NVMe SSD meghajtó garanciával hibátlan működéssel
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: Promenade Publishing House Kft.
Város: Budapest