Jump to content
GSForum - Segélyvonal

Programozás C/C++-ban


Recommended Posts

Posted

Ja, hogy másét, értem. Akkor úgy kell indítani, hogy elõbb tuningnotepaddel beigazítasz mindent. :fogatlan:

Posted

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. :D

  • 4 weeks later...
Posted

É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.

Posted

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.

Posted (edited)

Kösz a segítséget, akkor csak én akartam túlbonyolítani.

Edited by KGigi
Posted
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) :D Szurkoljatok! :)

Posted

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?

Posted

É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.

Posted

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. :pislog:

Posted

ÕÕÕ, túl ocsmány ez ahhoz. :fogatlan: 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. :fal:

Posted

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.

Posted

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. :)

Posted

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. 8)

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;

Posted

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.

Posted

Pontosan erre való a string és a vector. :)

Posted

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).

Posted

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.

Posted

'csába, elírtam. :fal: 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. :)

Posted

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.

Posted

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).

Posted

Amúgy minek másolod le az egész tömböt, miért nem az eredeti utolsó sorát írod felül?

Posted

Nem írom felül egyiknek sem az utolsó sorát.

Posted

De ez egy másolás ideiglenes objektummal, nem? És Update a függvény neve is. Tulajdonképpen mit csinálsz? :D

Posted

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.

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...