- AMD K6-III, és minden ami RETRO - Oldschool tuning
- ASUS ROG Ally
- DUNE médialejátszók topicja
- Milyen egeret válasszak?
- Házimozi belépő szinten
- Hobby elektronika
- Fejhallgató erősítő és DAC topik
- AMD Ryzen 9 / 7 / 5 / 3 5***(X) "Zen 3" (AM4)
- Milyen processzort vegyek?
- A hardverek is nehezen viselik a kánikulát
Új hozzászólás Aktív témák
-
EQMontoya
veterán
válasz
DrojDtroll #4223 üzenetére
Es amikor a 4s-t mered, akkor mit ir ki?
-
EQMontoya
veterán
válasz
DrojDtroll #4220 üzenetére
Unixon merj, time paranccsal.
-
EQMontoya
veterán
válasz
Ron Swanson #4163 üzenetére
Neked nem c++ kerdesed van, hanem algoritmikai, adatszerkezeti,
Eloszor is gondolkozz.
Tarolnod kellene valahol az orhelyeket. Mondjuk tombben, mert azt tudod indexelni.
Tehat beolvasol egy orseget (ami egy szam), azzal indexeled a tombot, igy oda be tudsz rakni egy orseget.Neked nem a
sorszam[I]
-be kell beolvasnod, hanem beolvasol egy intbe, es azzal indexeled a tombot.Utana meg kell talalnod, hogy hogyan lehet optimalisan lefedni az egeszet. Ehhez gondolkodni kell kicsit, de gondolkodni nem fogunk helyetted, a c++ reszeben segitunk szivesen.
-
-
EQMontoya
veterán
válasz
kemkriszt98 #4037 üzenetére
Ezt nem siekrült felfognom. Melyik esetben mi nem hívódik?
A const referencia paraméter pedig természetesen vonaktozik az operator=-re is.
-
EQMontoya
veterán
válasz
kemkriszt98 #4035 üzenetére
A copy konstruktorodnak referencia szerint (és konstansként) kellene átvennie a paramétert.
-
EQMontoya
veterán
válasz
m.zmrzlina #4003 üzenetére
Szerezz be egy tisztességes fejlesztőkörnyezetet, amiben van használható fordító.
GCC 4.9.2 Linuxon amúgy hibátlanul lefordítja. -
EQMontoya
veterán
válasz
m.zmrzlina #3915 üzenetére
Inicializálod ezt:
bool isEntryValid=true;
cin>>entry;
if(entry < 1 || entry > 100 )
{
isEntryValid=false;
system("cls");
}Nem olvasol be semmit az entrybe, mert a betű nem szám. Az inputon pedig ott marad a betű, tehát nem üres, sikerül a következő beolvasás is.
while (isEntryValid==false);
Ez meg továbbra sem állítja le.
A megoldás: stringbe olvasunk be, azt konveráljuk számmá. Ha nem sikerül, lehet hibát dobni.
-
-
EQMontoya
veterán
Én is azon gondolkodtam este (némi privát üzenetetek váltását követően), hogy hogyan lehetne ezt kivédeni. Mert ha ctorbab b@ssza el az ember az init sorrendet, arra ugye van warning, egyértelmű user error.
Ezt viszont már nem veszi észre a fordító, mert az a-t inicializálni próbáló fv. dependál b-n.
Tehát warning nem lesz, viszont irgalmatlan szívás igen.Ugye először lehetne még jönni azzal, hogy ctorból nem hívogatunk tagfüggvenyeket, de nem virtuálisakat nyugodtan lehet.
Talán a legnagyobb probléma itt az, hogy a ctor valami olyat próbál csinálni, ami nem teljesen feladata, de ez megint megfoghatatlan.
-
EQMontoya
veterán
válasz
dobragab #3821 üzenetére
Hát, ha ez egy value szerinti capture (
[=]
), akkor az eredeti X-et nem módosíthatja, hanem csinál egy copyt.
Ez kvázi egy private member lesz abban a function objectben, amit a lambdából csinál a fordító. Mutable meg gondolom, azért lett, mert különben nem fordult, mert a saját privát X copyját nem illene módosítania.
Szóval szerintem 0-t ír ki, és mutalbe nélkül nem fordul. -
EQMontoya
veterán
-
EQMontoya
veterán
válasz
dobragab #3775 üzenetére
az viszont bool-ra (nem tudom pontosan, miért).
4.12 Boolean conversions
1 An rvalue of arithmetic, enumeration, pointer, or pointer to member type can be converted to an rvalue of type bool.
Szóval azért, mert nincs más konverzió, amit csinálhatna vele. Pointer -> int nincs impliciten. Igen, szerintem is béna.
-
EQMontoya
veterán
int stringCompareIgnoreCase(const std::string& str1, const std::string& str2)
{
auto CharDiff = [](char c1, char c2)->int
{ if (::tolower(c1) < ::tolower(c2)) return -1;
if (::tolower(c1) == ::tolower(c2)) return 0;
return 1; };
int diff = 0;
int size = std::min(str1.size(), str2.size());
for (size_t i = 0; i < size && 0 == diff; ++i)
{
diff += CharDiff(str1[i], str2[i]);
}
if (0 != diff) return diff;
if (str2.length() == str1.length()) return 0;
if (str2.length() > str1.length()) return 1;
return -1;
}Műanyagkéssel vagdosom az ereket a karomon keresztbe.
-
EQMontoya
veterán
bool foo(const std::string& bar)
{
return (!A::B(bar)) ? false : true;
} -
EQMontoya
veterán
válasz
pvt.peter #3692 üzenetére
Erre nincs szép megoldás.
Minden egyes alkalommal, amikor void*-ot castolsz valamire, egy éhező kisgyerek élve felfal egy kiscicát.
Ha egy függvény argumentuma void*, és az nem egy memóriakezelésért felelő függvény, akkor ott komoly tervezési hibák történtek. Minden egyes alkalommal, amikor egy ilyet lefordítasz, az univerzumban felsír egy feketelyuk és szegény Bjarne-nek kicsit szúrni kezd az oldala.
C++-ban void*-ot csak a gonosz azon teremtményei használnak, akik az ősi feketemágia (C) hívei továbbra is. Ha nem küzdünk ellenük, egyszercsak azt vesszük észre, hogy már nem tudjuk megállítani a világuralomra törésüket, és mindannyiunkat birkává fognak static_castolni. Ezt Te sem akarod, ugye? -
EQMontoya
veterán
#include <Base/BaseException.H>
namespace A { namespace B { namespace C
{
/** Exception represents a problem during parsing of the XML fragment */
class ParsingException : public BaseException
{
public:
ParsingException(std::string error_);
ParsingException(const ParsingException& aCopy_);
virtual ~ParsingException() throw ();
};
}}}
Ki hány hibát vél felfedezni a fenti kódban? -
EQMontoya
veterán
válasz
bandi0000 #3643 üzenetére
Arra miért nem jó egy másik shuffle?
De ha nem akarsz shuffle-t használni:
std_vector<int> nums;
std_vector<int> results;
for(int i=1;i<=90; ++i)
{
nums.push_back(i);
}
for(int i=0;i<5;++i)
{
int rand_index = //generálsz egy randomot 0 és nums.size()-1 között.
result.push_back(nums[rand_index]); //berakod a generált számot a végeredmény containerbe
std::vector<int>::iterator it = ( nums.begin() + rand_index ); //szerzel egy iterátort az indexelt elemre
nums.erase(it); //ezt az elemet törlöd a containerből
}A fenti megoldásnak az az előnye, hogy amit egyszer kisorsoltál, azt ki is veszed, így legközelebb egyel kisebb méretű vektorban sorsolsz, ami így nem is fog tudni ütközni.
-
-
EQMontoya
veterán
valami t = (j + 946684800000000000LL) / 1000000000LL;
Aki először megmondja, hogy mi ez, az vendégem egy csatos bambira.
-
EQMontoya
veterán
válasz
ToMmY_hun #3567 üzenetére
A "const" csak a változó állandó értékéért felel, míg a "static" azért, hogy csak egy példány jöjjön létre?
Pontosan.
Ha const tagja van, az az jelenti, hogy csak konstruktorban kaphat értéket, de több példánynak lehet különböző értékű ilyen tagja.
Ha static, akkor minden példány ugyanazt az egyet példányt látja az adott tagváltozóból, ami kvázi a program indulásánál kap értéket. -
EQMontoya
veterán
Belsős workshoprul, publikusan:
Arról volt szó, hogy hogyan lehetne okítani a népet, aki már valamennyire tud c++-ul, illetve milyen egységes coding standard-et és hasonlókat lehetne felállítani.
Bjarne nagyon annak a pártján állt, hogy legyen egységes coding guideline, és a Microsoft meg a gnu fordítók is sok checkert be fognak tolni az új dolgokkal kapcsolatban, meg a coding quideline betartásához warningokat, de ez egyrészt még sok idő, másrészt ami ennyire univerzális, az nem szokott túl jól működni.
Szóval nekem úgy tűnt, hogy Ő ilyen békés professzorként szemléli ezt a kérdést, nekünk meg kicsit gyakorlatiasabb hozzáállásra van szükségünk, ezért annyira nem volt produktív a dolog.
Jó arc amúgy az öreg, meg humora is van valamennyi.Abban mondjuk nagyon egyetértettünk, hogy az ilyen self-made manek sokkal többet ártanak, mint használnak: széthackelt, látszólag rommá optimalizált kódot írnak, amivel persze a compiler féle optimalizációkat lehetetlenítik el, és a végeredmény egy olvashatatlanabb kód, ami még lassabb is lesz.
Lásd: az egyik baromarc a cégnél írt saját bitsetet. Komoly munkával összetákolta, majd kicseréltük boost-osra, és 60%-kal gyorsabb lett. -
EQMontoya
veterán
válasz
dobragab #3518 üzenetére
Egy szempontot kihagytál, már ha nem csak vektorról van szó.
Mégpedig azt az esetet, amikor az emplace lehet sikertelen: pl. setbe beszúrás. Ott jelentős különbségek vannak.Egyébként a move ctor témája érdekes, de ezzel sok probléma van. Ugye a legfőbb ok a nem generálódásra a user-defined copy ctr, ami elég gyakori. És amikor egy régi kódot átvisznek c++11-re, ott a pék se fogja utólag megkeresni és megírogatni..
A push_back vs. emplace_back témakörre: szerintem alapvetően másra szánták, és itt a jogászokhoz hasonlóan úgy gondolkodom, hogy nem csak az a lényeg, hogy pontosan hogyan működik betűről betűre, hanem hogy mire szánták. Márpedig ez itt szerintem jól jelzi a különbséget: push_back, ha már létezőt akarsz belerakni, emplace pedig ha benne akarsz konstruálni.
Ezzel pedig nagy bakot sem lehet lőni.A unique_ptr-es példára reflektálva: persze, ott nem az emplace_back a hibás alapvetően, de a unique_ptr<T> (T *p) egy explicit ctor! Tehát az emplace_back itt csúnyán elfedi, hogy Te épp hatalmas hülyeséget készülsz csinálni. Olyat, ami amúgy le sem fordulna.
-
EQMontoya
veterán
Beszéljünk az emplace_back vs. push_back témakörről.
Tegnap felvetette az egyik arc, hogy használjunk mindenhol emplace-t, elvégre úgyis rendelkeznie kell az osztálynak copy-construktorral, tehát mindenhol olyan gyors lesz, vagy gyorsabb, mint a push_back.Nekem ez így annyira nem tetszett, mert az emplace helyben konstruálásra való, az igazából egy elég fura mellékhatás, hogy copy-ctr miatt igazából használható push_back helyett is.
Jött a kérés, hogy akkor írjak olyan esetet, amikor nem ajánlott az emplace. Írtam:
#include <iostream>
#include <vector>
#include <memory>
class A
{
public:
bool mb;
explicit A(bool b): mb(b) {}
};
int main()
{
A* ap = new A(false);
std::vector<A> vec;
vec.emplace_back(ap); //this compiles without warning - sooooo bad!
//vec.push_back(ap);
std::vector<std::unique_ptr<A>> uptr_vec;
uptr_vec.emplace_back(ap);
delete ap; //busted
} -
EQMontoya
veterán
Napi fail:
double _cumQty;Pedig nem is a doklernél dolgozom, bakker!
-
EQMontoya
veterán
válasz
dobragab #3418 üzenetére
Anno én is így voltam ezzel, amikor még fiatal voltam, és balga. Ugyanakkor rengeteg olyan probléma van, amire a manapság használt, erősen típusos és fordított nyelvek (c++, java, c#) egyszerűen túl komplikáltak, nehézkesek sok esetben. Szóval jött a shell sript, majd a Python.
Pl. ki akarok szedni A mappából minden olyan filet, aminek a neve illeszekedik egy regexre, a héten volt módosítva és nem tartalmazza az "aszpartam" szót.
Vagy pl. egy logfilet kellett bányásznom, abból kiszedni bizonyos sorokat, azokból bizonyos adatokat, ebből gyártani egy html táblázatot és azt elküldeni mailben. Ezt meg lehet oldani persze javaban is, de Pythonban "kicsit" kényelmesebb. -
EQMontoya
veterán
-
EQMontoya
veterán
válasz
bandi0000 #3382 üzenetére
A scanf egy C-s őskövület szar, amivel igazából csak magadat szopatod, mert amilyen csúnya a szintaxisa, olyannyira kényelmetlen is használni.
Neked pedig ennyire van szükséged:
#include <fstream>
std::ifstream infile("thefile.txt");
std::string line;
while (std::getline(infile, line))
{
//itt a line-ban kapod meg a file aktuális sorát
} -
EQMontoya
veterán
válasz
bandi0000 #3380 üzenetére
de 3 héttel érettségi előtt nem nagyon akarok már új dolgot tanulni, de azért köszönöm
Kb. egy óra megtanulni és tök kényelmesen használható.
Ezt a hozzáállást meg felejsd el sürgősen, egyetemi vizsgákra még a vizsga előtti éjszaka is fogsz újat tanulni! Nah, uzsgyi!
Ha nem megy, kérdezz és segítünk. -
EQMontoya
veterán
válasz
dobragab #3348 üzenetére
Amivel nem csinálsz semmit, mert nem kerül bele a coutba!
Egyébként az első sor önmagában nyilván nem csinál semmit, elvégre a C elején az A rész van.
A virtuális desktruktorral (és bármi egyéb virtuális függvénnyel ugyanúgy) viszont behozol egy vptr-t a class elejére, tehát az elején már nem A lesz. -
EQMontoya
veterán
-
EQMontoya
veterán
#include <iostream>
class A
{
public:
A() : m_i(0) { }
protected:
int m_i;
};
class B
{
public:
B() : m_d(0.0) { }
protected:
double m_d;
};
class C
: public A
, public B
{
public:
C() : m_c('a') { }
private:
char m_c;
};
int main()
{
C c;
A *pa = &c;
B *pb = &c;
const int x = (pa == &c) ? 1 : 2;
const int y = (pb == &c) ? 3 : 4;
const int z = (reinterpret_cast<char*>(pa) == reinterpret_cast<char*>(pb)) ? 5 : 6;
std::cout << x << y << z << std::endl;
return 0;
}Aki futtatás nélkül helyesen mondja, hogy mit ír ki (és hogy miért), az előtt emelem kalapom.
Be kell valljam, nekem is le kellett futtatni 1x, hogy megértem, mi történt. -
EQMontoya
veterán
Igazából két különbség van az osztály és a struktúra között, de az is lényegében csak egy:
-Stuktúrában public a default láthatóság, classban private.
-Szemléletbeli: struktúra már C-ben is volt, igaz, sokkal limitáltabb funkciókkal, nem tudott osztályként működni. C++-ban mindent tud, amit az osztályok, a fentebbi minimális különbséggel. Ennek ellenére alapvetően classokat használunk, leginkább a szemlélet okán. Vannak esetek, amikor szokás struktúrát, ez alapvetően az, amikor csak egy kupac adatot szeretnénk egybe kezelni (pl. egy függvény adna vissza öt különböző dolgot, akkor annak nyilván nem öt referencia paramétere lesz, hanem valahogy összepakoljuk a dolgot), és nincsennek a dolognak tagfügvényei, illetve nem szeretnénk belőle elrejteni semmit. Igen, ez kb. az, amire C-ben is használtuk a structokat, erre nyugodtan lehet C++-ban is.Mint látod, az egész inkább konvenció, mint gyakorlati különbség.
-
Ú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!
- AZONNALI SZÁLLÍTÁS Eredeti Microsoft Office 2019 Professional Plus
- ÁRGARANCIA!Épített KomPhone i5 10600KF 16/32/64GB RAM RTX 3050 6GB GAMER PC termékbeszámítással
- PlayStation Plus Premium előfizetés 3291 Ft / hó áron!
- Részletfizetés , Acer Nitro V 15 minimálisan használt uj állapot sok garancia
- Bomba ár! HP EliteBook 2540P - i5-540M I 4GB I 250GB I 12,1" WXGA I W10 I Garancia!
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: CAMERA-PRO Hungary Kft
Város: Budapest