- 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
Hirdetés
-
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.
-
Már tudjuk, hogy mikor jön az idei Xbox Games Showcase
gp A showt egy külön Direct előadás követi, ami szinte biztosan az idei Call of Duty lelepelzése lesz.
Új hozzászólás Aktív témák
-
Jester01
veterán
// main
void main ()
... helyett ...
int main (int, char**)
(és persze return 0; a végére)
for(int i=0;i=9;i++)
... helyett ...
for(int i=0;i<=9;i++)
// fifo.cpp
tmp[elementnum-1]=n;
... helyett ...
tmp[elementnum]=n;
fifo::pop ()
... helyett ...
int fifo::pop ()
x=t[elementnum];
... helyett ...
x=t[elementnum - 1];Jester
-
Jester01
veterán
Rengeteg baj van vele, sört nem szeretem és azt se ha valaki több topikba is beírja ugyanazt.
Mindenesetre az elsõ 2 probléma (futásidei sorrendben)
1) v1.erase(12) miatt exception lesz hiszen csak 10 elem van a vektorban (szerintem tévedésbõl felcserélted a 2 sort)
2) az Exception osztályodnak nincs copy constructora, emiatt (és mert nem dinamikus példányt hozol létre) a message kétszer lesz felszabadítva.Jester
-
Jester01
veterán
Az Exception osztálynak nincs olyan konstruktora, ami egy másik Exception-t fogad paraméternek. A copy constructor szignatúrája így néz ki:
Exception(const Exception& source)
MOD: ha te nem csinálsz ilyet akkor a fordító generál egyet. De az tagonkénti értékadás lesz így aztán több példány is ugyanazt a message tagot fogja használni és mindegyik fel akarja szabadítani. Le kell másolni.
[Szerkesztve]Jester
-
bpx
őstag
ezt még fordítani sem tudom, egyszerűbb ha felteszed a forrásfájlt vhova
(smile-kat + stringkonstansokat még visszairogattam, de így is elég sok errort dob, pl. char*-nak adsz chart értékül, vagy char*-ot hasonlítasz össze char-ral)
vagy pl. egy helyen így inicializál stringet:
String::String(char c, unsigned int times)
{
elementsNum=times;
pData=new char[elementsNum+1];
for(unsigned int i=0;i<elementsNum;i++)
pData=c; // pData az char* típusú
// esetleg pData = c; a fenti helyett
pData[elementsNum]='\0';
}
[Szerkesztve] -
Jester01
veterán
Az a <class T> az olyan mint a függvényeknek (vagy makróknak) a paramétere. Tehát a T az tetszõleges név lehet. Az egész úgy mûködik, hogy a T helyére a példányosítás során adott osztályokat (típusokat) helyettesít be. A te kódodban Vector osztály nem létezik, az csak egy minta (template). Tehát igazából sehova sem írhatod azt, hogy Vector, mindenhol meg kell adnod a behelyettesítendõ típust vagy konkrétan vagy pedig template paraméterrel (ez alól azt hiszem vannak kivételek, de olyanról nem tudok, hogy ne lehetne kiírni -- vagyis az a biztos ha mindenhová kiírod).
Ezen felül csak annyi hiba volt a progiban, hogy hiányzott az assert.h és az operator<< visszatérési típusánál egy helyen lemaradt az & jel, valamint a friend deklarációnál is kell a template kulcsszó.Jester
-
caddie
csendes tag
Azt hiszem, hogy a problemak egy reszet mar leirtak, en meg javasolnek 1-2 dologt:
- nagyon nem illik a headerekbe a using namespace std;-t beleirni
- a standard konyvtar definial egy vector template osztalyt, majdnem azonos neven
- a kiiro operator definialasakor te igazabol egy free (''globalis'') fuggvenyt definialsz, amely egyik parametere template osztaly. ebbol kifolyolag az altalad definialt kiiro operatornak is templatenek kell lennie (alatta ki is van kommentezve)
- konstruktoroknal erdemes hasznalni az inicializalasi listat (ezzel kikerulheto a telejsen felesleges default konstrualas es az ezuatni ertekadas)
- unsigned int-ek helyett, erdemes hasznalni az STL-hoz hasonloan a size_t tipust
- ertekado operatorok tipikusan T& ternek vissza a lancbafuzes tamogatasa miatt, de persze lehet, neked pont az volt a celod, hogy ilyen dolgokat ne engedj meg
- mivel letezik a vektor meretenek lekerdezesere kialakitott interface (size()), ezert velemenyem szerint felesleges a kiiro template operatort friendkent deklaralni
- a NULL nem szabvanyos! nullat hasznalj helyette
- a copy konstruktort biztos igy akartad csinalni?
{
Vector<int> a;
// a-t feltoltod elemekkel
Vector<int>b(a);
}
// megsemmisul a, felszabadul a.pData;
// felszabadul(na) b.pData;
// de mivel a.pData == b.pData ami mar megsemmisult,
// ehelyett katasztrofa lesz
// alternativ eset
a.clear(); // felszabadul a.pData (b.pData is oda mutat)
b[5];
// szerencses esetben elcrachel a programod
// peches esetben pedig fut tovabb csak hulyeseg irodik ki
// megpechesebb esetben jo irodik ki
// klasszikus undefined behaviour
- copy konstruktor egyertelmuen hibas
- assert.h helyett majd inkabb cassert-et hasznald
- erase eseten, ha egy elemed volt akkor -1-re alitod az elemenNum-t
- postfix increment / decrementalas helyett erdemes a prefixet hasznalni (ahol persze azonos a ketto funkcionalitasa)
- erase eseteben a torlendo elem kihagyasa nem tul elengas, sott gyanus, hogy a for ciklusnal a ciklusfeltetel tulindexelest fog eredmenyezni
- insert-nel erdemes lenne const T& -et atadni
- ennek nem latom sok ertelmet:
if(elementNum==UINT_MAX)
{
return false;
}
de ha mar ilyenekre figyelsz, akkor erdemes lenne inkabb a C++ std altal biztositott dolgokat hasznalni, tovabba inkabb a new sikeres memoriafoglalasat ''leellenorizni''* (bar egy beadando eseteben egyiknek sincs tul sok jelentosege)
* erdemes eszrevenni, hogy alap esetben std::bad_alloc exceptiont dob, de nothrow-os valtozat hasznalataval ra lehet venni arra is, hogy nullpointert adjon vissza sikertelen foglalas eseten
- insertnel megint az kell, hogy modnjam, hogy ez nem tul elegans modja az elem beszuarasanak
- insertnel ha pos > mint az aktualis vektor merete, akkor ne egyenkent toltsd fel nullaval, hanem default konstruald nullaval inkabb
- insertnel nem latom pontosan, hogy miert pos + 1 meretu tombot foglalsz
- [] operator eseteben az az altalanos STLes megkozelites, hogy [] nem ellenoriz indexhatarokat, csak at teszi azt, igy az at fuggvenyt a [] segitsegevel valositjak meg.
- eddig sem lattam sok ertelmet az asserteknek, az amlitett dolgok nem olyan hibak amiert le kene shutdownolni az egesz programot, de ertekado operator eseteben egyenesen a jozan esz ellen megy. Abban az esetben inkabb egy return *this; kellene, amennyiben onertekadasrol lenne szo
Igy elso atfutasra en ezeket a furcsasagokat vettem eszre, nehany kozulok talan csak sznobizmus, de azert akadt kozottuk par tervezesi hiba es eletveszelyes undefined behaviour is.
[Szerkesztve]''C++ : Where friends have access to your private members.'' — Gavin Russell Baker.
-
Jester01
veterán
* Az strcmp az nem boolean visszatérési értékű kellene legyen. Ha a compare viszont igen, akkor az nyugodtan hívhatja az strcmp-t.
* Az strcmp-ben a if (i==s1.elementsNum-1) feltétel elég borzasztó, elég lenne a ciklus után visszaadni igaz értéket
* rendszeresen nem szabadítod fel az előző tartalmat
* hiányzik a lezáró 0 byte a concatenate fvben
* if(not) return false; else return true; ilyet ne csinálj már
* strchr nem mindig ad vissza értéket, de ha igen, akkor biztos, hogy kell a +1 ?
* az strstr gyakorlatilag halvaszületett
Első ránézésre ennyi.Jester
-
Jester01
veterán
strcmp: <0 =0 >0 értéket add vissza attól függően, hogy az első string kisebb, egyenlő vagy nagyobb mint a második. compare fv-t nem tudom honnan vetted, nincs a feladatban.
strstr igazából az strchr-hez hasonlóan pozíciót kellene visszaadjon mivel a te implementációdban a char*-nak szerintem semmi értelme.Jester
Ú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!