- 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
- Csatába küldte Magyarországon idei csúcs hangprojektoros szettjét a Samsung
- Karácsonyfaként világíthat a Thermaltake új CPU-hűtője
- Egészen nagy teljesítményspektrumon fedné le a mobil piacot az AMD
- Az átlagnál vaskosabb ventilátorok kandikáltak ki a Corsair vitorlája mögül
- Hobby elektronika
- Házimozi, és Hifi kábelezés!
- NVIDIA GeForce RTX 3080 / 3090 / Ti (GA102)
- Milyen billentyűzetet vegyek?
- ThinkPad (NEM IdeaPad)
- Melyik tápegységet vegyem?
- Milyen processzort vegyek?
- Raspberry Pi
Hirdetés
-
Az átlagnál vaskosabb ventilátorok kandikáltak ki a Corsair vitorlája mögül
ph Az amerikai cég legfrissebb szériája kétféle méretben választható, és fél évtizedes jótállással kecsegteti leendő gazdáit.
-
Számháborút nyerne az Ulefone Armor 26 Ultra
ma 5G, IP68/69K, 120 Hz, 120 W, 121 dB, 200 MP, 512 GB, 15 600 mAh és walkie-talkie opció – csak néhány kulcsadat.
-
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.
Új hozzászólás Aktív témák
-
bandi0000
nagyúr
válasz dabadab #3449 üzenetére
Igazábol 3 éve nem járok suliba, szal ezt tanultam, most csak érettségi javításra gyúrok
Ez nem az ipv -s feladat, kontkrétan a fájlba némelyik sor 2 db számmal kezdődik és ezeket kell összeadni, nem tom a miértjét, de ha ebböl a karakteres számból kivonok egy karakteres 0 át akkor az intes számát kapom meg
Xbox One: bandymnc
-
jattila48
aktív tag
válasz dabadab #3450 üzenetére
Ez igaz általában, de most IPV6 sztringről volt szó, ami 40 karakter hosszú (lezáró 0-val együtt). Egyébként az algoritmusra gondoltam, hogy jó. Abban is találtál "hibát"? Tényleg nem értem miért akartok minden áron minden apró szir-szar-ba belekötni, nem ez volt a lényeg. Tekintsétek úgy, hogy az algoritmust írtam le pszeudo kódban! Világos? Elhiszed, hogy saját production kódomban nem írok ilyet (ha nem, az sem baj)? Hadd ne kelljen már egy vázlat-szerű válaszban minden apró szarnak tökéletesnek lenni! Az algoritmust érted? Az jó? Ha nem, akkor szóljál és javítsd ki!
„Kétségtelen, hogy nem tudjuk, mit tegyünk, de felkészültek és elszántak vagyunk.” - Olaf Scholz német kancellár
-
dobragab
addikt
válasz dabadab #3450 üzenetére
#define in :
(#3452) jattila48
Nem azért kötünk bele minden szirszarba, mert ez nekünk jól esik, pont fordítva. Mert rossz nézni azokat a kódokat, amiket tanítási céllal írsz be. Az a kolléga, aki tanulni jön ide, nem biztos, hogy észreveszi, hogy szar, több sebből vérzik, esetleg gyanútlanul be is másolja a kódot, vagy úgy gondolja, így kell kódot írni.
A legutóbbi kérdés ráadásul annyival bonyolultabb ügy, hogy a kolléga útmutatást kért, hogyan csinálja meg, nem algoritmust, vagy konkrét kódot. Ha szigorú lennék, azt mondanám, elvetted a felfedezés élményét is, de ez bőven megbocsátható. Szemben azzal, hogy útmutatásként szar kódot kapott.
Jó, sarkítottam, én is tudom, de a lényeg talán átmegy.
[ Szerkesztve ]
Tudom, tudom, akasszak a tökömre egy lámpát, hogy sötétben is tudjak kaszálni.
-
dobragab
addikt
válasz bandi0000 #3451 üzenetére
A memóriában minden karakter számként van tárolva, hogy melyik karakterhez milyen érték tartozik, azt itt meg tudod nézni, ez a leggyakrabban használt karakterek kódja. A többi karakternek a számértéke nem egységes, és elég macerás, arról nem kell tudnod.
A '0' karakterhez a decimális 48 tartozik, és azt követően minden számjegyhez eggyel nagyobb. Amikor string-ként olvasol be, akkor valójában sok karaktert kapsz, ezért kell kivonnod belőle '0'-t, hogy a karakter konkrét számértékét kapd.
[ Szerkesztve ]
Tudom, tudom, akasszak a tökömre egy lámpát, hogy sötétben is tudjak kaszálni.
-
jattila48
aktív tag
válasz dobragab #3453 üzenetére
Légy szíves írj már rá egy jó kódot, ha már az enyém annyira szar! De legyen aztán boost, regexp, STL, meg minden nyalánkság, ami egy igazán szép C++ kódba kell! Egyébként milyen "súlyos hibákat" fedeztél még fel benne? Az eddig tárgyaltak: strlen, enum helyett int, char[] tömb. Elmondtam, hogy miért. Még valami? Ezek nyilván olyannyira "súlyos hibák", hogy ettől aztán egy életre tönkre teszem vele a gondolkodásmódját, és ezután már csak ilyen szar kódot lesz képes írni.
"nem biztos, hogy észreveszi, hogy szar, több sebből vérzik, esetleg gyanútlanul be is másolja a kódot, vagy úgy gondolja, így kell kódot írni... Szemben azzal, hogy útmutatásként szar kódot kapott."
Nem liheged kicsit túl ezt a dolgot? Nem vagy egy kicsit nagyképű? (dehogy is nem!)
„Kétségtelen, hogy nem tudjuk, mit tegyünk, de felkészültek és elszántak vagyunk.” - Olaf Scholz német kancellár
-
bandi0000
nagyúr
ugye fentebb írtam hogy én hogyan programozok, de most lövésem sincs mit csináljak mert ilyennel még nem találkoztam
feladat:
A kiserlet.txt állományban egy pénzfeldobás-sorozat eredményét találja. Mivel
a sorozat hossza tetszőleges lehet, ezért az összes adat memóriában történő egyidejű
eltárolása nélkül oldja meg a következő feladatokat! Feltételezheti, hogy egymilliónál több
adata nem lesz.megpróbáltam beledobni egy tömbbe, de mivel rohadt sok adat van gondolom ezért ki is dob mindig
szóval ezt gyakorlatilag hogy lehetne beolvasni? mert pl azt hogy hány dobás volt ebbe a fájlba nem tudom megmondani anélkül hogy meg ne címezném őket
Xbox One: bandymnc
-
dabadab
titán
válasz bandi0000 #3457 üzenetére
"az összes adat memóriában történő egyidejű eltárolása nélkül oldja meg"
vs
"megpróbáltam beledobni egy tömbbe"
Akkor itt "a feladat elolvasása" rész sem sikerült
Egyébként mit kell kiszámolni a bejövő adatokból?
(#3452) jattila48: alapvetően azért kaptad a kritikákat, mert egyrészt C++ topikban egy tanulónak C példakódot adsz (lásd még: "minden nyelven lehet FORTRAN-ban programozni"), másrészt a konkrét kód több dologban is rossz példát mutatott.
[ Szerkesztve ]
DRM is theft
-
dobragab
addikt
-
dabadab
titán
válasz bandi0000 #3460 üzenetére
Semmi szükség arra, hogy az egészet a memóriában tárold, elég csak az éppen aktuális dobást tárolni meg persze a mindenféle egyéb számlálókat, amiket elő kell állítani. Vagyis soronként beolvasod a file-t, de a beolvasott értéket nem tárolod el semmiféle tömbben meg sehol, csak növeled a számlálókat stb.
DRM is theft
-
dobragab
addikt
válasz bandi0000 #3460 üzenetére
A 3-6-os feladatok mindegyike megoldható úgy, hogy nem tárolod el mind a memóriában. Pl:
int utolso_dobas;
while(fscanf(fp, "%d", &utolso_dobas) == 1)
{
// legutóbbi dobás kezelése
}Direkt nem írtam többet, ez pl. 2 sorral kiegészítve megoldja a 3-as feladatot.
És azért C, mert a kolléga eddig C-ben gyakorolt. Ugyanez C++-ban:
int utolso_dobas;
while(std::cin >> utolso_dobas)
{
// legutóbbi dobás kezelése
}[ Szerkesztve ]
Tudom, tudom, akasszak a tökömre egy lámpát, hogy sötétben is tudjak kaszálni.
-
bandi0000
nagyúr
Köszönöm mindkettőtöknek, meg a türelmet is
én is erre gondoltam, csak nem tudtam hogy kivitelezhető e, mert mindig tárolok mindent a memóriába, de akkor innentől kezdve gyerek játék
Amúgy tudtok olyan magyar nyelvű C++ könyvről ami ugyan így az elejétől próbál tanítani? mint hogy mivel íratok ki, mivel kérek be stbstb
[ Szerkesztve ]
Xbox One: bandymnc
-
dobragab
addikt
válasz bandi0000 #3463 üzenetére
Amit te tanultál, az nem C++, hanem C. C++-ra hirtelen nem is tudok jót mutatni, de C-re igen.
Innen kezdd, és az előadások anyagait nézd elsősorban. Laborok anyagai kisebb-nagyobb gyakorlófeladatok az előadás anyagához, a gyakorlatok anyagában pedig "komolyabb" feladatokat találsz.
Soknak és gyorsnak tűnhet, de neked elég az első 6. előadás anyaga + némi hozzá tartozó gyakorlás.
[ Szerkesztve ]
Tudom, tudom, akasszak a tökömre egy lámpát, hogy sötétben is tudjak kaszálni.
-
dobragab
addikt
válasz jattila48 #3456 üzenetére
Tessék! 9GAG-en sokadszor botlottam bele ebbe a stílusgyakorlatba reggel.
Annyit módosítottam a fejlécen, hogy
unsigned long long getFibonacciNumber(unsigned i)És írtam hozzá egy tesztprogramot:
int main()
{
unsigned long long result[1000];
clock_t start = clock();
for(int i = 0; i < 1000; ++i)
result[i] = getFibonacciNumber(1370 * i);
clock_t finish = clock();
for(auto n : result)
std::cout << n << ' ';
std::cout << ((finish - start) / double(CLOCKS_PER_SEC)) * 1000 << " ms" << std::endl;
return 0;
}Az én megoldásom a nemigazán bivalyerős laptopomon (i5-4200U) átlagosan 80 ms körül végez, és szépen tagolva 11 sor. Egyelőre nem lövöm le a kódot, hátha szeretnél és tudsz jobbat írni STL nélkül. Beégetett méretű tömb lehetőleg ne legyen benne, de amúgy bármi (szálkezelés is).
Összehasonlítási alap: egy egyszerű iteratív megoldás nálam 3800 ms körül teljesít.
[ Szerkesztve ]
Tudom, tudom, akasszak a tökömre egy lámpát, hogy sötétben is tudjak kaszálni.
-
bandi0000
nagyúr
Még egy vacak kérdés előjött, mondjuk lehet azért nem sikerült mert már belekavarodtam az egészbe
ebből a ne tárold a memóriába fájlból ki kéne szedni 1000soros soronként 4 darab elemet, erre felvettem egy tömböt, és így próbáltam megoldani, de nem igazán jött be mert krix-kraxokat ír
dobasok[1000][4];
while(fscanf(f,"%c",&dobasok[n][v])==1)
{
if(n<1000) if(v<4) v++; else {v=0; n++;}
}2.0-ás változat, ez se csinálja jól, de az első az hülyeség volt
for(i=0;i<m;i++)
{
fscanf(f,"%c",&dobasok[n][v]);
if(n<1000) if(v<4) v++; else {v=0; n++;}
}[ Szerkesztve ]
Xbox One: bandymnc
-
-
dobragab
addikt
válasz jattila48 #3470 üzenetére
Légy szíves írj már rá egy jó kódot, ha már az enyém annyira szar! De legyen aztán boost, regexp, STL, meg minden nyalánkság, ami egy igazán szép C++ kódba kell!
unsigned long long getFibonacciNumber(unsigned i)
{
static std::vector<unsigned long long> cache = {0, 1};
if(cache.size() > i)
return cache[i];
unsigned long long new_val = getFibonacciNumber(i-1) + getFibonacciNumber(i-2);
cache.push_back(new_val);
return new_val;
}Tudom, tudom, akasszak a tökömre egy lámpát, hogy sötétben is tudjak kaszálni.
-
sigidi
tag
Sziasztok!
Olvasom régóta a fórumot, de most ez az IP címes C/C++ flame kihozta belőlem a "kommentelhetnéket".
Csak úgy kérdem: Hogy lehetne még javítani rajta, hogy későbbi IP cím operációkat lehessen végezni rajta?
replace helyett valami stringstream "átalakítgatás" nem létezik?#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <iomanip>
using namespace std;
int main()
{
string ipv6 = "2001:0e00:41a0:006b:00de:03c0:0e00:60bc";
replace(ipv6.begin(),ipv6.end(),':',' ');
istringstream iss(ipv6);
int tmp = 0;
while(!iss.eof())
{
iss >> hex >> tmp;
//hogy olyan legyen a kimenet, amit kértek feladatban
if(iss.peek() == EOF && tmp < 4096)
cout <<'0'<< hex << tmp;
else if(iss.peek() == EOF && tmp > 4096)
cout << hex << tmp;
else if(tmp < 4096)
cout << '0'<< hex << tmp << ':';
else
cout << hex << tmp << ':';
}
return 0;
}Expect the unexpected.
-
dobragab
addikt
iss >> hex csak egyszer kell, az elején, az az istream állapotaként megmarad.
Amit te keresel, az az std::getline.
std::getline(iss, temp, ':');
Hogy lehetne még javítani rajta, hogy későbbi IP cím operációkat lehessen végezni rajta?
A legmegfelelőbb adatszerkezetben tárolni. A beolvasás / kiírás szempontjából az uint16_t tömb tűnik legegyszerűbbnek, Linux API uint8_t tömböt használ.
[ Szerkesztve ]
Tudom, tudom, akasszak a tökömre egy lámpát, hogy sötétben is tudjak kaszálni.
-
EQMontoya
veterán
Napi fail:
double _cumQty;Pedig nem is a doklernél dolgozom, bakker!
Same rules apply!
-
Jester01
veterán
-
Jester01
veterán
válasz EQMontoya #3485 üzenetére
Nem hiba. A szabvány szerint:
When a virtual function is called directly or indirectly from a constructor or from a destructor, including during the construction or destruction of the class's non-static data members, and the object to which the call applies is the object (call it x) under construction or destruction, the function called is the final overrider in the constructor's or destructor's class and not one overriding it in a more-derived class.
[ Szerkesztve ]
Jester
-
sztanozs
veterán
válasz dobragab #3481 üzenetére
BTW ez is szép
struct A{
virtual void f(){ std::cout << "A::f"; }
};
struct B : public A{
B(){ f(); }
void f(){ std::cout << "B::f"; }
};
struct C : public B{
void f(){ std::cout << "C::f"; }
};
int main()
{
C c;
return 0;
}JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
ToMmY_hun
senior tag
válasz sztanozs #3487 üzenetére
Ha egy virtuális függvény direkt vagy indirekt módon konstruktorból vagy destruktorból kerül meghívásra (beleértve a konstruálását és destruálását a nem statikus adattagoknak) és az objektum, amelyből a hívás történik az éppen konstruálás/destruálás alatt álló objektum, akkor a konstruálás/destruálás alatt álló objektumban definiált függvény hívódik meg, nem pedig a leszármazott osztályban override-olt változata.
Egyébként csak én látom rosszul a helyzetet, vagy ez nem olyan ördöngős kérdés? Konstruálás során ugye először az ősosztály példányosodik, és mivel az említett kódban annak a példányosítása során hívunk egy virtuális függvényt, ezért nem futhat le olyan objektumhoz tartozó definíciója, ami a hívás pillanatában nem is létezik. Ugyanez fordítva a destruálás során. Rosszul látom a dolgot?
[ Szerkesztve ]
C programmers never die, they are just cast into void.
-
Jester01
veterán
válasz sztanozs #3487 üzenetére
Ha egy virtuális függvény közvetlenül vagy közvetett módon konstruktorból vagy destruktorból hívódik meg, ideértve az osztály nem statikus adattagjainak konstruktorát és destruktorát is, és az objektum amire a hívás vonatkozik maga az objektum ami konstruálás vagy destruálás (jajj ) alatt áll akkor a meghívott függvény a konstruktor vagy destruktor osztályában lévő végső override nem pedig leszármazott osztálybeli.
Vagyis az adott példában az A() konstruktorban az f() virtuális hívás feloldása során csak a konstruktor osztályát veszi figyelembe és nem a leszármazottat még akkor sem ha amúgy egy olyan példány készül éppen. Így lesz belőle A::f()
MOD: ToMmY_hun
[ Szerkesztve ]
Jester
-
sztanozs
veterán
válasz EQMontoya #3490 üzenetére
Jaja, kisérleteztem közben, hogy megértsem
Jessz, genyaság kimaxolva:
struct A{ virtual void f(){ std::cout << "A::f"; } };
struct B : public A{ void f(){ std::cout << "B::f"; } };
struct C : public B{ C(){ f(); } };
struct D : public C{ void f(){ std::cout << "D::f"; } };
int main()
{
D d;
return 0;
}[ Szerkesztve ]
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
Jester01
veterán
-
ToMmY_hun
senior tag
válasz Jester01 #3495 üzenetére
Pontosan arra gondoltam lehetséges hibaforrásként, amint az első linken látható kód eredményez. Emellett nagyon tetszik a Microsoft megoldása: "CA2214: Do not call overridable methods in constructors"
[ Szerkesztve ]
C programmers never die, they are just cast into void.
-
dobragab
addikt
válasz ToMmY_hun #3496 üzenetére
Ez C++-ban is egy erős elv, előadáson a kolléga még el is mondta, hogy nem hívunk konstruktorban / destruktorban virtuális függvényt, vagy le fogják törni a kezed. Utána belerakja ezt a ZH-ba, én meg javíthatom. Komolyan, legszívesebben annak is megadtam volna a pontot, aki B::f-et írt.
(#3492) sztanozs
A genyaság nincs még kimaxolva, szerintem sosem lehet kimaxolni. Még facsarhatjuk belőle a sz@rt kicsit.
(#3489) ToMmY_hun
Konstruálás során ugye először az ősosztály példányosodik, és mivel az említett kódban annak a példányosítása során hívunk egy virtuális függvényt, ezért nem futhat le olyan objektumhoz tartozó definíciója, ami a hívás pillanatában nem is létezik.
Ez a C++ megoldása a problémára, úgy definiálták a szabványban, hogy ilyen ne történhessen. Történhet viszont rosszabb.
Minden konstruktor csak saját magáért felelős. Így az ősosztályok konstruktorát hívja (+ virtuális örökléses blablabla), majd beállítja a vptr-t a sajátjára, aztán meghívja a tagváltozók konstruktorát, majd lefut a törzs. Fikarcnyit sem foglalkozik azzal, hogy mi van alatta. Nem tud róla, ki származik le belőle. És mivel a vptr-t is majd ezek után állítja csak be a leszármazott a saját vptr-ére, a konstruktorban a vptr még nem a leszármazottéra mutat, hanem a sajátra.
Egyébként a szabványban nincs benne sehol a vtable / vptr, nincs rögzítve, hogy úgy kell implementálni, de úgy érdemes. Sőt, a szabvány úgy lett kialakítva, ahogy a vtable-ös megoldások működnek.
A szabványban volt még egy sor, amit nem részleteztetek. A tagváltozók konstruktorában is az a fv. fog hívódni, ami a hierarchiában "nincs lejjebb", azaz a saját vagy "feljebb" van.
Ha a konstruktorban hívott f tisztán virtuális, akkor nem fog fordulni, mert a linker nem találja meg a függvényt. Tisztán virtuális függvény lehet definiálva is, ez most mellékszál. Itt nem kell a vtable-höz nyúlni, mert nyilvánvaló, melyik típusnak a függvényét kell hívni. Ha viszont nem maga hívja meg, hanem közvetve egy olyan függvény, ami nem tudja, pontosan milyen típust is kapott, akkor muszáj lesz a vtable-ben megnéznie. Akár tagváltozó konstruktorában is, mint írtam. Tadamm, így lehet tisztán virtuális függvényt meghívni.
#include <iostream>
class A;
struct member
{
A * a;
member(A* a);
};
struct A
{
member m = this;
A() { }
virtual void f() = 0;
virtual ~A() {}
};
member::member(A * a) : a(a)
{
a->f();
}
struct B : public A
{
void f() { std::cout << "B::f\n";}
};
int main()
{
B b;
return 0;
}[ Szerkesztve ]
Tudom, tudom, akasszak a tökömre egy lámpát, hogy sötétben is tudjak kaszálni.
-
ToMmY_hun
senior tag
válasz dobragab #3499 üzenetére
Bocs, hogy erre válaszolok előbb, a másik hozzászólást még rágcsálom - szóval Neked van infód arról, hogy külsősként van-e esély bekerülni? Regisztráltam, de nem tudom hogy hány hely lesz és hogy be lehet-e férni. Számít, hogy milyen cégnevet ír be az ember?
Szerk: Köszi a választ.
[ Szerkesztve ]
C programmers never die, they are just cast into void.
Ú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!
- Egészen nagy teljesítményspektrumon fedné le a mobil piacot az AMD
- Az átlagnál vaskosabb ventilátorok kandikáltak ki a Corsair vitorlája mögül
- exHWSW - Értünk mindenhez IS
- gban: Ingyen kellene, de tegnapra
- PlayStation 5
- Nagyrobogósok baráti topikja
- Samsung Galaxy S24 Ultra - ha működik, ne változtass!
- Termékoldal buktatta le a Huawei Watch Fit 3-at
- Nemzetközi piacra érkezik az Amazfit Helio Ring
- Politika
- További aktív témák...
- Xiaomi Redmi Note 11 Pro 5G 128GB, Kártyafüggetlen, 1 Év Garanciával
- Eladó gamer PC (i5-11400F/16GB DDR4/500GB SSD+1TB HDD/RTX 2060 6GB)
- Bomba ár! Lenovo ThinkPad X270 - i7-7G I 16GB I 256GB SSD I 12,5" I HDMI I Cam I W10 I Garancia!
- Bomba ár HP Spectre Pro X360 G2 - i5-6G I 8GB I 256SSD I 13,3" FHD Touch I Cam I W10 I Garancia!
- DELL OPTIPLEX 3020 - i5/8GB/256GB/GT710