Hozzászólások
-
SzerzőBejegyzés
-
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);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;
}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;
}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).
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).
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) ) {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) ) {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;
}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;
}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…
-
SzerzőBejegyzés

legutóbbi hsz