Kezdőlap › Fórumok › Programozás › Szegmens hiba – de miért?
- This topic has 76 hozzászólás, 6 résztvevő, and was last updated 17 years, 1 months telt el by
pointux.
-
SzerzőBejegyzés
-
2008-06-17-17:24 #2164548
É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;2008-06-17-17:24 #2164549É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;2008-06-17-17:29 #2164550Egyé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?2008-06-17-17:29 #2164551Egyé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?2008-06-17-17:42 #2164552A 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.
2008-06-17-17:42 #2164553A 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.
2008-06-17-17:46 #2164554Lehet, 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…
2008-06-17-17:46 #2164555Lehet, 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…
2008-06-17-17:52 #2164556uzsolt 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.2008-06-17-17:52 #2164557uzsolt 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. -
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.
legutóbbi hsz