Hozzászólások
-
SzerzőBejegyzés
-
Értem, mire gondolsz. Csak a probléma, hogy így is szegmens hibát produkál 🙁
30, 31-ig eljut, aztán kalap…Code:int nc_readdir (char *dir , nc_file **files ) {
DIR *d_dir;
struct dirent *d_file;
struct stat prop;
int max = 30;
/// return value – Number Of Files
int nof=0 , idx=0;d_dir = opendir(dir);
if (!d_dir) {
#ifdef DEBUG
pr_debug(„couldn’t read”);
#endif
return -1;
}#ifdef DEBUG
pr_debug(„malloc files”);
#endif
(*files) = malloc(sizeof(nc_file)*(max));
if ( (*files) == NULL ) return -1;
#ifdef DEBUG
pr_debug(„mallocing ok”);
#endifwhile ( (d_file=readdir(d_dir)) != NULL ) {
nof++;
if ( max == (nof) ) {
#ifdef DEBUG
pr_debug(„reallocing”);
#endif
max += 50;
#ifdef DEBUG
printf(„max = %dn”,max);
#endif
(*files) = realloc(*files,sizeof(nc_file)*max);
if ((*files) == NULL) {
return -1;
}
#ifdef DEBUG
pr_debug(„realloc ok”);
#endif
}
#ifdef DEBUG
pr_debug(„strdup”);
printf(„%d. %sn”,nof,d_file->d_name);
#endif
(*files)[idx].name = strdup((char*)(d_file->d_name));
#ifdef DEBUG
pr_debug(„strdup ok”);
#endif
#ifdef DEBUG
pr_debug(„stat”);
#endif
(*files)[idx].props=malloc(sizeof(stat));
// INNEN KIVETTEM AZ nc_strcat-os SORT!!!
#ifdef DEBUG
pr_debug(„stat ok”);
#endif
idx++;
}
closedir(d_dir);
return nof;
}Javaslom, hogy próbáld ki, biztos valami hülyeség, amit így „ránézésre” nem veszel észre. Én meg működés közben sem…
gabaman wrote:Mi a nof? A fájlok száma?
Annak készült (number of files).gabaman wrote:Akkor méret típusú.
Mármint size_t? Úgyse jó 🙁
Egy plusz index bevezetésével se (ami int típusú, nulláról indul, és a ciklus végén növelem).gabaman wrote:Mi a nof? A fájlok száma?
Annak készült (number of files).gabaman wrote:Akkor méret típusú.
Mármint size_t? Úgyse jó 🙁
Egy plusz index bevezetésével se (ami int típusú, nulláról indul, és a ciklus végén növelem).zoltan22 wrote:Az nc_strcat-ot megoldottam egyCode:#define nc_strcat strcat-al.
Lényegében az, csak arra kell, hogy a könyvtárat meg a fájlnevet összefűzze a stat miatt.zoltan22 wrote:Futtattasi eredmenyek nalam:
…
Ez a hiba igy meg sokszor ismetlodik.Hú, ennek nagyon örülök. Csak egy baj van: nem tudok vele mit kezdeni (azaz: nem értem, a forrásban mifélét keressek, ami ezt okozza) 🙁
Egyébként nálam is hasonló.zoltan22 wrote:Az nc_strcat-ot megoldottam egyCode:#define nc_strcat strcat-al.
Lényegében az, csak arra kell, hogy a könyvtárat meg a fájlnevet összefűzze a stat miatt.zoltan22 wrote:Futtattasi eredmenyek nalam:
…
Ez a hiba igy meg sokszor ismetlodik.Hú, ennek nagyon örülök. Csak egy baj van: nem tudok vele mit kezdeni (azaz: nem értem, a forrásban mifélét keressek, ami ezt okozza) 🙁
Egyébként nálam is hasonló.gabaman wrote: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).
OK, majd végiggondolom, de most nem ez a legfontosabb (számomra).gabaman wrote: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:
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.
vizsla wrote:uzsolt: arra azért vigyázz, hogy az strdup (nem egy ref. pointert ad), ugyanúgy fel kell szabadítani az általa lefoglalt memória területet free-vel, mintha malloc-kal foglaltad volna le.Tudok róla, az awesome-status programom írása közben rájöttem (tele is van olyan megjegyzésekkel, hogy ‘// malloc’, az strdup-os sorok végén, hogy ne felejtsek el felszabadítani).
Amúgy ha az strdup-os sort kitörlöd/kommenteled, akkor is gikszer van.gabaman wrote: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).
OK, majd végiggondolom, de most nem ez a legfontosabb (számomra).gabaman wrote: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:
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.
vizsla wrote:uzsolt: arra azért vigyázz, hogy az strdup (nem egy ref. pointert ad), ugyanúgy fel kell szabadítani az általa lefoglalt memória területet free-vel, mintha malloc-kal foglaltad volna le.Tudok róla, az awesome-status programom írása közben rájöttem (tele is van olyan megjegyzésekkel, hogy ‘// malloc’, az strdup-os sorok végén, hogy ne felejtsek el felszabadítani).
Amúgy ha az strdup-os sort kitörlöd/kommenteled, akkor is gikszer van.Egyrészt nem az strdup függvénnyel van gond, tudom, hogyan kell használni.
Közben, mintha nem foglalna magának elég memóriát, vagy rossz helyre foglalata, a fene tudja.
Szerintem a függvény nevéből (nc_readdir) kitalálható, hogy mit csinál: beolvassa a könyvtár tartalmát, és a fájlok listáját és tulajdonságait visszaadja a **files-ba.
Vagy soronként magyarázzam?Próbáld ki a következő main-függvénnyel:
Code:int main (int argc , char **argv) {
nc_file *files;
int mennyi,i;mennyi = nc_readdir(argv[1],&files);
for (i=0; i<mennyi; i++) {
printf("%sn",files[i].name);
}return 0;
}Persze paramétert adj neki 🙂 Próbáld ki egy-két könyvtárra, és meglátod.
Egyrészt nem az strdup függvénnyel van gond, tudom, hogyan kell használni.
Közben, mintha nem foglalna magának elég memóriát, vagy rossz helyre foglalata, a fene tudja.
Szerintem a függvény nevéből (nc_readdir) kitalálható, hogy mit csinál: beolvassa a könyvtár tartalmát, és a fájlok listáját és tulajdonságait visszaadja a **files-ba.
Vagy soronként magyarázzam?Próbáld ki a következő main-függvénnyel:
Code:int main (int argc , char **argv) {
nc_file *files;
int mennyi,i;mennyi = nc_readdir(argv[1],&files);
for (i=0; i<mennyi; i++) {
printf("%sn",files[i].name);
}return 0;
}Persze paramétert adj neki 🙂 Próbáld ki egy-két könyvtárra, és meglátod.
-
SzerzőBejegyzés