Szegmens hiba – de miért?

Kezdőlap Fórumok Programozás Szegmens hiba – de miért?

10 bejegyzés megtekintése - 31-40 / 77
  • Szerző
    Bejegyzés
  • #2164548
    pointux
    Felhasználó

      Én a helyedben, valami ilyesmit próbálnék ki:

      Code:
      #define PAGE_SIZE 50
      typedef char * nc_dir_t;
      typedef nc_file * nc_files_t;

      int nc_readdir ( nc_dir_t nc_dir, nc_files_t *nc_files ) {
      size_t idx = 0;
      size_t pages = 1;

      ( *nc_files ) = ( nc_files_t ) malloc ( PAGE_SIZE * sizeof ( nc_file ) );

      while ( d_file = readdir ( d_dir ) ) != NULL ) {
      if ( idx >= ( pages * PAGE_SIZE ) ) {
      ( *nc_files ) = ( nc_files_t ) realloc ( nc_files, pages * PAGE_SIZE * sizeof ( nc_file ) );
      pages ++;
      }

      /* … */

      idx ++;
      }

      return idx;
      }

      Ez átláthatóbb szerintem. A malloc előtti beszúrt kov. miatt meg kompatibilisebb lesz. (Pl. a c++ fordítók nem fordítják le úgy, csak külön kapcsolóval.)
      Ezeket a memória blokkokat is egyszerűsíteném. Nem 30+50, hanem mindig ugyanaz.

      Ez meg így valószínű, hogy nem jó:

      Code:
      typedef struct nc_file {
          /// the name of the file
          char *name;
          /// the properties (from stat.h)
          struct stat *props;
          /// file is selected
          char selected;
      } nc_file;
      #2164549
      pointux
      Felhasználó

        Én a helyedben, valami ilyesmit próbálnék ki:

        Code:
        #define PAGE_SIZE 50
        typedef char * nc_dir_t;
        typedef nc_file * nc_files_t;

        int nc_readdir ( nc_dir_t nc_dir, nc_files_t *nc_files ) {
        size_t idx = 0;
        size_t pages = 1;

        ( *nc_files ) = ( nc_files_t ) malloc ( PAGE_SIZE * sizeof ( nc_file ) );

        while ( d_file = readdir ( d_dir ) ) != NULL ) {
        if ( idx >= ( pages * PAGE_SIZE ) ) {
        ( *nc_files ) = ( nc_files_t ) realloc ( nc_files, pages * PAGE_SIZE * sizeof ( nc_file ) );
        pages ++;
        }

        /* … */

        idx ++;
        }

        return idx;
        }

        Ez átláthatóbb szerintem. A malloc előtti beszúrt kov. miatt meg kompatibilisebb lesz. (Pl. a c++ fordítók nem fordítják le úgy, csak külön kapcsolóval.)
        Ezeket a memória blokkokat is egyszerűsíteném. Nem 30+50, hanem mindig ugyanaz.

        Ez meg így valószínű, hogy nem jó:

        Code:
        typedef struct nc_file {
            /// the name of the file
            char *name;
            /// the properties (from stat.h)
            struct stat *props;
            /// file is selected
            char selected;
        } nc_file;
        #2164550
        pointux
        Felhasználó

          Egyébként szerintem ez a hiba azt jelentik, hogy olyan helyre írsz, ami nem tartozik a program, vagy szegmens „hatókörébe”. Ez általában akkor fordul elő, ha valaminek nincs lefoglalva hely.
          Én folyamatosan kiíratnám az indexeket, meg azt, hogy minek mekkora helyet foglaltam ill. azt, hogy mi a memória címe. Mert elvileg itt jól van átadva a függvénynek, de vajon jól van azon kívül lekezelve?

          #2164551
          pointux
          Felhasználó

            Egyébként szerintem ez a hiba azt jelentik, hogy olyan helyre írsz, ami nem tartozik a program, vagy szegmens „hatókörébe”. Ez általában akkor fordul elő, ha valaminek nincs lefoglalva hely.
            Én folyamatosan kiíratnám az indexeket, meg azt, hogy minek mekkora helyet foglaltam ill. azt, hogy mi a memória címe. Mert elvileg itt jól van átadva a függvénynek, de vajon jól van azon kívül lekezelve?

            #2164552
            pointux
            Felhasználó

              A gtk-sok így csinálják. Ez a tuti. 🙂

              Code:
              typedef struct _nc_file nc_file;

              struct _nc_file {
              };

              Bár szerintem összevonva is jó, de úgy, hogy két azononos „neve” van, nem biztos.

              #2164553
              pointux
              Felhasználó

                A gtk-sok így csinálják. Ez a tuti. 🙂

                Code:
                typedef struct _nc_file nc_file;

                struct _nc_file {
                };

                Bár szerintem összevonva is jó, de úgy, hogy két azononos „neve” van, nem biztos.

                #2164554
                uzsolt
                Felhasználó

                  Lehet, hogy sz@r a gépem, de még így is szegmens hiba…

                  Index-kiírás:
                  printf(„%d. %sn”,nof,d_file->d_name)
                  Még ha beírom, hogy a page*PAGE_SIZE értékét is, ezt írja ki:

                  Code:
                  DEBUG: nc.c 92. strdup
                  439. fish_indent (foglalt: 450)
                  *** glibc detected *** malloc(): memory corruption: 0x080d55d8 ***
                  Félbeszakítva (core dumped)

                  GTK-s módszer: szintén.

                  Próbáld már ki, nehogy már csak nálam legyen a hiba…

                  #2164555
                  uzsolt
                  Felhasználó

                    Lehet, hogy sz@r a gépem, de még így is szegmens hiba…

                    Index-kiírás:
                    printf(„%d. %sn”,nof,d_file->d_name)
                    Még ha beírom, hogy a page*PAGE_SIZE értékét is, ezt írja ki:

                    Code:
                    DEBUG: nc.c 92. strdup
                    439. fish_indent (foglalt: 450)
                    *** glibc detected *** malloc(): memory corruption: 0x080d55d8 ***
                    Félbeszakítva (core dumped)

                    GTK-s módszer: szintén.

                    Próbáld már ki, nehogy már csak nálam legyen a hiba…

                    #2164556
                    pointux
                    Felhasználó
                      uzsolt wrote:
                      Lehet, hogy sz@r a gépem, de még így is szegmens hiba…
                      Próbáld már ki, nehogy már csak nálam legyen a hiba…

                      Szerintem kizárt.
                      De dobd fel file-ban, amire eddig jutottál, oszt kipróbálom.

                      #2164557
                      pointux
                      Felhasználó
                        uzsolt wrote:
                        Lehet, hogy sz@r a gépem, de még így is szegmens hiba…
                        Próbáld már ki, nehogy már csak nálam legyen a hiba…

                        Szerintem kizárt.
                        De dobd fel file-ban, amire eddig jutottál, oszt kipróbálom.

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