- Karácsonyfaként világíthat a Thermaltake új CPU-hűtője
- Az USA vizsgálja a RISC-V kínai terjedésének kockázatát
- Kicsit extrémre sikerült a Hyte belépője a készre szerelt vízhűtések világába
- Egészen nagy teljesítményspektrumon fedné le a mobil piacot az AMD
- Kihívás a középkategóriában: teszten a Radeon RX 7600 XT
- Milyen cserélhető objektíves gépet?
- ZIDOO médialejátszók
- Azonnali informatikai kérdések órája
- Egészen nagy teljesítményspektrumon fedné le a mobil piacot az AMD
- Milyen asztali (teljes vagy fél-) gépet vegyek?
- Autós kamerák
- Intel Core i5 / i7 / i9 "Alder Lake-Raptor Lake/Refresh" (LGA1700)
- Gaming notebook topik
- Milyen videókártyát?
- Házimozi haladó szinten
Hirdetés
-
Spyra: akkus, nagynyomású, automata vízipuska
lo Type-C port, egy töltéssel 2200 lövés, több, mint 2 kg-os súly, automata víz felszívás... Start the epic! :)
-
Súlyos adatvédelmi botrányba kerülhet a ChatGPT az EU-ban
it Egyre nagyobb probléma az AI hallucinálása – most az osztrák adatvédelmi hatóság veheti elő a ChatGPT miatt az OpenAI-t, alapvetően a GDPR megsértése miatt.
-
Samsung Univerzum: Így ismerhető meg a Galaxy AI bármilyen telefonon
ma A Try Galaxy webalkalmazás kontrollált környezetben mutatja meg, mit tud a One UI 6.1-es rendszer és a mesterséges intelligencia.
Új hozzászólás Aktív témák
-
-
bandi0000
nagyúr
köszönöm mindenkinek, majd összehozok valamit, hétvégén akartam megcsinálni, de annyira elment ez is, és rengeteg a tanulni való...
Xbox One: bandymnc
-
bandi0000
nagyúr
valaki el tudná magyarázni ezt a 2 dolgot?
a tanár do-while-on belül használta, persze leírta hogy mit csinál, de én sose használtam ezt, és nem éreztem hiányát
cin.clear(); //a hibejelzők törlése, enélkül hiba esetén végtelen ciklusba fut
cin.sync(); //a beviteli puffer szinkronizálása, és a fel nem használt elemek ürítése, enélkül végtelen ciklusXbox One: bandymnc
-
bandi0000
nagyúr
válasz dobragab #3654 üzenetére
elég sok, mert több fajta feladatot csinált egyszerre, de konkrétan ebbe a feladatba volt ez:
/*
###########################################################################################################
# Feladat: #
# Maximum 10 érdemjegy bekérése ellenörzötten/véletlenszámmal feltöltve, #
# - az átlagok kiíratása #
# - a jelesek számának kiíratása #
###########################################################################################################
*/
int i2, db, ossz2=0, jegy[20], jelesdb=0;
do
{
cin.clear(); //a hibejelzők törlése, enélkül hiba esetén végtelen ciklusba fut
cin.sync(); //a beviteli puffer szinkronizálása, és a fel nem használt elemek ürítése, enélkül végtelen ciklus
cout<<"Hány jegyet ad meg?(max.10)"<<endl;
cin>>db;
if (cin.fail() || db<1 || db>10)
{
cout<<"Nem jó érték!\n";
}
}
while (cin.fail() || db<1 || db>10);
//jegyek bevitele billentyűzetről
for (i2=0; i2<db; i2++)//tömbindexálás mindig a 0. elemtől!
{
do
{
cin.clear(); //a hibejelzők törlése, enélkül hiba esetén végtelen ciklusba fut
cin.sync(); //a beviteli puffer szinkronizálása, és a fel nem használt elemek ürítése, enélkül végtelen ciklus
cout<<"Adja meg a(z) "<<i2+1<<". jegyet!"<<endl;
cin>>jegy[i2];
if(cin.fail() || jegy[i2]<1 || jegy[i2]>5)
{
cout<<"Nem jó érték!\n";
}
}
while (cin.fail() || jegy[i2]<1 || jegy[i2]>5);
}
//jegyek bevitele véletlen számokkal
for (i2=db; i2<db; i2++)
{
jegy[i2]=rand()%5+1;
}
cout<<"A beirt jegyek\t\tA generált jegyek"<<endl<<endl;
for (i2=0; i2<db; i2++) //végig kell néznie az öszes jegyet
{
if (jegy[i2]==5)
{
jelesdb++;
}
ossz2+=jegy[i2];
}
cout<<"\nÖssesen "<<jelesdb<<" db jeles van benne.\n";
cout<<"A jegyek átlaga= "<<setprecision(2)<<(double)ossz2/db<<endl;Xbox One: bandymnc
-
bandi0000
nagyúr
válasz dobragab #3658 üzenetére
jah... igen végül is nagy nehezen át lehet látni, csak azokat az ismeretlen vackokat nem tudom mit csinálnak a kódba
na meg ezt is most vettem észre: cin.fail(), ez ha jól tévedek valami bekérési hiba lenne ? pl ha nem olyat akarok tölteni a változóba mint amilyennek lefoglaltam? pl int a-ba beletöltenék egy karaktert?
Xbox One: bandymnc
-
dobragab
addikt
válasz bandi0000 #3659 üzenetére
Naakkor sorolom.
- A bemenet ellenőrzésével erősen ellenjavallott ennyit tökölni. Ha valami nem stimmel, kiírni, hogy szar a bemenet és rage quit. Konzolos program úgyse lesz sose user-friendly, de így elveszik a lényeg a sok marhaság között.
- Ha a
cin.clear()
és acin.sync()
nélkül nem működik egy algoritmus, akkor szar. Ráadásul nem feltétlenül végtelen ciklus, ha kihagyod, csak bizonyos esetekben. Megint csak az van, hogy ne próbálj user-friendly lenni.-
for (i2=db; i2<db; i2++)
Ez így ebben a formában nem csinál semmit. És nem is tudok rájönni, hogy hány darabot kéne randomgenerálni.-
int i2, db, ossz2=0, jegy[20], jelesdb=0;
Ezért dupla nyers hal jár. Egyrészt egy sor, egy deklaráció! Másrészt minden változót akkor deklarálj, amikor szükséged van rá, sose előbb! Ez C++, és kb. minden C89-től különböző nyelv és Linus-tól különböző programozó megengedi.- Tessék mán
for(int i
-t írni, akkor nem kell számozni a ciklusváltozókat (i2
). Lásd előző pont.- A végén az átlagszámítós - ötösszámolós ciklus a lényege az egésznek, azt kellett volna faszán elmagyaráznia a tanárnak. És nem a C++-specifikus beolvasós trükközgetésekkel terhelni az agyatokat, az égvilágon semmi értelme. Feltételezem, hogy nem magyarázta el a lehető legérthetőbben, mert akkor külön for ciklust kaptak volna, ahogy illik.
Így röviden ennyi, ami a kódot érinti.
Na és akkor a kérdésed.
A cin belső flagekben tárolja, hogy volt-e valami hiba a beolvasás során, például ha te számot akartál beolvasni, de a júzer azt írta be, hogy
hesstegfoskód
, akkor a cin nem dob hibát, hanem megjegyzi, hogy valami büdös volt, és te akkor ellenőrzöd, amikor akarod. Ezt acin.fail()
-lel, meg még két hasonló függvénnyel tudod megtenni, mindegyik máskor jelez. Ha a következő beolvasás sikerül, akkor is megmarad a flag, tehát nem írja felül a hibás állapotot. Vagy csak annyit írsz acin.fail()
helyett, hogycin
.if(cin) // nem kell ide semmi, ilyenkor igaz-hamissá konvertálódik
cout << "Minden rendben volt.";
else
cout << "Szar van a palacsintában.";Ezeket a flageket a
clear()
-rel tudod kipucolni, hogy ha az előző beolvasás elfailelt, akkor is lásd, hogy a következő jó-e.[ Szerkesztve ]
Tudom, tudom, akasszak a tökömre egy lámpát, hogy sötétben is tudjak kaszálni.
-
bandi0000
nagyúr
-
PumpkinSeed
addikt
válasz bandi0000 #3662 üzenetére
Egy jó tanács a kezdetekre. Vannak a változóid:
int i2, db, ossz2=0, jegy[20], jelesdb=0;
Ha a jövőben programot írsz akkor törekedned kell arra, hogy a változónevek egyértelműen a funkciójuk alapján legyenek elnevezve. Ez az egyik legnehezebb része a programozásnak. Én például van, hogy 10 percet ülök egy változónév felett.Miért kell ez a baszakodás? - Teszed fel magadban a kérdést. A programozásnak nem az a lényege, hogy egy kódot megírsz, elkészítesz, vagy álmatlan éjszakádon kiokomulálsz és az a végtelenségig tökéletesen fog működni. Olykor-olykor megesik az, hogy fél évvel később vissza kell térned, hogy változtass valamit, és nézed a kódot, ami majd 5000 sor, ahol olyan változók vannak mint a
jegy[20]
vagy a barátai mellette. Na ebben az ilyen esetekre kell normális változó és később függvény, metódus neveket adni.Általában a for ciklus index változóit ami ebben az esetben "i2" (el nem tudom képzelni miért), i-vel szoktuk jelölni, ha véletlen egymásba ágyazott ciklusaid vannak, ami amúgy kerülendő a komplexitás növekedésének elkerülése végett, akkor használhatsz j-t vagy a következő betűket az angol abc-ből.
Törekedni kell az angol elnevezésre is, de ez opcionális. Illetve a camelCase használata változók, függvények és metódusok közben. A camelCase azt jelenti, hogy az első szó kis kezdőbetűs míg a többi nagy, pl.: mintEzItt. Ezt a metodikát követve, illetve értelmesebb neveket adva a változóidnak:
db -> pieceOfSomething // El nem tudom képzelni minek a darabja
ossz -> countOfSomething // Szintén nem tudom minek az összege
jegy -> marks[20] // Mivel tömb ezért többesszámba kell tenni
jelesdb -> countOfALevel // Ez godolom a meglévő ötös érdemjegyek darabszámát jelzi.Ha valaki jobb neveket tud a kód mivoltának tudatában, akkor javítson ki.
"Akinek elég bátorsága és türelme van ahhoz, hogy egész életében a sötétségbe nézzen, elsőként fogja meglátni benne a fény felvillanását." - Kán
-
dobragab
addikt
válasz PumpkinSeed #3663 üzenetére
Törekedni kell az angol elnevezésre is, de ez opcionális.
Igen, de amíg tanul, és kezdő, a kutyát nem zavarja szerintem. Aztán ha már párszáz sornál hosszabb programnak áll neki, akkor "kötelező" az angol változónév.
Illetve a camelCase használata változók, függvények és metódusok közben.
Naaaa, ne jávázzunk pls.
Egyrészt ez is camelCase, másrészt ez is CamelCase. A jávás konvenció a lowerInitialCamelCase. C++-ban ez projetkfüggő, hogyan nevezi el a változókat, de csak egyféleképpen.
Az STL konvenciója egyébként a lower_case_with_underscore...
[ Szerkesztve ]
Tudom, tudom, akasszak a tökömre egy lámpát, hogy sötétben is tudjak kaszálni.
-
bandi0000
nagyúr
válasz PumpkinSeed #3663 üzenetére
értelek, egyrészt még nagyon az elején vagyok, vagyunk és ilyen kis szar kódokhoz én azt nézem, hogy nekem adott esetbe legyen értelmes, persze ha már több feladatot csinálnék akkor nyilván nem így nevezném el őket
másrészt, meg ezt a tanár csinálta én sem értem mi az az i2, én mindig i-j-k-t használok, pláne ha meg nem is egymásba ágyazott ciklusról van szó mint a fenti kódnál, akkor simán használhatta volna tovább az i-t, bár lehet azt akarta hogy ne zavarja meg a többieket
mindenesetre ma megírtuk az első ZH-t, ha nem köt bele mindenbe akkor hibátlan, hozzáteszem azt mondta első órán, hogy őt nem érdekli ha ékezettel vagy anélkül íratunk ki, erre ma mondta hogy pontlevonás lesz érte szerencsére eszembe jutott a setlocalos vacak, és tudtam használni
viszont felmerült egy kis probléma
átlagot kellett számolnom, és mint ahogy a nagykönyve meg van írva így csináltam:
double atlag=0.0;
összegbe benne vannak 0-7 ig összeadva a számok, és 8-al osztottam
atlag=osszeg/i+1;így ahogy kiírattam cout-tal, kerekített, de viszont ha az atlagba beletöltöttem, az összeget, és azt a couton belül leosztottam i+1-el, akkor viszont jó lett és nem egészet írt ki, én bénáztam?
c#-be egyszerűbbnek tűnt nekem, mert %.2f-el vagy hogy irtattam ki 2 tizedesjegyet, meg eleve jobbnak találtam azt is, hogy a %d-t pl bárhova pakoltam, míg cout-nál "körbe" pakolom a változót a szöveggel, hogy oda írja ki a számot vagy bármit ahova akarom
Xbox One: bandymnc
-
cattus
őstag
válasz bandi0000 #3665 üzenetére
így ahogy kiírattam cout-tal, kerekített, de viszont ha az atlagba beletöltöttem, az összeget, és azt a couton belül leosztottam i+1-el, akkor viszont jó lett és nem egészet írt ki, én bénáztam?
Gondolom az
atlag
változódint
típusú, így amikor azatlag=osszeg/i+1;
műveletet elvégzed, a gép egész osztást csinál. Hogy ezt a bugot kijavítsd, az osztás egyik oldalán lévő változót kasztolni kell double típusra:atlag=(double)osszeg/(i+1);
Érdemes továbbá rendesen bezárójelezni a műveleteket.
[ Szerkesztve ]
Do the thing!
-
bandi0000
nagyúr
csak hogy ne hagyjak pihenni senkit...
a kövi problémával szembesültünk, hogy ha egymás után kértünk be számot illetve karaktert, akkor valamiért a 2. ciklus után már csak a számot akarja bekérni...
a tanár magyarázott valamit, hogy valami fügvény nem működik a 2015 visual studioban, ezért írt egy függvényt amibe ha jól emlékszek a cin.sinc,és cin. volt benne, de aztán kiderült hogy nem működik
na már most felajánlott + pontot annak aki tud írni normális függvényt, ami ezt megoldja, na már most nekem nehéz lenne mivel azt se tudom mi nem működik c# alatt sose volt ilyen gondom, de ott igaz a gets()-et használtam
Xbox One: bandymnc
-
-
bandi0000
nagyúr
válasz PumpkinSeed #3669 üzenetére
igen, ezt beírtam, de ugyan úgy csinálja, a 2015-ös verzió legalább is
Xbox One: bandymnc
-
PumpkinSeed
addikt
válasz bandi0000 #3670 üzenetére
Próbáld meg cli-ból fordítani gcc segítségével. Gondolom Windows alatt próbálkozol ezért ez kicsit nehéz lesz. Fel kell tenned egy működő g++-t, majd az alól próbálni:
g++ something.c
[ Szerkesztve ]
"Akinek elég bátorsága és türelme van ahhoz, hogy egész életében a sötétségbe nézzen, elsőként fogja meglátni benne a fény felvillanását." - Kán
-
dobragab
addikt
válasz bandi0000 #3668 üzenetére
A szám beolvasása után dobj bele egy ilyet:
cin >> ws;
Ilyenkor az történik, hogy a szám beolvasásánál te ezt írod be:
"5\n"
A beolvasás megeszi az 5 karaktert, az utána lévő pufferben benne marad az enter. Majd jön a getline, ami enterig olvas. Azonnal megtalálja a pufferben az entert, tehát visszatér üres sztring beolvasása után, mindezt user interaction nélkül.A
cin >> ws
annyit csinál, hogy cin-ről beolvassa és lenyeli az összes whitespace-t, de a többi, értékes karaktert nem. Azért jobb ez, mint a simacin.ignore()
, mert ez azt is le tudja kezelni, ha a user ezt írta be:"5 \n"
(#3669) PumpkinSeed
A clear nem a puffert üríti, hanem a hibajelző flageket
[ Szerkesztve ]
Tudom, tudom, akasszak a tökömre egy lámpát, hogy sötétben is tudjak kaszálni.
-
bandi0000
nagyúr
válasz dobragab #3672 üzenetére
köszi, de még mindig ugyan azt csinálja, vagyis szinte ugyan azt, így gondoltad nem?
cout << "Kerem az " << i + 1 << " karatkerlancot\t:";
cin.getline(valami[i], 9);
cout << "Kerem az " << i + 1 << " szamot\t:";
cin >> tmb[i];
cin >> ws;
cout << valami[i] << "\t" << tmb[i]<<endl;Xbox One: bandymnc
-
sko
csendes tag
válasz bandi0000 #3673 üzenetére
A problémára két egyszerű megoldás létezik.
1. tegyél egy
cin >> ws;
-t acin.getline()
elé.2. használj a második, azaz a szám beolvasásához is
getline()
-t.A lényeg, hogy a getline egy adott delimiterig olvas és azt el kell tüntetni az input buffer-ből, mielőtt a második ciklus eljut a getline()-ig. Azaz egy további "retro" megoldás lehet
3. tegyél egy
getchar()
-t acin.getline()
elé.A getline delimiterét egyébként megadhatod neki harmadik paraméterként. A default értéke '\n'.
-
bandi0000
nagyúr
kellene még 1 ici pici segítség
függvényt szeretnék írni, egy sorba rendezéshez, sorsoltattam számokat egy 6 elemű tömbbe
és a függvény így nézne ki :void rendez(int tmb[6])
{
int i, j, csere;
for(i=5;i>0;i--)
for (j = 0; j < i; j++)
{
if (tmb[j] > tmb[j + 1])
csere = tmb[j];
tmb[j] = tmb[j + 1];
tmb[j + 1] = csere;
}
}de nem csinálja meg, vagyis meghal a program, nem vagyok biztos benne hogy jól adtam meg az első sort
Xbox One: bandymnc
-
-
cattus
őstag
válasz dabadab #3680 üzenetére
Gondolom felsőoktatásban tanul a kolléga, ott meg úgy kezelik az első félévben az embereket, mintha 0 előismeretük lenne (legalábbis nálunk ez a bevett forma). Persze ha valaki már előrébb tart, akkor eléggé zavaró lehet ilyen primitív eszközökkel dolgozni, de ha normális a képzés, akkor túllépnek ezeken.
Nem hiszem, hogy ne tanítanák az STL-t, csak nem az elején. Nyilván az ilyen egyszerűbb adatszerkezeteket egy kezdőnek könnyebb megérteni.Do the thing!
-
bandi0000
nagyúr
így van, fősulin(egyetemen) tanulok, középsuliba C# ment, most meg gyakorlatilag ahogy írom az úgy van ahogy tanítják
érdekes amúgy, mert cout,cin-t tanítják és mellé a tömböket, szóval én sem értem teljesenés igen, az if-nél volt a hiba, szóval köszönöm, azt hittem simán rosszul írtam meg de akkor nem
[ Szerkesztve ]
Xbox One: bandymnc
-
dabadab
titán
Akkor még egyszer: a C++ oktatásban a C tömb olyasmi, aminek semmi keresnivalója a kezdőanyagban. Az olyan dolog, ami már valami advanced classben jöhet elő, mint különleges nyelvi feature, kb. úgy, mint mondjuk a placement new.
A kezdőknél, amikor tömbökről van szó, akkor STL konténerek.[ Szerkesztve ]
DRM is theft
-
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?[ Szerkesztve ]
Same rules apply!
-
bandi0000
nagyúr
bocs hogy megint itt vagyok a hülye kevert kódommal, de nem nagyon tudok máshonnan segítséget kérni
megoldható hogy függvényként rakjak ki egy random szám generálást?
lehet én írtam meg rosszul/és vagy rosszul gondoltam hogy meg lehet oldani
meg ugye nem tudom hogy kéne átadni a később meghívott tömbömnek azt az értéket amit most a tmb[2
-be rak
ezt írtam, de természetesen nem jó, sejtem hogy mi a baj, de nem tudom megoldani, jól gondolom azt is, hogy mivel az int main-en belül van a srand ((unsigned)time(NULL)); ezért is nem működhetne?void sorsolas(int tmb2[6])
{
int szam, i, j;
do
{
szam = rand() % 45 + 1;
j = 0;
while (tmb2[j] != szam && j < 6)
{
j++;
}
if (j == 6) { tmb2 = szam; i++; }
else i--;
} while (i != 6);
}[ Szerkesztve ]
Xbox One: bandymnc
-
dobragab
addikt
válasz EQMontoya #3686 üzenetére
Klasszikus értelemben vett hibát egyet sem. Olyat viszont, ami a költő hozzá nem értéséről tanúskodik, többet is.
- Az osztály elnevezése. Ha kommentben kell jelezni, hogy ez bizony
XMLParsingException
, tessék már úgy is nevezni az osztályt. Bár ahogy nézem, itt az osztálynevek módosítva vannak, nem hiszem, hogy az XML-t kiszedted volna belőle.-
std::string
-et érték szerint átvenni a konstruktorban. Elvileg nem baj, sok esetben érdemes így csinálni C++11 óta, ha ugyanis aBaseException
-nek vanstd::string&&
-es konstruktora, egy füst alatt csinálhatsz string-et másoló és mozgató konstruktort, ha az inicializáló listán ezt írod:BaseException{std::move(error_)}
.Mivel pl. az
std::runtime_error
-nak nincs ilyen konstruktora, és az egész kódból sugárzik, hogy C++98-ban írták, így erős a gyanúm, hogy itt csak egy felesleges másolást látunk. Plusz sose szerencsés, ha exception dobása közben dobódik egy másik a másolásnál, mert pl. elfogyott a memória. Ezt viszont nem lehet teljesen kikerülni.- Kézzel forward-olni a konstruktort, mint az állatok. Ráadásul rosszul, lásd előző pont. C++11 óta illik így írni:
using BaseException::BaseException;
- Copy ctor kézzel, mint az állatok. Ha valami magic-et csinál ott, még elfogadható, de akkor az op=-nél is illene, meg amúgy is minek. Ez egy sima kivétel-osztály, az ilyen szarság csak hibalehetőség.
- Virtuális destruktor a leszármazottban. Feltételezem, csak azért csinálta, hogy a destruktort virtuálisnak deklarálja, annak meg így semmi értelme, azt az ősben kellett. Ha a destruktora nem üres, komoly indok kell az egészhez, de attól még lehet jó.
-
throw()
. Már a C++98 szabványosítás körül kiderült, hogy athrow(...)
deklaráció szar, elavult, nincs értelme, csak ront a helyzeten. 2016-ban még "karban tartják" ezt a kódot, és ilyen van benne. Athrow()
ráadásul inkompatibilis anoexcept
-tel, tehát ha tényleg rögzíteni és vizsgálni kell, hogy egy függvény dobhat-e, ez a kifejezés false lesz.if(noexcept(e::~ParsingException())) // ...
- Kivételdobásról nyilatkozni destruktorban. Egyrészt ha konstruktorban bármi dobódik, az
std::terminate
. Másrészt, hathrow
deklaráció sérül, az isstd::terminate
, tehát a destruktornál pontosan ugyanaz történik, akármit nyilatkozik ott. Még hanoexcept
-et ír, az is ugyanazt jelenti, mintha semmit nem ír oda.- Az egysoros tagfüggvények definícióját kiviszi másik forrásfájlba. Ugyan már, kinek fáj, ha inline? Feltételezem, egyikben történik semmi eget rengető, tehát egyrészt a nagy semmiért egy egész függvényhívás lesz (pl. a destruktornál). Másrészt az olvasót baszogatja a tudat, hogy meg kéne nézni, mi van a cpp fájlban, pedig sejti, hogy valószínűleg semmi különös, amiért érdemes lenne megmozdítani az ujját.
Szóval röviden ennyi. Nálam így nézne ki ez az osztály:
struct XMLParsingException : public BaseException
{
using BaseException::BaseException;
};[ Szerkesztve ]
Tudom, tudom, akasszak a tökömre egy lámpát, hogy sötétben is tudjak kaszálni.
-
bandi0000
nagyúr
Nem tom emlékeztek e ráde ajánlottátok a cin>>ws;-t a white space lenyelésre, viszont ez csak akkor működik ha kevesebb karakter ütök be mint a tömb méret, vagyis char tmb[5]= abc
De ha már abcd-t irok, akkor megint csak átugorja a számbekérést, mondjuk string-el nem próbáltamXbox One: bandymnc
-
ToMmY_hun
senior tag
Bedobok egy témát, ami szerintem megér egy kisebb beszélgetést. Nektek mi a véleményetek az osztályok unit teszteléséről? Az alap feltevés az, hogy mi a helyzet akkor, ha szükségünk van más osztályokra, amit például init list-en példányosít a tesztelni kívánt osztályunk? Ilyen esetben valahogy setelni kell a tagváltozókat a mockolt objektumokkal. Tudom, hogy ez egy jól ismert probléma és számos megoldás létezik rá, viszont a kérdés az, hogy szerintetek melyik megoldás az, amelyik a leginkább elfogadható - nagy általánosságban?
[ Szerkesztve ]
C programmers never die, they are just cast into void.
-
pvt.peter
őstag
Sziasztok,
Én is bedobnék egy témát
Egy void* típusú pointert hogyan lehet valid típusra castolni?
Tehát adott egy void* típusú pointer ami reprezentálhat több egymással semmilyen kapcsolatban nem álló típust ami szintén egymással semmilyen kapcsolatban nem álló interfész megvalósítása.
Hogyan tudom a valódi típusára castolni ezt a szerzeményt?
Jöhet bármilyen ötlet, amikre én gondoltam azok eléggé csúnyácskák voltak.Jelenleg nem tudok erre valid es relatív "szép" megoldást.
A kérdés az, hogy ti esetleg tudtok-e erre vmit?
Ez egy .50-es rombolópuska, elég szép visszarúgással.
-
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?Same rules apply!
-
dabadab
titán
válasz pvt.peter #3692 üzenetére
"Tehát adott egy void* típusú pointer ami reprezentálhat több egymással semmilyen kapcsolatban nem álló típust ami szintén egymással semmilyen kapcsolatban nem álló interfész megvalósítása."
Hát, ez így első nekifutásra az "elbaszott design" c. kategóriába való, ezt szépen nem lehet megoldani.
DRM is theft
-
pvt.peter
őstag
válasz EQMontoya #3693 üzenetére
Mentségemre legyen, hogy ez egy 3rd party *.dll egyik callback függvényének a paramétere.Én is érzem, hogy eléggé fos megoldás...
Persze szebben is megcsinálhatták volna, pl. a paraméter legyen egy interfész amit a saját típusaimmal megvalósíthatok, utána kedvem szerint castolhatok. Vagy az interfészt megvalósító típusba becsomagolni a saját cuccomat.Az egyetlen egy talán még szép megoldás erre az, hogy két ugyanolyan callback szignatúra lesz csak más névvel, és adott feladat elvégzésére mindig beállítgatom, hogy melyik callback hívódjon meg.
Mindenesetre köszönöm szépen mindenkinek a válaszát
[ Szerkesztve ]
Ez egy .50-es rombolópuska, elég szép visszarúgással.
-
dobragab
addikt
válasz pvt.peter #3696 üzenetére
Jól értem hogy az a
void*
valami userdata, amit a callback regisztrálásánál megadhatsz, és amikor visszahívódik, akkor a callback megkapja? Mert akkor különböző callback-eket érdemes regisztrálni a különböző típusú user data-hoz.void A_callback(void * data)
{
A& a = *static_cast<A*>(data);
// ...
}
void B_callback(void * data)
{
B& b = *static_cast<B*>(data);
// ...
}
register_callback(A_callback, &a);
register_callback(B_callback, &b);Ha ez a helyzet, akkor még lehet rajta ezen túl is szépíteni, elsősorban annak függvényében, hogy a
// ...
részeknek egymáshoz van-e bármi köze. Ha mégsem, légyszí mutass valami példakódot, akár mockolt osztálynevekkel.Tudom, tudom, akasszak a tökömre egy lámpát, hogy sötétben is tudjak kaszálni.
-
pvt.peter
őstag
válasz dobragab #3698 üzenetére
Szia,
Köszönöm a válaszodat, én is pont ugyanerre jutottam.
Sajnos a kialakítás nem teszi lehetővé, hogy ennél rugalmasabban legyenek lekezelve a különböző igények.A példakódról annyit, hogy ezt Te magad már be is írtad
Ez egy .50-es rombolópuska, elég szép visszarúgással.
Ú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!
- Xiaomi 13T és 13T Pro - nincs tétlenkedés
- Milyen cserélhető objektíves gépet?
- Milyen routert?
- Motorola Edge 40 - jó bőr
- ZIDOO médialejátszók
- Kerékpárosok, bringások ide!
- Békéscsaba és környéke adok-veszek-beszélgetek
- BestBuy topik
- Apple AirPods Pro (2. generáció) - csiszolt almaságok
- Gyúrósok ide!
- További aktív témák...