Új hozzászólás Aktív témák
-
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.
-
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;
} -
-
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;
} -
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
-
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?
-
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.
-
Jester01
veterán
-
EQMontoya
veterán
Napi fail:
double _cumQty;Pedig nem is a doklernél dolgozom, bakker!
-
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.
-
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;
} -
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;
} -
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++;}
} -
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.
-
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.
-
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
-
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
} -
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.
-
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.
-
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
-
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!)
-
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.
-
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.
-
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!
-
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
-
dabadab
titán
válasz
jattila48 #3446 üzenetére
"A kódom nem rossz (legalábbis remélem)"
Hát ez
char trimmed_ipv6_addr[40];
meg ez
for(int i=0;i<strlen(ipv6_addr);++i){
kiad egy potenciális buffer overflowt.Egyébként kb. ugyanez az algoritmus úgy nézne ki C++-ban, hogy (most nincs nálam fordító, így csak IQ-ból):
string src="2001:0e00:41a0:006b:00de:03c0:0e00:60bc";
string dst;
char prev=0;
bool trimming=true;
for ( char c in src )
{
if ( trimming && c == '0' && prev == '0' )
{
// skip char
continue;
}
if ( c == ':' )
{
trimming = true;
}
else if ( c != '0' )
{
trimming = false
}
dst +=c;
prev=c;
} -
dabadab
titán
válasz
bandi0000 #3447 üzenetére
Ez is C-ben van
Tényleg nem oktatnak C++-t?
C++-ban így lehet stringet intté konvertálni:
std::string hex="0abc";
int i=std::stoi (hex,nullptr,16);(Nézd meg az stoi dokumentációját, a második paraméterének a segítségével végig lehet menni az egész IPv6 stringen)
-
bandi0000
nagyúr
köszönöm a segítségeket, igazából direkt nem akarom hogy dolgozzatok a kóddal mert sajnos semmi értelme, ami nektek egyértelmű az nekem teljesen új...
szóval ha kérdezek akkor inkább az elméleti megoldásra vagyok kíváncsi, a többit megírom én a saját "nyelvemen" amit tudok, majd később ha tanulom valszeg nem így fogom írni a programot, ez az amit tudok most később majd meglátjuk mi lesz
de közbe még 1 dologba ütköztem nem nagy de kérdezem, karakterként tároltam el számot, na már most ezeket össze kellene adnom, arra rájöttem hogy karakterként hiába adom össze
viszont emlékszek hogy régebben tudtam árírni karaktert számmá, asszem az sscanf-el, de most valamiért nem akar működni
csak részlet hogy lássátok hogy hogy írom, tisztában vagyok vele hogy nagyon szar... meg vannak egyszerűbb megoldások, de jelenleg ezt tudom
int main()
{
printf("1. Feladat: Beolvasas\n");
FILE *f=fopen("veetel.txt","r"); if(f==0) return 1;
FILE *o=fopen("adaas.txt","w");
qw adat[500],csere;
int i,j,m=0,k,l;
char farkas[7]={'f','a','r','k','a','s'},uzzi[11][91];
while(fscanf(f,"%d %d\n%[^\n]\n",&adat[m].ns,&adat[m].ras,&adat[m].uzi)==3) m++;
printf("2. Fealdat: \n");
printf("Az elsot rogzitette: %d, az utolsot rogzitette: %d radioamator\n",adat[0].ras,adat[m-1].ras);
printf("3.Feladat:\n");
for(i=0;i<m;i++)
{
k=0;
for(j=0;j<strlen(adat[i].uzi);j++)
{
if(adat[i].uzi[j]==farkas[k]){ k++;} else k=0;
if(k==6) printf("%d nap %d radioamator\n",adat[i].ns,adat[i].ras);
}
}
printf("4.Feladat:\n");
int db=0;
for(j=1;j<12;j++)
{
db=0;
for(i=0;i<m;i++)
{
if(adat[i].ns==j) db++;
}
printf("%d nap %d feljegyzes\n",j,db);
}
printf("\n\n5.Feladat:\n\n"); -
jattila48
aktív tag
válasz
dobragab #3445 üzenetére
Nem egészen értünk egyet.
1. Attól, hogy valami hatékony, még lehet egyszerű és világos. Sőt! Ez az algoritmus is világos, de ha nem, akkor nagyon szívesen elmagyarázom. Hagyjuk meg a kérdezőnek, hogy eldöntse számára világos-e vagy sem. Egyelőre még nem szólt hozzá.
2. A kódom nem rossz (legalábbis remélem), hanem lehetett volna szebben is írni, ez igaz. Ettől a lényeg (maga az algoritmus) még jól látszik rajta. Hirtelen felindulásból 5 perc alatt ennyire futotta. Nem a kódolást akartam követendőként állítani, hanem hogy, lehet a saját józan eszünket is használni ahelyett, hogy rögön mindenféle túlfejlett apparátust (boost, regext,...) kezdenénk mozgatni apró problémákra. Erről már többször írtam, a véleményem továbbra is fenntartom. Ha megérti ezt az algoritmust, akkor talán tanult is valamit (remélem), és már megérte.
3. Azt, hogy illik-e manapság C kódot írni STL helyett,... hát a fene tudja. Én sokszor szoktam ilyen kisebb feladatoknál, ugyanakkor az STL-t is használom. Szerintem jól megférnek egymás mellett. Itt a példában az algoritmus szerintem jobban látszik STL tárolók használata nélkül. Nem vonja el fölöslegesen a figyelmet. Továbbá azt is érdemes megjegyezni, hogy az STL tárolók használatának ára van. Fölösleges ide-oda másolások (túl sok ilyen kódot láttam), ha nem pont alkalmas a tároló amire a használni akarja, akkor egész elborzasztó "patkolásra" is képesek,...
4. Egyébként ha nagyon akarja valaki, akkor könnyen ki lehet cserélni STL tárolókra a tömböket, és akkor mindenki boldog lesz.
Én remélem tudtam segíteni, ellenben tőletek semmilyen konkrét segítséget nem kapott.
-
dobragab
addikt
válasz
jattila48 #3435 üzenetére
Csak az algoritmust akartam bemutatni, hogy mennyire egyszerű, és nem kellett hozzá sem boost, sem regexp, sem vector<string>, amiknél feltehetőleg jóval hatékonyabb így (futásidőben, és memória használatban is (főleg ha helyben történik a feldolgozás)).
Van még egy dolog, amit nem vettél számításba, vagy csak tojtál rá. A kolléga, aki segítséget kért, tanul. Ez fontos következményekkel jár.
1. Nem kéne mindent a hatékonyságra fogni. Az lenne a lényeg, hogy egyszerű, világos megoldást mutass neki, amit könnyen felfog, megért, és reprodukálni is tudna.
2. Neked sok-sok év tapasztalatod van abban, hogy hogyan hatékonyabb, és mindent ennek alávetve írsz meg. Ő most ismerkedik a nyelv lehetőségeivel, és pont lesz*rja, mennyire hatékony, ha érti. Gőze sincs arról, hogy hogyan kéne hatékony kódot írni, és ne is próbáld erre nevelni, mert ahhoz tárgyi ismeretek hiányoznak. Ráadásul ha megpróbálja, annál rosszabb. Nem fog neki menni, de legalább érthetetlen kódot ír.
3. A kolléga tanul, és te példakóddal segítesz. Ilyenkor te - akarva, akaratlanul - oktatóként lépsz fel. Mivel hozzánk képest meglehetősen kevés kódot látott, zömmel a sajátját, baromi nagy hatással van rá, milyen kódot lát követendő mintaként. Olyan kódot, ami saját bevallásod szerint is több ponton rossz, nem nagyon kéne neki mutatni.
4. A kolléga további életében valószínűleg az ilyen szintű optimalizálás soha nem lesz fontos. Manapság sem illik C kódot írni az STL használata helyett, mert feleslegesen bonyolítja a kódot. Optimalizálni ráadásul csak akkor kéne, ha lassú a kód (a nyilvánvaló f*szságokat kivéve). Inkább arra kéne nevelni, hogy használjon STL tárolókat, azért vannak.
Így elsőre ennyi, ami az érdemi segítséget illeti.
-
jattila48
aktív tag
válasz
dobragab #3442 üzenetére
Az eredmény tömböt úgy juttatom ki, hogy előbb bejuttatom. Vagy helyben történik a feldolgozás, és akkor az input egybe output is, vagy kívül foglalok az output tömbnek helyet, a rámutató char * pointert és a puffer méretét pedig paraméterként kapja a fv. De ezt szerintem neked nem kell magyarázni.
-
jattila48
aktív tag
válasz
dobragab #3442 üzenetére
Ezt a restrict-et nem tudom mi, sose használtam, de azt hiszem eltértünk a lényegtől. Szerintem akár strlen, akár nem, attól az algoritmusom még hatékonynak mondható. Maradjunk annyiban, hogy a for így módosul:
for(int i=0;ipv6_addr[i]!=0;++i)
És most már próbáljatok nem kötekedni, hanem érdemben segíteni a kérdezőnek. Köszi! -
dobragab
addikt
válasz
jattila48 #3441 üzenetére
Feltéve, hogy függvénybe rakod, csak akkor, ha így deklarálod:
restrict const char *ipv6_addr
És azt sem egyszerű megoldani, hogy juttatod ki az eredmény-tömböt a függvényből. Out paraméterrel persze lehet, de valahogy szebbnek tűnik rendes visszatérési értékként, std::string-ben.
-
jattila48
aktív tag
válasz
Jester01 #3434 üzenetére
Már miért lenne fölösleges az strlen? Abban biztos lehetsz, hogy nem fog minden kiértékeléskor lefutni, ezt kioptimalizálják. Rengeteg hasonló ciklust láthatsz példa kódokban. Egyébként hirtelen nem jutna eszembe ennél hatékonyabb megoldás (esetleg neked?), úgyhogy engedd meg, hogy annak mondjam.
-
jattila48
aktív tag
válasz
dobragab #3433 üzenetére
Valóban a trim-nek enum-nak kéne lenni. Ha több állapot lenne, vagy esetleg bővülhetne, akkor biztos úgy csinálnám. Persze osztályt is lehetne csinálni belőle, meg string-gel dolgozni. Csak az algoritmust akartam bemutatni, hogy mennyire egyszerű, és nem kellet hozzá sem boost, sem regexp, sem vector<string>, amiknél feltehetőleg jóval hatékonyabb így (futásidőben, és memória használatban is (főleg ha helyben történik a feldolgozás)).
-
dobragab
addikt
válasz
EQMontoya #3431 üzenetére
+1. A megoldás ránézésre jó, én csiszolnék rajta.
1. a trim nagyon enum-szagú
2. char* a 21. században?
3. Igen, szerintem helyben kéne végezni, egy std::string-en. Aztán betenni egy függvénybe, ami std::string&-et vár.Vagy std::ostringstream-be pusholni a karaktereket.
(#3432) jattila48
Szabványos C99. Sőt, egyetlen nem-C89 elemet használ, a for(int...
Szebb megoldás: írsz IPv6 osztályt, ahol uint16_t-tömböt tárolsz belül. Megírod a beolvasást, ami tetszőleges formátumú IPv6 címet be tud olvasni, és a kanonikus alakba visszaírást, és mindjárt egyszerre több feladatot oldottál meg.
Ha tényleg "csak" a rövidítés a feladat, ahhoz tényleg OP egy ilyen osztály, de ha használni kell az IPv6 címeket, nem igazán illik sztringben tárolni.
-
jattila48
aktív tag
válasz
bandi0000 #3429 üzenetére
Egy hatékony megoldás:
const char *ipv6_addr="2001:0e00:41a0:006b:00de:03c0:0e00:60bc";
char trimmed_ipv6_addr[40];
int trim=1,j=0;
for(int i=0;i<strlen(ipv6_addr);++i){
char c=ipv6_addr[i];
if(c==':')trim=1;
switch(trim){
case 0:
trimmed_ipv6_addr[j++]=c;
break;
case 1:
trimmed_ipv6_addr[j++]=c;
if(c=='0')trim=2;
else if(c!=':')trim=0;
break;
case 2:
if(c!='0'){
trimmed_ipv6_addr[j++]=c;
trim=0;
}
break;
default:
//ilyen nem lehet
;
}
}
trimmed_ipv6_addr[j]=0;Akár "helyben" is elvégezhető (ha az átalakítandó karaktertömb már eleve a trimmed_ipv6_addr változóban van).
-
bandi0000
nagyúr
arra van esetleg ötletetek hogy elméletbe hogy lehetne megcsinálni azt, hogy:
adott egy IPV6 címz, pl: 2001:0e00:41a0:006b:00de:03c0:0e00:60bc ezt én 1db változóba vettem fel, de feladat az hogy rövidítsem, ahol az első X szám 0 oda csak 1 db 0-át kell rakni, pl 006b->06b
de mivel az egész cucc kettőspontokkal mindenestül 1 változóba van, így nem tudom hogy hogyan álljak neki -
ToMmY_hun
senior tag
válasz
dobragab #3425 üzenetére
A feladat nem, a megoldás viszont lehet hogy az.
A két mátrix szorzatán egyelőre elegendő lenne az aktuális paraméterekre a függvény által visszaadott számértékek egyszerű számként való szorzatát érteni. Azért emeltem ki a szorzatot és összeget, mert úgy szeretném megcsinálni, hogy a függvény eredményeként adott számot adja, illetve szorozza össze a program akkor, ha én a függvényre mint objektumra hivatkozok.
Az x és y matematikai értelemben paraméterek, tehát a függvény hívásakor értékük ismert.
-
dobragab
addikt
válasz
ToMmY_hun #3424 üzenetére
A feladat első ránézésre nem tűnik elvetemültnek, de valahogy nem értem minden részletét.
Mátrixban kellene tárolnom trigonometrikus függvényeket, úgy, hogy ezek a függvényeket tartalmazó mátrixok egymással szorozhatóak legyenek.
Mit értesz két ilyen mátrix szorzatán? Ugyanúgy számolnád, ahogy rendes számokkal? Akkor mit jelent két ilyen függvény összege ill szorzata?
A függvények a következő alakot ölthetik: x * sin(y)
Itt x és y változók, vagy paraméterek?
-
ToMmY_hun
senior tag
Sziasztok!
Eléggé elvetemült dolgot szeretnék csinálni, és előtte kikérném a profik véleményét arról, hogy érdemes-e ezt a megközelítési módot választani. Mátrixban kellene tárolnom trigonometrikus függvényeket, úgy, hogy ezek a függvényeket tartalmazó mátrixok egymással szorozhatóak legyenek. Arra gondoltam, hogy készítek a trigonometrikus függvényeknek egy-egy osztályt, amelyekben megadható a függvény típusa és a annak paraméterei. A függvények a következő alakot ölthetik: x * sin(y). Ezeket tárolnám az osztályban, és az osztály egy tagfüggvényének hívására történne meg a számolás, majd egy másikkal visszakérhető lenne az eredmény. Természetesen a szorzás és összeadás operátorokat overloadol-nám, hogy az eredmény értékével végezzék a műveletet. Szerintetek ez mennyire ocsmány és esetleg tudtok javasolni szebb megoldást? A performace egyelőre nem számít, megelégszem azzal is ha működik és viszonylag elviselhető a koncepció. Az elvégezendő műveletek száma nagyjából 60 * 60, azaz 3600 másodpercenként, szóval tényleg nem érdemes szöszölni a teljesítménnyel, legalábbis még nem.
Előre is köszönöm a tippeket!
-
ToMmY_hun
senior tag
válasz
EQMontoya #3422 üzenetére
Pontosan ilyen egyszerű feladatokra lettek kitalálva és ezekben nagyon is jók. A probléma ott kezdődik, ha kicsit komolyabb, nagyobb projektet is ezek segítségével akarnak létrehozni. Sajnos láttam már ilyeneket nagy multinál és egyáltalán nem tetszett.
Egyébként a Java is nagyon kényelmesen használható. Én ahhoz szoktam nyúlni, ha valami triviális dolgot gyorsan kell megoldani. Múltkor például apámnak készítettem benne GUI-s képátméretező szoftvert. Nagyjából 1,5 óra volt megírni nem túl szolid, körülbelül fél éves Java tapasztalattal.
Egyéb: Úgy néz ki sikerült C++ fejlesztői munkát megnyernem, ezúton is köszönöm a segítséget a fórum lakóinak! Lehet, hogy nektek nem tűnt úgy, de iszonyat sokat segítettek az ügyben.
-
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. -
dobragab
addikt
válasz
dabadab #3419 üzenetére
Jogos, ott a pont.
Én a dinamikusan típusos nyelvekre gondoltam, tényleg rosszul fogalmaztam
if a > 5:
b = "hello"
else:
b = False
print(b)Szóval a változódeklaráció hiánya, egy változó típusának mágikus megváltozása, a változók élettartamának ilyen értelmezésével... leginkább káosz
(#3420) ToMmY_hun
Igen, ismerem a viccet, szerintem is zseniális
Na mindegy, befejezem a Python hate factory-t, túlzottan off.
-
ToMmY_hun
senior tag
válasz
dobragab #3418 üzenetére
Tényleg sok helyen használják. BigData elemzéshez rengeteg Python-ban íródott eszköz van, szóval az is sokat segít a felhasználóbázis növelésében. A szintaktikáját én sem szeretem, de még mindig sokkal barátságosabb, mint a Perl. Van egy olyan vicc, hogy mi lesz ha leültetsz egy millió majmot kódolni? Egy majom C++ kódot ír, a többi Perl-t.
-
-
dobragab
addikt
válasz
Ereshkigal #3405 üzenetére
A C++98 mára egy elég jól dokumentált és fefedezett nyelv, azt szerintem tényleg 9/10-re ismeri.
Viszont folyamatosan kerülnek bele új feature-ök. C++11 még egészen jól követhető. C++14 nem hozott annyi gyökeres újdonságot, mint a C++11, de azért volt bőven. A C++17 tervezete és az eddig elfogadott módosítások alapján már most elég vad (operator. például), ezt érdemes végigcsemegézni. Fogadni mernék, hogy ebben is találnak majd olyan hidden feature-öket, mint anno a template metaprogramming volt.
Úgyhogy szerintem nem ismeri jobban a C++-t, mint 7/10, max. 5/7
-
-
ToMmY_hun
senior tag
válasz
bandi0000 #3399 üzenetére
A BSc elvégzése nagyon ajánlott. Nélküle nem, vagy nagyon kis eséllyel fogsz bejutni komolyabb cégekhez. Persze lehetsz kivételesen nagy tehetség, de egy diploma akkor sem árt.
#3402 - bandi0000 Pedig nagyon is hasznos. Nem az átadott konkrét tudás miatt, hanem a gondolkodásmód miatt, amire késztet/rávezet ha arra alkalmas vagy.
Ú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!
- Eladó használt Gigabyte AMD Radeon HD 6750 videókártya
- GIGABYTE GTX 1060 Mini ITX OC 3GB videókártya
- Új ASUS VivoBook 15 X1504VA - 15,6"FHD IPS - i5-1335U - 16GB - 512GB - Win11 - 1,5 év gari - MAGYAR
- Eladó ASUS ROG Zephyrus G14 GA401Q + teljes gamer szett --csere is érdekel
- Apple iPhone 8 - 256 GB - fekete (152)
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest