Új hozzászólás Aktív témák
-
ArchElf
addikt
válasz
Sk8erPeter #1716 üzenetére
A hsz.-edből úgy tűnt, tapasztaltál már komolyabb problémákat.
Nem tudom miből tűnt úgy a hsz-emből... (amúgy is azt ítam, hogy le fogják - nem hogy le fogom - harapni a fejét)AE
-
ArchElf
addikt
válasz
Sk8erPeter #1709 üzenetére
Akkor pl. Qt.
AE
-
ArchElf
addikt
válasz
pckownz #1696 üzenetére
Visual Studio automatikusan adja (Intellisense-nek hívják az MS felé ezt a funkciót), nem kell nyomni hozzá semmit. Referenciának meg MSDN.
Persze a VS miatt mindjárt keresztre leszel itt feszítve. Kezdj inkább MS VC++ helyett valami (bármi) más - standard - c++-t tanulni...AE
-
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
-
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
-
ArchElf
addikt
válasz
Jhonny06 #1519 üzenetére
így nem megy?
int pm = getprojektmeret();
Project* temp1 = new Project [pm];
for(int i=0;i<pm;++i){
temp1[i]=tomb[i];
}
delete[] this->tomb;
this->tomb=new Project [pm+1];
int k;
for(k=0;k<pm;++k){
Memory::tomb[k]=temp1[k];
}
Memory::tomb[k]=a;
delete[] temp1;Amúgy így nem jó?
int pm = getprojektmeret();
Project* temp1 = new Project [pm+1];
for(int i=0;i<pm;++i){
temp1[i]=tomb[i];
}
temp1[i] = a
delete[] this->tomb;
this->tomb = temp1;AE
-
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
-
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
-
ArchElf
addikt
Gyomorból (ellenőrzés nélkül):
int pg = 0;
qint64 BSIZE = 1024*1024*4; // 4 MB buffer
char * carray = new char[BSIZE];
while(!src.atEnd()){
qint64 readchars = src.readData(carray, BSIZE);
if (readchars <= 0) break; //valami hiba, vagy file vége
qint64 writechars = dst.writeData(carray, readchars);
if (readchars != writechars) break; //valami hiba
pg = pg + writechars;
dlg->setValue(pg);
qApp->processEvents();
}
delete carray;AE
-
ArchElf
addikt
rsync binárisokkal is működik, de fontos, hogy a sync időtartama alatt a fájl ne változzon.
A legjobb megoldás az, ha az adatbázisról csinálsz egy backupot (az adatbázis saját motorjával, ha van neki ilyen) és azt szinkronizálod le. Ha nem tudsz backupot csinálni, akkor le kell választani, vagy lockolni az egész adatbázist a szinkronizálás időtartamára.Mondjuk backup legenerálása után csak akkor érdemes rsync-kel vacakolni hogy ha lassú hálózaton/eszközön akarod keresztülnyomni a fájlt (vagy ha extra nagy méretű, de kevés dolog változik benne).
AE
-
ArchElf
addikt
-
ArchElf
addikt
Ez attól is függ, mi változott a fájlban. Ha csak append jellegű a módosítás (pl logfájl) akkor egyszerű (maradékot a végére kell írni).
Amennyiveb viszont strukturálisan változik, akkor valami hash-es megoldás javasolt: pl. mint a torrent vagy edonkey protokollban - feldarabolni a fájlt virtuálisan x megabyte-os részekre és részenként hast-t készíteni rá. Ha változott a fájl akkor azokat a részeket kell átmásolni, amelyeknek a hash-e nem egyezik a korábbi változattal (ilyenkor nem a célfájlon célszerű ellenőrizni a hash-t hanem minden szinkronizációnál le kell tárolni az aktuálisat, hogy a következő szinkronizációnál a jelenlegi állapotot azzal lehessen összevetni (ehhez persze ehhez meg az kell, hogy a célfájl ne módosuljon időközben).AE
-
ArchElf
addikt
válasz
Berenyimiki #973 üzenetére
Gondolom a feladat pont az, hogy a szám kezelését lefejleszd.
Meg lehet próbálkozni valami BCD szerű megoldással, esetleg használhatsz byte/int tömböt, de ott neked kell kezelned az átviteleket...AE
-
ArchElf
addikt
válasz
Berenyimiki #933 üzenetére
AE
-
ArchElf
addikt
válasz
WonderCSabo #854 üzenetére
Ha nem kell neki a jövőben, minek tanulja meg... Néha nem értem minek szivatják ezzel az embert. Egy átlagember nem (de még egy átlaginformatikus sem) a programozásból fog megélni.
AE
-
ArchElf
addikt
válasz
Nyiscsák #822 üzenetére
Szerintem ellenőrzés előtt szedd ki belőle a szóközöket, és írásjeleket, kisbetűsítsd az egészet és engedékeny esetben í->i, ó->o, ő->ö, ú->u, ű->ü; dupla/tripla betűk egynek számítanak: cs, dz, dzs, gy, ly, ny, ty, sz, zs
Ja és van 100 karakternél hosszabb (nem értelmes) palindrom is
AE
-
ArchElf
addikt
Azért éri el, mert ugyanabból az osztályból hívod. A private nem azt jelenti, hogy csak abban az objektumban, hanem hogy ugyanabban az osztályban (az oszályból generált bármely objektumban) elérhető csak a változó/függvény/objektum/stb. így a friend teljesen felesleges is...
AE
-
ArchElf
addikt
válasz
skylinelaca #349 üzenetére
LOL, gondolom rossz a CRACK. Nem hiszem, hogy a lemezre került eredeti programot debug módban fordították volna
AE
Ú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!
- Samsung Galaxy S10e 6/128GB, Normál, Kártyafüggetlen, Töltővel, 1 Év Garanciával!
- Xiaomi Poco M4 Pro 6/128GB, Normál, Kártyafüggetlen, Töltővel, 1 Év Garanciával!
- Xiaomi Redmi Note 12s 8/256GB, Normál, Kártyafüggetlen, Töltővel, 1 Év Garanciával!
- Huawei P30 Pro 8/256GB, Normál, Kártyafüggetlen, Töltővel, 1 Év Garanciával!
- Újszerű LG OLED 55 CX3LA(4K/120Hz)
- ÁRGARANCIA! Épített KomPhone Ryzen 5 7600X 32/64GB RTX 4070 Super 12GB GAMER PC termékbeszámítással
- Samsung Galaxy Note 9 128GB, Kártyafüggetlen, 1 Év Garanciával
- Bomba ár! Lenovo ThinkPad P50 - i7-HQ I 16GB I 256SSD I Nvidia I 15,6" FHD I Cam I W10 I Gari!
- ÁRGARANCIA!Épített KomPhone Ryzen 9 5900X 16/32/64GB RAM RTX 4070 12GB GAMER PC termékbeszámítással
- Azonnali készpénzes nVidia RTX 3000 sorozat videokártya felvásárlás személyesen / csomagküldéssel
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest