- Az NVIDIA szerint a partnereik prémium AI PC-ket kínálnak
- Két Zen 5-ös dizájnjának mintáit is szállítja már az AMD
- A Colorful "fagyosan kompakt" alkatrészekkel megy elébe a nyárnak
- A Keychron ismét egy űr betöltését vállalta magára az egerek szegmensében
- Az átlagnál vaskosabb ventilátorok kandikáltak ki a Corsair vitorlája mögül
Hirdetés
-
Kapnak egy rakás reklámot a Roblox játékosai
it Videohirdetésekre készülhetnek ezentúl a virtuális világokban a Roblox játékosai.
-
Eleglide C1 - a középérték
ma Szintet lépett az Eleglide, az egyébként egész korrekt M2 után a C1 sokkal komfortosabb közlekedésre alkalmas.
-
Két Zen 5-ös dizájnjának mintáit is szállítja már az AMD
ph A szerverpiacra szánt Turin platform, illetve a mobil szintre nevező Strix Point érhető el a főbb partnerek számára.
Új hozzászólás Aktív témák
-
PandaMonium
őstag
válasz m.zmrzlina #3905 üzenetére
Ettől általánosabb ha ahogy javasolták is, funktorokat használsz.
bool novekvo(float elso, float masodik)
{
return elso < masodik;
}
int cseres(float tomb[],int meret, const std::function<bool(float, float)>& feltetel)
{
float temp=0;
for (int i=0;i<meret-1;i++)
{
for (int j=i+1;j<meret;j++)
{
if(feltetel(tomb[j], tomb[i]))
{
temp=tomb[i];
tomb[i]=tomb[j];
tomb[j]=temp;
}
}
}
return 0;
}Itt a cseres függvény harmadik paramétere egy olyan funktor ami bool visszatérési értékű, és két float paramétert fogad. Ilyen pl. a novekvo függvény ami felette van definiálva. Tehát az a függvény hívás, hogy
cseres(tombom, tombom_merete, novekvo);
teljesen valid.
Pár megjegyzés még, mert írtad, hogy most tanulod a nyelvet:
- C stílusú (float[], int[], stb.) tömböket ne használj, akkor sem ha ezt látod tutorialokban vagy ezt oktatják egyetemen. Modern C++ban ha folytonosan szeretnénk tárolni valamit a memóriában (ahogy a tömb is semmi más mint egy folytonosan allokált memóriaterület) és fordítás időben (azaz a program írásakor, nem futtatáskor) tudjuk mekkora tömb kell nekünk akkor std::array-t használunk, egyébként, ha dinamikus méretű tömbre van szükségünk akkor std::vector -t.
- Jelenleg a kódod csak egy adott típusú tömbre (float) fog működni. Ha template függvényt csinálsz belőle kirakhatod ezt a típust template paraméterbe és akármilyen típusra fog működni - itt persze feltétel lesz, hogy a funktor is ennek a típusnak két példányát fogja fogadni.
- Nincsen kőbe vésve, de konvenció, hogy ha egy konténer két elemét hasonlítjuk össze akkor az az elem kerül az összehasonlítás bal oldalára ami előrébb van a konténerben. Ennek egy logikai összehasonlításkor nincs sok jelentősége, mert legfeljebb megfordítod az operátort (
(a > b) == (b < a)
), de pl. ha funktoroknak adod át a paramétereket akkor fontos, hogy a funktor milyen sorrendben várja az elemeket.[ Szerkesztve ]
What I cannot create, I do not understand
-
PandaMonium
őstag
válasz daninet #3931 üzenetére
Cpp.sh-n kipróbáltam, működik és megáll az elsőnél. Persze az Linux-on fordít GCC-vel.
I/O streamek kezelése mindig macerás, főleg az input kezelés. Sokszor a terminál/shell bufferelni az inputot Linux alatt is, Windows-on pedig külön egy macera az egész.A do-while ciklusodat próbáld meg kicserélni erre a 3 sorra:
cout << "\nGuritashoz nyomj Entert...";
cin.clear();
cin.ignore(10000,'\n');És a \n helyett érdemesebb
std::endl
-t használni cout-ra íráskor az új sorhoz, ez platform független. Arra viszont figyelj, hogy ilyenkor flusholja a streamet, szóval performance hit lehet ha nem jól használod.What I cannot create, I do not understand
-
PandaMonium
őstag
válasz daninet #3947 üzenetére
Állásinterjúra még ne menj vele, de két hét után nem rossz.
Pár apró meglátás, javaslat:
- Printf-et felejtsd el, használd a streameket
- Rand, srand függvényeket szintén felejtsd el, van C++11 óta <random> és szuper(komplikált) randomszám generátor osztály
- Goto-kat függvényhívásokra nagyon egyszerűen ki tudod cserélni
- Olyat nem csinálunk, hogyif (minden_rendben) {} else { hibakezeles; }
, hanem negáljuk a feltételt:if (!minden_rendben) { hibakezeles; }
- Pastebin helyett jobb a Github Gist-je, főleg ha több fájlban van a kódod
- Nagyon hasznos volna újraírnod a mostani kódot objektum-orientált stílusban, osztályokat használva, sokat tanulnál belőleHa lesz újra gépem (valszeg péntek) és szeretnéd megírom neked szépen, modern C++ban, hogy lásd a különbséget és tudj belőle tanulni.
[ Szerkesztve ]
What I cannot create, I do not understand
-
PandaMonium
őstag
válasz dabadab #3949 üzenetére
Nem kell, hogy elsőre megértse miért jobb ha objektum-orientáltan írja meg, csak tudja hogyan kell. Aztán majd ha kicsivel nagyobb fába vágja legközelebb a fejszéjét és belebukik a procedurális paradigmába, lehet magától előveszi az OOP-t.
What I cannot create, I do not understand
-
PandaMonium
őstag
válasz dabadab #3951 üzenetére
Nyilván nem ennyit tanulna belőle. Rögtön jön a header-ekre bontás, akkor az hozza magával az include guardokat, utána osztályon belül scope és láthatóság, statikus adattagok és függvények, getter/setter-ek, öröklődés, stb. Az OOP nagyon nem annyi, hogy "class".
(#3953) emvy: Igen, de ezzel fog a legtöbbet találkozni akkor is ha tutorialokat nézeget, illetve erre épülnek további alapvető (observer, factory, facade, ...) és összetettebb (MVC, ECS, ...) szoftvertervezési minták. Azt mégsem javasolhattam, hogy kezdjen el monad-okról szóló oktatóanyagot keresni funkcionális programozáshoz C++ban.
What I cannot create, I do not understand
-
PandaMonium
őstag
válasz dobragab #3955 üzenetére
Az STL is objektum-orientált, hogy fogja megérteni pl. hogy működnek a file handlerek, vagy smart pointerek, ha nem tudja mi az a konstruktor és destruktor? Vagy, hogy mikor és miért akkor szabadul fel pl. a vector által allokált memóriaterület? Ez nem Java, hogy majd a GC kipucolja, érteni kell a memória allokálás és felszabadítás folyamatát, különben sokszor lábon fogod lőni magad.
Persze, tanuljon algoritmusokat meg konténereket, adatszerkezeteket, de a nyelv szemantikája és a benne használt paradigmák ugyanilyen fontosak. Ezeket sem kell rögtön PhD szinten tudni, csak annyira, hogy értsd amit csinálsz.
What I cannot create, I do not understand
-
PandaMonium
őstag
válasz m.zmrzlina #3965 üzenetére
A '\r' egy carriage return karakter, ami nem feltételnül fog szerepelni a fájlban. Miért keresnél egyáltalán ilyet? ('\n' = új sor, '\t' = tab, ezeket gondolom tudod)
What I cannot create, I do not understand
-
PandaMonium
őstag
válasz dobragab #3986 üzenetére
+1. Nálunk a jobb céges projekteken az volt a szokás, hogy 50 sornál hosszabb függvény nem lehet, egy osztály pedig férjen bele 2-300 sorba. Persze ez inkább iránymutatás volt mint szabály, de sokkal átláthatóbb így a kód és unit testelni is egyszerűbb.
What I cannot create, I do not understand
-
PandaMonium
őstag
válasz mgoogyi #3992 üzenetére
Biztos, hogy nem ez a probléma, különben a for-ciklus el sem indulna (i < v.size() feltétel).Félreértettem amit mondtál, jogos a felvetés.(#3997) gepa7: Örülök, hogy megoldódott, de két apróság. Ha csak a vector mögött levő buffer méretét akarod állítani, anélkül, hogy létrejönnének benne az objektumok vagy változna a v.size(), használd a v.reserve() függvényt. A másik, hogy felejtsd el az egy betűs változókat, mert ettől minden programozó falnak megy, és ha másnap ránézel a saját kódodra már te sem fogod tudni mi micsoda. Nekem is többször át kellett olvasnom a kódodat, hogy megértsem, pedig nem egy bonyolult algoritmus.
Szerk: Az is sokat segít ha konzisztensen formázod a kódodat, behúzások rendben vannak, stb.
[ Szerkesztve ]
What I cannot create, I do not understand
-
PandaMonium
őstag
válasz m.zmrzlina #3999 üzenetére
std::stoi
-val próbáld meg. Minden nem C-s függvény alapvetően az std névtérben van deklarálva.What I cannot create, I do not understand
-
PandaMonium
őstag
válasz m.zmrzlina #4005 üzenetére
Akkor biztos, hogy nem C++11 standard-al fordítasz, mert a kód helyes és a cpp.sh is elsőre fordítja GCC-vel.
Edit: Másik lehetőség, hogy C++11-el fordítasz, de a rendszeren nem C++11es header-ek vannak telepítve valamiért. Próbáld frissíteni a GCC-t (az 5.4 nem mai csirke) és telepítsd fel apt-al a build-essential csomagot.
[ Szerkesztve ]
What I cannot create, I do not understand
-
PandaMonium
őstag
Dobj egy PM-et és megbeszéljük.
(#4016) Bici: Alex Allain: Jumping into C++, majd Scott Meyers: Effective Modern C++. Ha van már programozói tapasztalatod, ezt a kettőt elolvasod 1 hét alatt és tudsz alap/közép szinten C++ozni. Mire a memóriamodellt megérted és megtanulod hatékonyan kezelni a kézzel való allokálást (smart pointereket is ideértve) az sokáig fog tartani.
What I cannot create, I do not understand
-
PandaMonium
őstag
válasz dangerzone #4026 üzenetére
Nyelv független, de teljesen jó, egyre nehezedő feladatokkal. Kicsit matekos lehet a nehezebb feladatoknál, de nem vészes.
What I cannot create, I do not understand
-
PandaMonium
őstag
válasz choco01 #4048 üzenetére
Az objektum-orientált programozás egyik alapelve az enkapszuláció, ami magyarul annyit tesz, hogy mindig csak annyit akarsz láthatóvá tenni egy-egy objektumodból amennyit nagyon muszáj. Alapból minden adattag és függvény legyen privát, akkor legyen bármi is publikus, ha kívülről el akarod érni az adott dolgot.
Konstruktor jelen esetben a
kolcsonzo(char fnev[]);
, ez mondja meg milyen paraméterekkel tudsz létrehozni egy példányt (= objektumot) az osztályodból. Itt egychar[]
-t vár paraméterként a konstruktor, ami egy karaktertömb/karakterlánc. Emiatt így tudsz pl. létrehozni egy példányt a kolcsonzo-ből:kolcsonzo peldany("karakterlanc");
.A destruktor ez a sor:
~kolcsonzo();
.
Ez akkor fog lefutni mikor a példány megszűnik létezni. Ez már kicsit haladóbb téma, de röviden annyit, hogy tudsz objektumokat létrehozni a stack-en és a heap-en is. Minden amitnew
nélkül példányosítasz az a stacken jön létre, amitnew
-al az pedig a heap-en.A stacken létrejövő dolgok automatikusan megszűnnek létezni mikor a stack megszűnik (végetér a
{ }
zárójel), ezzel szemben a heap-en létrehozott dolgok ott maradnak egészen addig amíg meg nem hívod a memóriacímükre adelete
-et. Bármelyik eset is álljon fenn, ilyenkor lefut a objektum destruktora.Ezek nagyon gyakori kérdések, ne jegyzetből tanuld meg őket, csak keress rá, hogy objektum-orientált programozás (object-oriented programming vagy OOP) és kismillió tutorialt fogsz találni.
[ Szerkesztve ]
What I cannot create, I do not understand
-
PandaMonium
őstag
válasz jattila48 #4081 üzenetére
Ahogy már mondták, használj lambdát capture-el. std::function-ben tudod tárolni a lambdádat és továbbadni akár paraméterként. Capture nélüli egyszerű példa:
int main()
{
std::function<int()> x = []() { return 42; };
std::cout << x() << std::endl;
return 0;
}What I cannot create, I do not understand
-
PandaMonium
őstag
válasz jattila48 #4083 üzenetére
Ha kinyitod a cppreference.com-ot akkor látod, hogy az std::function
T* target() noexcept;
metódusával visszakapod a függvény pointert amit úgy hívsz meg ahogy akarsz. Ha nem észt osztani járnál ide (főleg miután te kérsz segítséget), hanem utána olvasnál a dolgoknak előrébb lennél.What I cannot create, I do not understand
-
PandaMonium
őstag
válasz m.zmrzlina #4159 üzenetére
Pl.
#include <iostream>
#include <vector>
#include <string>
template<typename T>
std::size_t sizeOfContainer(const T& container) {
return container.size();
}
int main()
{
std::vector<int> x = { 1, 2, 3 };
std::string y = "foobar";
std::cout << sizeOfContainer(x) << std::endl;
std::cout << sizeOfContainer(y) << std::endl;
return 0;
}Ez a kódrészlet nem működne a string-en, ha nem lenne size függvénye, külön template specializációt kéne rá írni. Egyébként ahogy már írták elsősorban azért van size() függvénye, hogy hasonlítson a containerek intefészére, elvégre a string csak egy karakter container (iterátorai is vannak).
What I cannot create, I do not understand
Új hozzászólás Aktív témák
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!