Pjotr Posted December 19, 2009 Posted December 19, 2009 Ja, hogy másét, értem. Akkor úgy kell indítani, hogy elõbb tuningnotepaddel beigazítasz mindent.
KGigi Posted December 19, 2009 Posted December 19, 2009 Igen, végülis még mindig jobb, mint rájönni, hogy hol próbálja meg másodszor felszabadítani a memóriát.
kisbikk Posted January 16, 2010 Posted January 16, 2010 Én segítséget szeretnék kérni egy olyan feladatban, hogy definiáljon olyan függvényt amelynek a paraméterei egy N elemű tömb és hogy hányadik elemet szeretnénk törölni a tömbből a visszatérő értéke N-1, és a törlés úgy történjen hogy a törlendő elemet az utána lévő elemmel írjuk felül. Ha valaki írna erre egy függvényt nagyon megköszönném. A segítséget előre is köszönöm.
KGigi Posted January 16, 2010 Posted January 16, 2010 Ez elemi programozási feladat, nem értem, mi nem megy rajta. int típusú függvény, a visszatérési értéke N-1, a törzse pedig annyi, hogy a tömb "paraméteredik" elemét felülírod a rákövetkezővel (túlcsordulásra figyelj, az utolsó elemnél nem lesz rákövetkező). Amúgy ennek nem sok értelme van, szerintem inkább arra gondolnak, hogy törlés után a törölt elemet követő elemek eggyel balra csússzanak.
kisbikk Posted January 16, 2010 Posted January 16, 2010 (edited) Kösz a segítséget, akkor csak én akartam túlbonyolítani. Edited January 16, 2010 by KGigi
skybot Posted January 18, 2010 Posted January 18, 2010 Mielõtt komolyabban belebonyolódnánk, tisztázzuk, hogy ANSI C vagy C++? C++-ra gondoltam. Bocsi a késõi válaszért, csak közbe elkalandoztam. Készülök emelt infó érettségire. Úgy döntöttem a C++ lesz a választott nyelvem. (Végre behozták a DEV C++-t) Szurkoljatok!
Pjotr Posted January 23, 2010 Posted January 23, 2010 Van nekem egy ilyenem: if(sor[7]=='X' || sor[7]=='x') winver=2; Ha Visual Studioban fordítom, akkor úgy mûködik, ahogyan kell. Ha a jelölt helyen kis/nagy x áll, akkor 2-es lesz a winver értéke. Ellenben ha Code::Blocks-ban, akkor nem jól mûködik, mert akkor is kettes lesz, ha nem igaz a feltétel. Alapból 0 a winver értéke. Hogyan lehetséges ez, mit nem tudok?
KGigi Posted January 23, 2010 Posted January 23, 2010 Én kiíratnám a nyolcadik elemeket, hátha kiderül a turpisság. Kaptam egy olyan tippet is, hogy zárójelezd be teljesen.
Pjotr Posted January 23, 2010 Posted January 23, 2010 Megvan a gond, olyan adatba szaladtam, amire nem voltam felkészülve, most már megy. Persze azt nem értem, hogy a VS miért nem akadt fenn rajta.
Pjotr Posted January 23, 2010 Posted January 23, 2010 ÕÕÕ, túl ocsmány ez ahhoz. De ha valaki megmondja, hogyan tudok 2 dimenziós karaktertömböt kezelni mutatóval úgy, hogy a sorok száma változó, akkor megcsinálom, és megmutatom. Lehetne éppen stringgel, de arról semmi fogalmam, nálunk nem volt.
KGigi Posted January 23, 2010 Posted January 23, 2010 De mi a probléma? Egy sima dinamikus tömbbel és char*-gal is mennie kell. Én mondjuk vector<string>-et használnék... Egyébként egy sima typedef némi bónusszal. Pl. lehet visszatérési érték típusa és amíg valahol nem módosítod, addig akárhányszor hivatkozol rá, nem másolódik.
Pjotr Posted January 24, 2010 Posted January 24, 2010 Az biztos, hogy sima char* és hasonlókkal nem lehetséges. Példaként: char**argv ugyanazt jelenti, mint a char*argv[] ebbõl következik, hogy char[][]-ot nem lehet mutatózni Amit említettél vector-varázslatot, azt szintén nem vettük, így arról sincs fogalmam.
arpsoft Posted January 24, 2010 Posted January 24, 2010 typedef struct egysor{ char *sor; } egysor *szoveg; int iSorokSzama=0; egysor *ujsor(char *sEztrakdbele) { egysor *s; if(iSorokSzama) szoveg=realloc(szoveg,++iSorokSzama*sizeof(egysor)); else szoveg=alloc(++iSorokSzama*sizeof(egysor)); if(sEztrakdbele) { szoveg[iSorokSzama-1]->sor=(char*)malloc(strlen(sEztrakdbele)+1); strcpy(szoveg[iSorokSzama-1]->sor,sEztrakdbele); } } Nem ellenõriztem le és csak úgy fejbõl írtam, lehet hogy a definíciót egy kicsit át kell írni az elején. Ha ennél is egyszerûbben szeretnéd kezelni az egyes sorokat, akkor célszerû láncolt listát építeni, amiben az elemi mûveleteket (beszúrás, törlés, csere) sokkal könnyebben el lehet végezni. ebbõl következik, hogy char[][]-ot nem lehet mutatózni De lehet, csak némi megkötéssel: fix sorhosszúságokkal kell dolgozni. A C folytonosan kezeli a memóriát, így egyszerû mutató aritmetikával meg lehet mondani, hogy ki hol van. Pl: 100 karakter széles sorokkal a 40. sor 20. karakterének címe: 39*100+20. char szoveg[100][100]; char *s; int iSor=40,iOszlop=20; s=szoveg+sizeof(char)*(iSor-1)*100+iOszlop;
Pjotr Posted January 24, 2010 Posted January 24, 2010 Emésztem, Mester! A mutatózást úgy értettem, hogy nem lehet szimplán lefoglalni: char* p=new char [valtozo_meret][50] --- Alakulok, bár egyelőre elszáll.
Pjotr Posted January 24, 2010 Posted January 24, 2010 void Update::Novel(char t[]) { char** uj=new char* [db]; for(int i=0;i<db;i++) { uj[i]=new char [50]; } for(int i=0;i<db-1;i++) { strcpy(uj[i],szoveg[i]); cout<<uj[i]<<endl; //itt marhasagokat firkal } strcpy(uj[db-1],t); delete [] szoveg; //ez kell szoveg=uj; //delete [] uj; <-- ez viszont az, amit nem szabad csinalni uj=NULL; } Így próbálkozom, az biztos, hogy nem akar működni. A db változót ismeri, még a függvény meghívása előtt nő. A szoveg is az osztály tagja (char** szoveg).
KGigi Posted January 24, 2010 Posted January 24, 2010 Persze, hogy baromságokat firkál. Hiszen a tömböd elemei char*-ok. Kell egy * eléje. Egyébként felesleges az strcpy, simán tudsz közvetlenül másolni. Más. Ráállítod a szöveget az újra, majd az újat törlöd. Így a szöveg nem létezõ memóriára fog mutatni.
Pjotr Posted January 24, 2010 Posted January 24, 2010 'csába, elírtam. A szoveg memóriáját kell törölni, nem az uj-ét. Nem is figyeltem, hogy itt a hiba. Tiszta hülye, aki nem normális. Egyébként nincs más gondom, sikerült átírnom mindent az eredetiről teszt nélkül is.
KGigi Posted January 24, 2010 Posted January 24, 2010 Te figyelj csak. Ez létrehoz egy új kétdimenziós tömböt, amibe belemásolja a szöveget, kivéve az utolsó sort. Oda beteszi a paraméterül kapott szöveget. De a vége nem így van. delete[] szoveg; szoveg = uj; uj = 0; Fordítva, ahogy te írtad, érdekes lesz az eredmény.
Pjotr Posted January 24, 2010 Posted January 24, 2010 Jól írod, így van. Én szúrtam el először, már nekem is ilyen. Bele is írtam a kérdező hozzászólásom kódjába, mi a gond (vagyis mi volt).
KGigi Posted January 24, 2010 Posted January 24, 2010 Amúgy minek másolod le az egész tömböt, miért nem az eredeti utolsó sorát írod felül?
KGigi Posted January 24, 2010 Posted January 24, 2010 De ez egy másolás ideiglenes objektummal, nem? És Update a függvény neve is. Tulajdonképpen mit csinálsz?
Pjotr Posted January 24, 2010 Posted January 24, 2010 Update az osztály neve. A lényeg az, hogy létrehozok egy egy db sorral nagyobb tömböt, amibe beleírom a régi tömb elemeit, majd a kimaradt utolsó sorba berakom az aktuális elemet. Törlöm a régi tárhelyet, a régi mutatóra ráhúzom az új n+1 sorú tárhelyet. Szóval a "másolás ideiglenes objektummal" megállapítás helyes, csak semmilyen sorfelülírás nem történik.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now