Új hozzászólás Aktív témák
-
kmisi99
addikt
válasz
h1ght3chzor #2471 üzenetére
Azóta tettem egy próbát a code blocks al máshonnan töltöttem le egy másik verziót ez már tökéletesen futtat, de kössz az ajánlást.
-
Dave-11
tag
válasz
h1ght3chzor #2369 üzenetére
Van persze, csak az a gond azokkal hogy mindig más nyelven van. Legtöbbször Pascal, még előfordul a C++ is, de van néhány Delphis is. Meg volt amit most csináltam feladatot, és nem volt jó a megoldás egy része
Szóval vannak ilyenek, de alapjába véve jók a megoldások. -
BTminishop
aktív tag
válasz
h1ght3chzor #2356 üzenetére
Kösz szépen
-
chabeee
aktív tag
válasz
h1ght3chzor #2326 üzenetére
igen, nem értem miért.
-
chabeee
aktív tag
válasz
h1ght3chzor #2322 üzenetére
nem a tomb2 szamlalo2 méretű és az idx-edik elemet akarom törölni.
tehát azt csináltam az elsőnél hogy elmentem idx-ig ott belerakosgattam az elemeket a temp-be, utána idx+1-től mentem és a temp[i-1]-be raktam bele tehát akkor ott folytatja ahol abbahagyta az előtte lévő ciklusnál.
szerk.: valószínűleg az lesz a hiba hogy a tomb2-t nem foglalom újra. meglesem. -
chabeee
aktív tag
válasz
h1ght3chzor #2320 üzenetére
hát elvileg ez jó,
tomb2 tartalmát törli és mivel ő egy pointer ráállítom a temp-re ami ugyanúgy egy többre mutat. -
Chipi333
csendes tag
válasz
h1ght3chzor #1570 üzenetére
Szerintem a pointer és a tömb fogalmát nem érdemes összemosni, mert két teljesen különböző dologról van szó. Az, hogy egy tömböt általában úgy szokás használni, hogy egy pointerrel mutatsz az elejére nem jelenti azt, hogy minden pointer mögött tömb lesz.
-
ArchElf
addikt
válasz
h1ght3chzor #1545 üzenetére
Szerintem még lehet memóriaszivárgás, mert az itt generált elemeket:
this->temp = new Project [pm+1];
nem szabadítod fel, hanem egyszerűen a hivatkozáést felülcsapod ezzel:
for(i=0;i<pm;++i){ this->temp[i]=tomb[i];}
Ezen elméláztam este, de nem tudtam működő megoldást találni elemszintű cserére. Nem vagyok sajna c++ terén ennyire jártas...Ja és még egy probléma: ha referencia alapján tárolod le (nem másolod), akkor a kód mindig (fizikailag) ugyanazt a változót teszi be a memóriába:
if(menu=='1'){
system("CLS");
char projektnev[200];
int projektmeret;
cout << "Adja meg a projekt nevet: ";
cin >> projektnev;
cout << endl;
cout << "Adja meg a projekt memoriameretet: ";
cin >> projektmeret;
if(projektmeret<=0){
cout << endl;
cout <<"Hibas memoriameretet adott meg!"<< endl;;
cout << "Adja meg a projekt memoriameretet: ";
cin >> projektmeret;
}
b.psetname(projektnev);
b.setmeret(projektmeret);
a.phozzaad(b);
}Így tényleg a legjobbnak tűnik egy a másoló operátort felülírni (operator=) és nincs több gond...
AE
-
ArchElf
addikt
válasz
h1ght3chzor #1540 üzenetére
Memóriaszivárgásra csak azt tudom, hogy ha másolod az elemeket, akkor lehet törölni az eredeti tömböt...
copy operator a project-re:
void Project::operator=(Project& p){
this->kezdocim=p.kezdocim;
this->meret=p.meret;
//következő sor esetleg még kellehet
//delete[] this->nev;
this->nev=new char[sizeof(p.nev)];
strcpy(this->nev, p.nev);
}Kicsit tesztelgettem, de úgy néz ki a terület allokálással még gondok vannak.
Nem merültem nagyon bele, de simán kiosztott az első üres helyre két helyet foglaló projectnek területet (és utána azt törölve törölte az utána következőt is):
Memória: 5
A:1 hozzáadása
B:1 hozzáadása
A törlése
C:2 hozzáadása (nem a 3. memóriahelyre teszi, hanem az elsőre)
C törlése (törli a B helyét is)AE
-
h1ght3chzor
őstag
válasz
h1ght3chzor #1538 üzenetére
Boccs, félreírtam, eltárolja, viszont vmit elnéztem feljebb, mert ha kitörlök egy középső elemet, akkor vmiért 0-s kezdőcímet kap.
Ezt még kidebugolom, viszont a memóriaszivárgás ismét kérdéses.
-
ArchElf
addikt
válasz
h1ght3chzor #1538 üzenetére
Nálam működik így:
int pm = getprojektmeret();
Project* temp1 = new Project [pm+1];
int i;
for(i=0;i<pm;++i){
temp1[i]=this->tomb[i];
}
temp1[i]=a;
this->tomb = temp1;
temp1 = 0;AE
-
ArchElf
addikt
válasz
h1ght3chzor #1536 üzenetére
A delete[] this->tomb; nélkül. Ugyanis ez is kitörli az eredeti elemeket.
AE
-
ArchElf
addikt
válasz
h1ght3chzor #1524 üzenetére
Amit kiókumláltam (hiányos c++ tudásommal):
Project* temp1 = new Project [getprojektmeret()];
for(int i=0;i<getprojektmeret();++i){
temp1[i]=this->tomb[i];
}
delete[] this->tomb;
this->tomb = new Project[getprojektmeret()+1];
int k=0;
for(k=0;k<getprojektmeret();++k){
this->tomb[k]=temp1[k];
}
this->tomb[k]=a;
delete[] temp1;A második sorban referencia szerint másolod át az osztályokat, így hiába másoltad át, ha a referencia a temp1-ben ugyanoda mutat, mint a tomb-ben.
Miután az 5. sorban delete-tel kitörlöd a tömböt látszólag törlődik a temp1 tömb tartalma is, hiszen a delete igazából nem (csak?) a hivatkozás tömböt törli, hanem a mögötte álló tartalmat is. A következő sorbancsinálsz egy új tömböt az elemeidnek, de azok már valójában törlődtek az előző sorban, hiába másolod át a for ciklusban, már nem lesznek valid elemek (príma érvénytelen hivatkozásokat sikerül így generálnod. A második delete meg valószínűleg azért hal meg, mert már eleve érvénytelen hivatkozások vannak a tömbben.Alapvetően az alábbi lehetőségeid vannak:
- ne töröld az elemeket delete-el (se az elején se a végén), csak nullázd ki a tömbböt, az új elemet add hozzá egyszerűen (lehet, hogy memory leak-et okoz - bár jobban belegondolva taláűn nem is)
- nem kell a sok másolgatós mizéria, csinálj neki egy új tömböt a régit meg dobd el (kb ugyanaz mint az előző, kevesebb másolással), korábban már írtam hogyan
- add át érték szerint az elemeket - kell hozzá egy Project(const Project& p) konstruktor, amivel másolni tudod az elemeket. Bonyolultabb (illetve volatilis) osztályok esetén nem igazán működik, de ha mindenképp szeretnéd használni a delete-et akkor ide jó lesz.AE
-
proci985
MODERÁTOR
válasz
h1ght3chzor #1524 üzenetére
teljes kód nem kell, pl egy tömb típusa, még az a is elég szvsz.
tipp: szeparáld a tárolóclasst a projecttől, és teszteld pl egy célra létrehozott classal külön. szerintem egyszerűbb lenne, hacsak nem valami minimálprojektről van szó, ahol nem éri meg mindent szétválasztani.
"Egyébként stl tárolót, nem használhatok"
beadandó?WonderCSabo: jogos, push_back pedig tényleg a legegyszerűbb
.
Mindent van értelme dinamikusan kezelni, sokszor jól jöhet (bár nyilván ilyen kicsi feladatnál nem sok értelme van).
persze, de elnézve a kódot volt egy olyan sanda gyanúm, hogy itt valami egyéb követelmény is van a háttérben (tipikus c iskolapéldának tűnt).. -
ArchElf
addikt
válasz
h1ght3chzor #1510 üzenetére
Én ezt a getprojektmeret() hívást egyszer tenném be egy változóba és az egész eljárás alatt azt a változót használnám (gyorsabb és egyszerűbb is).
Amúgy mit csinál a getprojektmeret() metódus? Megnézi mekkor a tomb mérete?
Mert itt az elözö sorban épp törlöd a tömböd...
//...
delete[] this->tomb;
this->tomb=new Project [this->getprojektmeret()+1];
//...AE
-
Jhonny06
veterán
válasz
h1ght3chzor #1514 üzenetére
Nekem ez a sor gyanús, szerintem valami indexeléssel kapcsolat hiba lesz:
this->tomb=new Project [this->getprojektmeret()+1];
-
h1ght3chzor
őstag
válasz
h1ght3chzor #1513 üzenetére
-
proci985
MODERÁTOR
válasz
h1ght3chzor #1510 üzenetére
(memműveletekben annyira nem vagyok jó)
szerintem itt a getprojectmeret lesz a hunyó, elvileg az a Memory classhoz tartozik, és a projectméret által visszaadott változó nem lesz updatelve az új, egyel nagyobb értékre. magyarul a következő másolásnál elveszik az utolsó eleme a tömbnek..
vagy esetleg fel lehet még hozni a hungrish elnevezéseket, meg az elnevezési konvenciók figyelmen kívül hagyását (getProjectSize / get_project_size), bár valszeg nem azokra gondoltak
-
Jhonny06
veterán
válasz
h1ght3chzor #1500 üzenetére
Én a CodeToGo-t használtam egy ideig, de nem tud sokat, úgyhogy ne várj csodát. Jobb szerintem nincs.
-
Lavidaloka
aktív tag
válasz
h1ght3chzor #1461 üzenetére
Igen ...ingyenes.
Már több mint fél éve használtam csak most ez a game frisítés miatt nem megy.
Idézném:PHP Code:
class CWeapon
{
public:
char unknown0[36]; //0x0000
CTemplate* weapon_template; //0x0024
char unknown40[460]; //0x0028
CDeviation* weapon_deviation; //0x01F4
char unknown504[4]; //0x01F8
CBreathingComponent* weapon_breathing; //0x01FC
};//Size=0x0200(512)with this
PHP Code:
class CWeapon
{
public:
char unknown0[36]; //0x0000
CTemplate* weapon_template; //0x0024
char unknown40[460]; //0x0028
CDeviation* weapon_deviation; //0x01F4
char unknown504[260]; //0x02F8
CBreathingComponent* weapon_breathing; //0x02FC
};//Size=0x0200(512) -
ArchElf
addikt
válasz
h1ght3chzor #1449 üzenetére
Nem könyvből csak gyomorból:
Lefoglalsz egy nagy memóriaterületet és csinálsz egy listát a még szabad területekről.
Foglaláskor végigszaladsz az egész listán és megnézed, hogy mi az a memóriaszegmens, ami a szükségsnél nagyobbak közül a legkisebb. Ennek az elejére kell berakni a foglalást és ennek megfelelően frissíteni a listát.AE
Új hozzászólás Aktív témák
Hirdetés
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- ÁRGARANCIA!Épített KomPhone Ryzen 7 7800X3D 32/64GB RAM RTX 5070Ti 16GB GAMER PC termékbeszámítással
- BESZÁMÍTÁS! Samsung Galaxy A34 5G 128GB mobiltelefon garanciával hibátlan működéssel
- AKCIÓ! VALVE INDEX virtuális valóság szemüveg garanciával hibátlan működéssel
- Bowers/Wilkins PX8 fejhallgatók (dupla Bluetooth eszköz csatlakoztatása!) - ELKELTEK
- Csere-Beszámítás! Gamer PC Számítógép! R9 3900X / RX 6700XT / 32GB DDR4 / 1TB SSD
Állásajánlatok
Cég: CAMERA-PRO Hungary Kft
Város: Budapest
Cég: PC Trade Systems Kft.
Város: Szeged