gabaman

Hozzászólások

10 bejegyzés megtekintése - 371-380 / 2,173
  • Szerző
    Bejegyzés
  • Hozzászólás: Szegmens hiba – de miért? #2164545
    gabaman
    Felhasználó

      A hiba oka:

      Code:
      int stat(const char *path, struct stat *buf);

      vs

      Code:
                struct stat {
                    dev_t    st_dev;    /* ID of device containing file */
                    ino_t    st_ino;    /* inode number */
                    mode_t    st_mode;    /* protection */
                    nlink_t  st_nlink;  /* number of hard links */
                    uid_t    st_uid;    /* user ID of owner */
                    gid_t    st_gid;    /* group ID of owner */
                    dev_t    st_rdev;    /* device ID (if special file) */
                    off_t    st_size;    /* total size, in bytes */
                    blksize_t st_blksize; /* blocksize for filesystem I/O */
                    blkcnt_t  st_blocks;  /* number of blocks allocated */
                    time_t    st_atime;  /* time of last access */
                    time_t    st_mtime;  /* time of last modification */
                    time_t    st_ctime;  /* time of last status change */
                };

      Azaz:

      Code:
      (*files)[idx].props=malloc(sizeof(stat));

      vs

      Code:
      (*files)[idx].props=malloc(sizeof(struct stat));

      😮  😮  😮

      Mellesleg az nc_strcat() ez akar lenni:

      Code:
              strcpy(filename, dir);
              strcat(filename, „/”);
              strncat(filename, d_file->d_name, d_file->d_reclen);
              stat(filename, (*files)[idx].props);
              free(filename);
      Hozzászólás: Szegmens hiba – de miért? #2164540
      gabaman
      Felhasználó

        Dehogynem jó amit írtam. Ugyanis a cikluson belül index, kívül meg méret típusú a nof, de csak a kódodban (ha a ciklus végén növeled a nof változót). Gondold csak végig, miben különbözik a következő kódrészlet a tiedtől:

        Code:
        int nof = 0, idx = 0;

        (…)

            while ( (d_file=readdir(d_dir)) != NULL ) {
                nof++;
        (…)
                if ( max == (nof) ) {
        (…)
                (*files)[idx].name = strdup(d_file->d_name);
                idx++;
              } // end of ‘while’
        (…)

            return nof;
        }

        Hozzászólás: Szegmens hiba – de miért? #2164541
        gabaman
        Felhasználó

          Dehogynem jó amit írtam. Ugyanis a cikluson belül index, kívül meg méret típusú a nof, de csak a kódodban (ha a ciklus végén növeled a nof változót). Gondold csak végig, miben különbözik a következő kódrészlet a tiedtől:

          Code:
          int nof = 0, idx = 0;

          (…)

              while ( (d_file=readdir(d_dir)) != NULL ) {
                  nof++;
          (…)
                  if ( max == (nof) ) {
          (…)
                  (*files)[idx].name = strdup(d_file->d_name);
                  idx++;
                } // end of ‘while’
          (…)

              return nof;
          }

          Hozzászólás: Szegmens hiba – de miért? #2164534
          gabaman
          Felhasználó
            uzsolt wrote:
            Nem-nem, amit // end of ‘while’-nak gondoltál, az „csak” az if-hez tartozik (márminthogy kell-e bővíteni a foglalt memóriát), és a (*files)[nof] a while-on belül van. Tehát ha -1-ről kezdünk, akkor mire odaér, addigra már egyszer növeltük.

            De azért átírtam, hogy nulláról kezdjünk, és a ciklus végén növeljünk, a hiba ugyanaz. A 30. elemnél szegmensezik.

            Igaz, sorry. Elnéztem. Viszont tényleg a nof okozza a hibát, mert nem jól használod (lásd méret vs index).

            Hozzászólás: Szegmens hiba – de miért? #2164535
            gabaman
            Felhasználó
              uzsolt wrote:
              Nem-nem, amit // end of ‘while’-nak gondoltál, az „csak” az if-hez tartozik (márminthogy kell-e bővíteni a foglalt memóriát), és a (*files)[nof] a while-on belül van. Tehát ha -1-ről kezdünk, akkor mire odaér, addigra már egyszer növeltük.

              De azért átírtam, hogy nulláról kezdjünk, és a ciklus végén növeljünk, a hiba ugyanaz. A 30. elemnél szegmensezik.

              Igaz, sorry. Elnéztem. Viszont tényleg a nof okozza a hibát, mert nem jól használod (lásd méret vs index).

              Hozzászólás: Szegmens hiba – de miért? #2164532
              gabaman
              Felhasználó

                Itt egy másik hiba:

                Code:
                if ( max == (nof) ) {

                Mi a nof? A fájlok száma? Akkor méret típusú. De indexként is használod, aminek az értéke mindig egyel kevesebb, mint a méret. Könnyebb lenne egy idx változót bevezetned, mert így magadat kevered meg.

                Code:
                if ( max == (nof + 1) ) {
                Hozzászólás: Szegmens hiba – de miért? #2164533
                gabaman
                Felhasználó

                  Itt egy másik hiba:

                  Code:
                  if ( max == (nof) ) {

                  Mi a nof? A fájlok száma? Akkor méret típusú. De indexként is használod, aminek az értéke mindig egyel kevesebb, mint a méret. Könnyebb lenne egy idx változót bevezetned, mert így magadat kevered meg.

                  Code:
                  if ( max == (nof + 1) ) {
                  Hozzászólás: Szegmens hiba – de miért? #2164526
                  gabaman
                  Felhasználó
                    uzsolt wrote:
                    Valamint ha /home/zsolt/data paraméterrel hívom az nc_readdir-t, akkor jó. Ha /home/zsolt/data/-val, akkor szegmens hiba.

                    Talán jobban megérted mi a különbség a két név, ha utánanézel mi mivel kompatibilis. A /home/zsolt/data ugynaz mint a /home/zsolt/data/. (per pont), és a /home/zsolt/data/ ugynaz mint a /home/zsolt/data/* (per csillag). Nézd meg a path paraméter utolsó karakterét, ha ‘/’ akkor tegyél oda egy sor végét (0).

                    uzsolt wrote:
                    Code:
                    int nof = -1;

                    (…)

                        while ( (d_file=readdir(d_dir)) != NULL ) {
                            nof++;

                    (…)

                          } // end of ‘while’
                    (…)
                            (*files)[nof].name = strdup(d_file->d_name);

                        return nof;
                    }

                    Ez a gond. Ha nincs elem, akkor a nof értéke -1, a (*files)[nof].name miatt lesz szegmens hiba, mert a nulladik elem előtti helyre ír. A nof értékét növeld a ciklus végén:

                    Code:
                    int nof = 0;

                    (…)

                        while ( (d_file=readdir(d_dir)) != NULL ) {

                    (…)
                            nof++;
                          } // end of ‘while’
                    (…)
                            (*files)[nof].name = strdup(d_file->d_name);

                        return nof;
                    }

                    Hozzászólás: Szegmens hiba – de miért? #2164527
                    gabaman
                    Felhasználó
                      uzsolt wrote:
                      Valamint ha /home/zsolt/data paraméterrel hívom az nc_readdir-t, akkor jó. Ha /home/zsolt/data/-val, akkor szegmens hiba.

                      Talán jobban megérted mi a különbség a két név, ha utánanézel mi mivel kompatibilis. A /home/zsolt/data ugynaz mint a /home/zsolt/data/. (per pont), és a /home/zsolt/data/ ugynaz mint a /home/zsolt/data/* (per csillag). Nézd meg a path paraméter utolsó karakterét, ha ‘/’ akkor tegyél oda egy sor végét (0).

                      uzsolt wrote:
                      Code:
                      int nof = -1;

                      (…)

                          while ( (d_file=readdir(d_dir)) != NULL ) {
                              nof++;

                      (…)

                            } // end of ‘while’
                      (…)
                              (*files)[nof].name = strdup(d_file->d_name);

                          return nof;
                      }

                      Ez a gond. Ha nincs elem, akkor a nof értéke -1, a (*files)[nof].name miatt lesz szegmens hiba, mert a nulladik elem előtti helyre ír. A nof értékét növeld a ciklus végén:

                      Code:
                      int nof = 0;

                      (…)

                          while ( (d_file=readdir(d_dir)) != NULL ) {

                      (…)
                              nof++;
                            } // end of ‘while’
                      (…)
                              (*files)[nof].name = strdup(d_file->d_name);

                          return nof;
                      }

                      Hozzászólás: GTK+ és a magyar karakterek #2150174
                      gabaman
                      Felhasználó
                        ELaci wrote:
                        Jé, gabaman!
                        Félévenként szokott felbukkani! 🙂

                        ELaci wrote:
                        Javaslom hogy szidjuk közösen Bábel elvtársat! Szemét egy alak volt na… 🙂

                        Akkor fél év múlva újra megnézem mi változott…

                      10 bejegyzés megtekintése - 371-380 / 2,173