- 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
- Melyik tápegységet vegyem?
- Amlogic S905, S912 processzoros készülékek
- Házi barkács, gányolás, tákolás, megdöbbentő gépek!
- HiFi műszaki szemmel - sztereó hangrendszerek
- Milyen CPU léghűtést vegyek?
- AMD Ryzen 9 / 7 / 5 7***(X) "Zen 4" (AM5)
- Az NVIDIA szerint a partnereik prémium AI PC-ket kínálnak
- Kormányok / autós szimulátorok topicja
- Kihívás a középkategóriában: teszten a Radeon RX 7600 XT
- Milyen monitort vegyek?
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.
-
A Colorful "fagyosan kompakt" alkatrészekkel megy elébe a nyárnak
ph A vállalat többek között egy slim profilos léghűtővel, egy helytakarékos táppal és egy ITX-es házzal adott magáról életjelet.
Új hozzászólás Aktív témák
-
kispx
addikt
válasz m.zmrzlina #3899 üzenetére
Úgy, ahogy az std-ben szerepel: paraméterként átadod a rendezés feltételét.
Szer.: A "legjobb módszer" általában kontextusfüggő. Egy másik megközelítés: az utolsó paramétert lecseréled egy
bool isAscending
paraméterre. Így az olvasónak egyértelműbb, hogy mire szolgál az utolsó paraméter és nem is kellene külön függvényt írni a rendezés feltételeként.[ Szerkesztve ]
-
b.kov
senior tag
válasz m.zmrzlina #3899 üzenetére
Esetleg használhatnál funktorokat, ebben az esetben ideálisak lehetnek.
Ha nem ismernéd, akkor kb ennyit csinál:
A functor is pretty much just a class which defines the operator(). That lets you create objects which "look like" a function:Lényegében csinálsz 2 struct-ot (Less, Greater), amiben túlterheled a () operatort. Ekkor a csere függvényed sablonargumentuma lehetne pl. Compare, az utolsó függvényargumentum pedig ilyen Compare típusú.
Ha bővebben érdekel a téma: C++ jegyzet, 71. oldal (Funktorok).
[ Szerkesztve ]
-
dabadab
titán
válasz m.zmrzlina #3902 üzenetére
A legegyszerűbben a ternary operatorrel:
if( isAscending ? tomb[j]<tomb[i] : tomb[j]>tomb[i] )
{
...
}vagy ha rövidebb, de olvashatatlan kódot akarsz, akkor meg Bool logikával (mondjuk ez annyiban viselkedik másként, hogy ha az isAscending false, akkor az egyenlő értékeket is felcseréli, szóval valamivel lassabb, mint a fenti):
if( isAscending == (tomb[j]<tomb[i]) )
{
...
}[ Szerkesztve ]
DRM is theft
-
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
-
Domonkos
Ármester
válasz m.zmrzlina #3907 üzenetére
Ezek a fuggvenyek lehetnek
void
ok. Abban az esetben lehet ertelme hogy plint
visszateresi erteke van, ha meg szeretned mondani, hogy hany elemet sikerult kiirni, vagy egyeb hibajelzest szeretnel visszaadni... bar c++-ban mar vannak erre is "fejlettebb" eszkozok, mint a try-catch-es kivetelkezeles stb.[ Szerkesztve ]
Gender of electrical connectors is defined by the pins.
-
Domonkos
Ármester
válasz m.zmrzlina #3908 üzenetére
En irnek ra egy kulon osztalyt ami tartalmazza a szukseges inputokat es elvegzi a megfelelo validaciokat is.
Minden egyes bekert dolognak lenne egy megfelelo adattagja az osztalyban, egy hozza tartozo fuggveny ami bekeri, ellenorzi es beallitja azt (setter), valamint egy olyan amivel ki lehet azokat olvasni (getter) vagy hibat irni, ha nem sikerult az olvasasig ertelmesen beallitani.
Es akkor azt is meg lehtne tenni, hogy asortSwap()
nem 3 kulonbozo parametert var, hanem egy ebbol az osztalybol szarmazo peldanyt.
Vegtelen lehetosegek...Gender of electrical connectors is defined by the pins.
-
Domonkos
Ármester
válasz m.zmrzlina #3911 üzenetére
Azt azert irtam, mert mar vartam hogy a szakik felsoroljak, hogy az epp aktualis szabvanynak es a most hypeolt paradigmanak milyen megoldasok felelnenek meg.
Eddig akarhany C++ projektben vettem reszt valahogy sosem volt egybehangzo dontesunk, hogy mely featureoket szeretnenk hasznalni. Tul sok van es altalaban nincs "legjobb".Gender of electrical connectors is defined by the pins.
-
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.
Same rules apply!
-
dabadab
titán
válasz m.zmrzlina #3927 üzenetére
1. Túlbonyolítod.
2. Hibás az algoritmus. Képzeld el pl. a következő mátrixot, ebben jó esetben is csak a jó elemek negyedét találja meg (ha meg pl. középen kezd, akkor semennyit):0001000
0001000
0001000
1111111
0001000
0001000
0001000Simán végig kell menni az egészen, a szélek lekezelése meg tényleg nem egy nagy vaszisztdasz, pszeduokódban:
for ( x = X_MIN ; x <= X_MAX ; x++ )
for ( y = Y_MIN ; y <= Y_MAX ; y++ )
if ( isGood(x,y) && isGood(x+1,y) && isGood(x-1,y) && isGood(x,y+1) && isGood(x,y-1) )
store(x,y);
bool isGood(x,y)
if ( x < X_MIN || x > X_MAX || y < Y_MIN || y > Y_MAX )
return true;
return ( matrix[x][y] == 0 )[ Szerkesztve ]
DRM is theft
-
mgoogyi
senior tag
válasz m.zmrzlina #3929 üzenetére
3. az if, amiben van 4 isGood, kiegészíted még 4-gyel ((-1,-1) (-1,+1) (+1,+1) (+1,-1))
Akkor a feladat gyakorlatilag átültethető arra, hogy csinálsz egy ugyanekkora 0-kal feltöltött mátrixot és abban a kezdőponttól indulva minden irányban elkezdessz 1-eseket rakni, amíg tudsz olyan mezőkön haladni, hogy csak 0-ás szomszédok vannak. Kb mintha vizet engednél a mátrixba és csak a keresett elemek adnák ki a tó medrét.
Pl:
void Flood (int x, int y)
{
if (floodMatrix[x][y] == 0 && összes szomszéd + (x,y) isGood )
{
floodMatrix[x][y] = 1;
Flood() összes szomszédra
}
}Mire végez, addigra a floodMatrixban ott lesznek a megoldásaid.
[ Szerkesztve ]
-
dabadab
titán
válasz m.zmrzlina #3936 üzenetére
"Ezek szerint az alábbi két deklaráció azonos?
int arr[10][10];
"
array<int, 100> arr;Nem az. Fent egy kétdimenziós, 10x10-es tömböt definiálsz, lent meg egy egydimenzióst, 100 elemmel.
Ami neked kell, az ez:
array<array<int, 10>, 10> arr;
És akkor ezek után változatlanul működik az, hogy
int z=arr[2][5];
(Ha ragaszkodsz hozzá, írhatod úgy is, hogy
arr.at(2).at(5)
, de miért ragaszkodnál ehhez a formához?)[ Szerkesztve ]
DRM is theft
-
dabadab
titán
válasz m.zmrzlina #3939 üzenetére
"Az a kérdésem, hogy mi a gyakorlat ebben az esetben?"
Az, hogy az i-t size_t-ként deklaráljuk.
"Milyen hibákat okozhat ha int-ként definiálom?"
Ez két esetben okoz hibákat:
1. amikor ugyanarra a bináris reprezentációra az int meg az unsigned int más értéket ad (vagyis ha a size érték eléri a 2^31-et, és a signed int negatív számot ad, az unsigned meg pozitívat)
2. illetve létezik az a probléma is, amikor a (64 bites) size_t nem fér bele a 32 bites intbe[ Szerkesztve ]
DRM is theft
-
b.kov
senior tag
válasz m.zmrzlina #3939 üzenetére
Mondjuk szélsőséges esetben túlcsordul az int változó, és a legnagyobb felvett értéke után megnöveled -> felveszi a lehető legkisebb értéket (valami mínusz szám, attól függ, hány byte-on van ábrázolva). Ez ugye akkor probléma, ha pl. az arr.size() nagyobb, mint az int változó maximálisan felvehető értéke.
És konkrétan így nézne ki (egy általános esetben):
i = 0, i = 1, ... , i = 32767 , i = –32767 , ... , i = 32767 -> végtelen ciklus, ha pl az arr.size() nagyobb, mint 32767 . De mégegyszer említem, ez elég szélsőséges eset.Próbálj minél pontosabb típusokat használni, szebb, később olvashatóbb kódot fogsz így írni, illetve elkerülöd a warningokat (amiket pont az ilyen esetek miatt szeretünk).
Szerk.: igen, az előttem szólóhoz hozzákapcsolódva, size_t-vel jobban jársz.
[ Szerkesztve ]
-
cattus
őstag
válasz m.zmrzlina #3943 üzenetére
Ha nagyon nagy méretű objektumokat érték szerint adsz át, akkor a lemásolásuk jelentős késleltetést vonhat maga után (értsd: lassú lesz a program). Emiatt használnak referencia szerinti átadást. Ilyenkor ugye alapesetben a függvény módosíthatná a kapott objektumot, emiatt használnak const-ot, hogy ne legyen rá lehetősége.
Do the thing!
-
dabadab
titán
válasz m.zmrzlina #3943 üzenetére
"1, Miért használ cím szerinti paraméterátadást, ha csak kiiratja a tömböt de nem változtat egyik eleme értékén sem?"
Arra gondolsz, hogy
void printArray(const std::array<int, 5> &n)
?Mert kb. egymilliószor gyorsabb átadni egy pointert, mint létrehozni egy új tömböt, abba átmásolni az adatokat, majd a függvényhívás végén felszabadítani az egészet Egyébként const-ként adja át, az ott elég jól kifejezi, hogy nem fogja módosítani.
"2. Mire való a függvény paraméterlistájában a tömb előtt a "const"?"
Az azt mondja, hogy nem fogja módosítani, ami a gyakorlatban kb. azt jelenti, hogy csak az objektum const metódusait fogja meghívni és a tagváltozóinak sem fog értéket adni.
"Egy kicsit feljebb a Passing std::array to function résznél azt írja, hogy azért kell mert a fordító így nem készít másolatot a tömbről"
Ez mondjuk így hülyeségnek tűnik, hacsak valamit nagyon félre nem értek, amikor referenciát adsz át, akkor se így, se úgy nem készít belőle másolatot.
Azt esetleg el bírom képzelni, hogy valamelyik fordító a
void printArray(const std::array<int, 5> n)
-ből csendben magátólvoid printArray(const std::array<int, 5> &n)
-t csinál és erre gondolt a költő.[ Szerkesztve ]
DRM is theft
-
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
-
b.kov
senior tag
válasz m.zmrzlina #3968 üzenetére
Szia!
Felesleges ilyenkor külön változókat létrehozni csak azért, hogy egyenlővé tedd a paraméterekkel, hiszen a paraméterek is ekkor lokális változók lesznek a függvényre nézve, melyek a függvény hívásakor lesznek megkonstruálva az adott paraméterek alapján.Tehát a fenti példádban az a, b és c akkor fog létrejönni, mikor meghívod a main-ben a fvAkarmi-t, és ekkor a megadott értékekkel fognak inicializálódni (2, 5, 10). Ezek után teljesen felesleges még 3 változót létrehozni, nem leszel előrébb semmivel.
A másik kérdésre pedig: a függvény deklarációjánál nem fontos neveket megadni, de definíciónál annál inkább, hogy tudj hivatkozni a paraméterekre. Lefordulni lefordul ha nem teszed meg, de én nem láttam még ilyet a gyakorlatban.
-
b.kov
senior tag
válasz m.zmrzlina #3971 üzenetére
Hát igen, azt mondják, hogy a programozás egyik legkihívóbb feladata a konzisztens nevek használata. Tehát egyébként sem szokás a, b, c neveket adni változónak, mert ha egy kicsit is összetettebb a program, akkor rengeteg idő elmehet azzal, hogy megértse más, te mire is gondoltál éppen akkor.
Egyébként igen, amit írtál az "teljesen jó", tehát lefordul, és működni is fog. Én személy szerint azért kerülöm, és kiírom a paraméterneveket is. Ez főleg akkor is hasznos, ha majd pl interfészeket írsz osztályokhoz, aztán szintén jön megint valaki, akinek sokkal egyszerűbb lesz megérteni egy-egy függvény működését, ha látja a paramétereit is annak.
-
dabadab
titán
válasz m.zmrzlina #3971 üzenetére
Igen, jó, sőt, ez még jobb:
int fvAkarmi(int elso, int masodik, int harmadik) {
return (elso+masodik)*harmadik;
}DRM is theft
-
Domonkos
Ármester
válasz m.zmrzlina #3974 üzenetére
A keretet es formazast sajat magad megszivatasa miatt rakod bele? Szerintem amellett hogy helypazarlo meg zavarossa is teszi a kiirt infokat. En lemondanek rola.
Ha megis ilyen nagyon fancy elrendezest szeretnel, akkor ennel sokkal jobb nem lesz. A parameterlistaval annyit tudsz csinalni, hogy tombben vagy valami c++-os kontenerben adod a parametereket at.
De vannak hasonlo celra mar jol bevalt konyvtarak is, mint az ncurses. Egyszeru dolgok rajzolasanal mondjuk nem fogsz sokat nyerni vele...Gender of electrical connectors is defined by the pins.
-
Domonkos
Ármester
válasz m.zmrzlina #3980 üzenetére
C++-ban nincs ra mod hogy egy fuggveny belsejeben egy masikat deklaralj.
A legkozelebbi amit tehetsz, hogy irsz ra egy lambdat. Azt hiszem hogy C++11-tol tamogatott.Gender of electrical connectors is defined by the pins.
-
mgoogyi
senior tag
válasz m.zmrzlina #3980 üzenetére
Ha csak egyszer hívnád meg azt a függvényt, akkor semmi értelme.
A többször használt kódot szokásos függvénybe kirakni. -
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
-
b.kov
senior tag
válasz m.zmrzlina #4001 üzenetére
Esetleg próbáld meg ugyanezt a kódot parancssorból fordítani, -std=c++11 flaggel.
-
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.[ Szerkesztve ]
Same rules apply!
-
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
-
b.kov
senior tag
válasz m.zmrzlina #4008 üzenetére
Ha ingyenes, és jó IDE-t szeretnél használni, akkor Windowson van Visual Studio, amiben tudsz C++ alkalmazásokat készíteni.
Én Linuxon/macOS-en semmi ingyeneset nem használok, inkább parancssor, vagy CLion, ami nem ingyenes.De egyébként kisebb programokhoz felesleges IDE-vel bajlódni szerintem, hacsak nem szeretnéd elsajátítani az adott fejlesztői környezet tulajdonságait.
-
dobragab
addikt
válasz m.zmrzlina #4008 üzenetére
En Linuxon CLion-t hasznalok, Windowson pedig Visual Studio-t clang toolsettel, es ReSharperrel. Mint IDE, a VS + ReSharper szerintem hangyanyival jobb, plusz gyorsabb es kevesebb ramot zabal. A VS-nel a clang-et is picit mokolni kell, hogy jol mukodjon.
A Visual Studio ReSharper nelkul egy nagyobb projekten mar kinszenvedes, gyotrelmesen lassu az IntelliSense, es nagyon keves funkcioja van az elozo kettohoz kepest.
Ha egyetemista vagy, Jetbrains termekeket (CLion, ReSharper) ingyenesen megkaphatod, ha megfelelo email cimmel regisztralsz. Nalunk a BME-VIK-en pl. automatikusan mukodik.
[ Szerkesztve ]
Tudom, tudom, akasszak a tökömre egy lámpát, hogy sötétben is tudjak kaszálni.
-
dangerzone
addikt
válasz m.zmrzlina #4028 üzenetére
Köszi srácok!
-
doc
nagyúr
válasz m.zmrzlina #4159 üzenetére
gondolom azert van size() hogy a tobbi containerrel interface-kompatibilis legyen, a length() meg azert, mert stringnel az logikus
-
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!
- Kerékpárosok, bringások ide!
- Suzuki topik
- Samsung Galaxy S24 Ultra - ha működik, ne változtass!
- Nagyrobogósok baráti topikja
- Luck Dragon: Asszociációs játék. :)
- NBA és kosárlabda topic
- Skoda, VW, Audi, Seat topik
- Motorola Moto G24 Power - hol van az erő?
- gban: Ingyen kellene, de tegnapra
- iPhone topik
- További aktív témák...