Miért száll el memóriafoglalás közben a C++ progi ?

Kezdőlap Fórumok Programozás Miért száll el memóriafoglalás közben a C++ progi ?

10 bejegyzés megtekintése - 1-10 / 11
  • Szerző
    Bejegyzés
  • #1965893
    pointux
    Felhasználó

      Közölj valami konkrétumot, (mi az objektum, változók benne, fõleg ha mutatók, még az elsõ függvény is érdekes lehet nemcsak a második, és fõként), mert így csak a levegõben beszélünk.

      #1965894
      mjoker
      Felhasználó

        Mindössze egy osztályom van. Amikor létrehozok egy osztálypéldányt, (konzolos progi lévén) bekérek egy parancsot, ami meghívja az osztály egy függvényét. Mindegy melyik függvényt hívom meg elõbbés uténa melyiket, az eredmány ugyanaz. De a második parancs után elszáll a progi. Nyomon követtem a dolgokat és biztos, hogy amikor egy változónak memóriát foglalok, akkor van valami probléma.
        Próbaképpen meghívtam minden függvény a kostruktorból és akkor nem volt gond.

        #1965895
        pointux
        Felhasználó
          #1965896
          mjoker
          Felhasználó
            Code:
            #include „telo.h”

            int main()

            {

             char *parancs=new char[30];

             char kar;

             class Telefon t;

             while (!0)

               {

                 printf(„telo $ „);

                   fgets(parancs,30,stdin);

                 parancs[strlen(parancs)-1]=’’;

                 if (strcmp(„tk”,parancs)==0)

                   t.telefonkonyvet_kiir();

                 else if (strcmp(„sms”,parancs)==0)

                   t.sms_mind_kiir();

                 else if (strcmp(„exit”,parancs)==0)

                   break;

                }

             printf(„A kapcsolat bontása…n”);

            }

            Itt mindegy hogy a konzolról melyk parancsot hívom meg a másodikkra rossz lesz.

            #1965897
            pointux
            Felhasználó

              Tessék máris a class Telefon t; hibás, mert a class az osztály deffiniálásához kell.
              Helyette Telefon t, vagy dinamikusan Telefon *t, de vigyázz, mert akkor neked kell törõdni a memoria lefoglalással és ne felejtsd el felszabadítani sem, ill. . helyett -> kell.
              Nem látszik ugyan, de a new= char… után sem árt delete.
              Ha ilyen kis helyfoglalásról van szó, akkor lehet statikus is, ha mindenképpen dinamikus kell sokkal célszerûbb valamelyik alloc használata, calloc, malloc stb. Van olyan közülük, amely figyel a túlcsordulásra is, ezeknek nézz utána, mert most nem tudom megmondani.

              #1965898
              pointux
              Felhasználó

                Már csak azért is mert ez így jó
                char *parancs;
                parancs = new char[30];

                Vagyis legalábbis így biztos, hogy jó.

                #1965899
                Leslieman
                Felhasználó

                  A progi jónak tûnik, így esetleg a telefon osztályt is ide másolhatnád. Legalább a két meghívott metódusával.
                  Amúgy nem értem, miért a 30 karaktert hozod létre dinamikusan, miért nem inkább az osztálypéldányt, de persze mind1. De a new-t azért illik a végén felszabadítani. Vagy csak ebbõl a kódrészletbõl maradt ki?

                  #1965900
                  Leslieman
                  Felhasználó

                    hehe, közben Vizsla ugyan azt leírta, míg én vacsiztam a szerkesztés közben. 😆

                    #1965901
                    mjoker
                    Felhasználó

                      A két meghívott függvény:

                      Code:
                      void Telefon::sms_mind_kiir()

                       {

                         int i,*sor;

                         

                         smsek();

                         sor=(int *) smst_idoben_rendez();

                         for (i=0;i” : „<-",                  sms[sor[i]].idopont.ev,sms[sor[i]].idopont.honap,sms[sor[i]].idopont.nap,sms[sor[i]].idopont.ora,sms[sor[i]].idopont.perc,sms[sor[i]].idopont.mp,                  sms[sor[i]].telszam,telefonkonyvbol_olvas(sms[sor[i]].telszam),sms[sor[i]].szoveg);  } void Telefon::telefonkonyvet_kiir()  {    int  i,*sor;        telefonkonyvek();    sor=(int *) telefonkonyvet_nev_szerint_rendez();    for (i=0;telefonkonyv.bejegyzesek[i].telszam;i++)      printf("%-15s %-15s (%d)n",telefonkonyv.bejegyzesek[sor[i]].nev,telefonkonyv.bejegyzesek[sor[i]].telszam,telefonkonyv.bejegyzesek[sor[i]].tarhely);  }

                      #1965902
                      pointux
                      Felhasználó

                        A sornak is legyen helye, mert ez csak egy mutató.
                        Mert gyanítom, hogy a függvény is csak egy mutatót ad vissza, ami nincsen sehova irányítva, meg lehet oldani, de így szokás

                        int tomb[valamennyi]; //vagy dinamikusan
                        int *mutato;
                        mutato=&tomb;

                        int rendezes(int *mutato) {
                        //rendezo algoritmus a mutato[x]-be ír valamit.
                        // és átad hibaüzit, ha valami nem jó
                        }

                      10 bejegyzés megtekintése - 1-10 / 11
                      • Be kell jelentkezni a hozzászóláshoz.