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-19:30 #2164588
Lehet, de nem a man-ból vagy info-ból szedtem ki. Viszont tényleg nem árt a man oldalak olvasgatása. Bárcsak mindenkinek ennyire egyértelmű lenne.
2008-06-17-19:30 #2164589Lehet, de nem a man-ból vagy info-ból szedtem ki. Viszont tényleg nem árt a man oldalak olvasgatása. Bárcsak mindenkinek ennyire egyértelmű lenne.
2008-06-17-21:15 #2164590Én is a man-ból szedtem:
The following POSIX macros are defined to check the file type using the st_mode field:
S_ISREG(m) is it a regular file?
S_ISDIR(m) directory?
S_ISCHR(m) character device?
S_ISBLK(m) block device?
S_ISFIFO(m) FIFO (named pipe)?
S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)
S_ISSOCK(m) socket? (Not in POSIX.1-1996.)Tény és való, hogy tovább nemigen olvastam…
2008-06-17-21:15 #2164591Én is a man-ból szedtem:
The following POSIX macros are defined to check the file type using the st_mode field:
S_ISREG(m) is it a regular file?
S_ISDIR(m) directory?
S_ISCHR(m) character device?
S_ISBLK(m) block device?
S_ISFIFO(m) FIFO (named pipe)?
S_ISLNK(m) symbolic link? (Not in POSIX.1-1996.)
S_ISSOCK(m) socket? (Not in POSIX.1-1996.)Tény és való, hogy tovább nemigen olvastam…
2008-06-18-14:25 #2164592Igen, ha tovább olvasol, akkor megtalálod a gabaman-féle változatot, ha még a macro is érdekel, akkor megtalálod ezt:
Code:S_…(m) (((m) & S_IFMT) == S_…)innentől már csak az a kérdés, hogy egy c nyelv egy break nélküli switch-et, hogyan optimalizál. Gondolom, mintha sima if lenne – egyrészt.
Másrészt kérdés, hogy a „st->st_mode”-ot hogy kezeli le. Mer elég sok itt a választási lehetőség, hogy megérje ezt a viszonylag nehezen elérhető objektum tagot először átmozgatni egy registerbe (sőt még egy sima lokális memória-területre is) és utána azt vizsgálni.
A garantáltan leggyorsabb kódot úgy lehet c-ben elérni, hogy egy register változót létrehozunk (ha lehet) és if-fel kezeljük le.Code:const char *nc_filetype ( struct stat *st ) {
register mode_t mode = st->st_mode & S_IFMT;if ( mode == S_IFDIR )
return …
if ( … )
…
}Szerintem ettől gyorsabb kód nincsen. Max., akkor, ha a c nem hajlandó regiszterként kezelni a mode-ot. Akkor írunk egy asm. betétet, ahol az regiszter lesz.
Persze még mindig ott van, hogy 1) a függvény hívás viszonylag lassú, 2) az adatokat nem konstans időben éred el. Tehát, ha a stringeket egy memória területen helyezed el és a S_IFIFO ( 10000 ) – S_IFSOCK ( 140000 ) /sima bit-eltolást jelentenek ezek/ számokkal (makró segítségével) éred el, valószínű az lesz a sebességre az optimális (méretre nyílván (ha sok helyen kérdezed) nem – arra az előző).
Ha, már optimalizálunk. 🙂
2008-06-18-14:25 #2164593Igen, ha tovább olvasol, akkor megtalálod a gabaman-féle változatot, ha még a macro is érdekel, akkor megtalálod ezt:
Code:S_…(m) (((m) & S_IFMT) == S_…)innentől már csak az a kérdés, hogy egy c nyelv egy break nélküli switch-et, hogyan optimalizál. Gondolom, mintha sima if lenne – egyrészt.
Másrészt kérdés, hogy a „st->st_mode”-ot hogy kezeli le. Mer elég sok itt a választási lehetőség, hogy megérje ezt a viszonylag nehezen elérhető objektum tagot először átmozgatni egy registerbe (sőt még egy sima lokális memória-területre is) és utána azt vizsgálni.
A garantáltan leggyorsabb kódot úgy lehet c-ben elérni, hogy egy register változót létrehozunk (ha lehet) és if-fel kezeljük le.Code:const char *nc_filetype ( struct stat *st ) {
register mode_t mode = st->st_mode & S_IFMT;if ( mode == S_IFDIR )
return …
if ( … )
…
}Szerintem ettől gyorsabb kód nincsen. Max., akkor, ha a c nem hajlandó regiszterként kezelni a mode-ot. Akkor írunk egy asm. betétet, ahol az regiszter lesz.
Persze még mindig ott van, hogy 1) a függvény hívás viszonylag lassú, 2) az adatokat nem konstans időben éred el. Tehát, ha a stringeket egy memória területen helyezed el és a S_IFIFO ( 10000 ) – S_IFSOCK ( 140000 ) /sima bit-eltolást jelentenek ezek/ számokkal (makró segítségével) éred el, valószínű az lesz a sebességre az optimális (méretre nyílván (ha sok helyen kérdezed) nem – arra az előző).
Ha, már optimalizálunk. 🙂
2009-12-04-20:03 #1888255nc.c:
Code:#include
#include
#include
#include
#include#include „nc.h”
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 = -1;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”);
#endifd_dir = opendir(dir);
while ( (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)[nof].name = strdup(d_file->d_name);
#ifdef DEBUG
pr_debug(„strdup ok”);
#endif
#ifdef DEBUG
pr_debug(„stat”);
#endif
(*files)[nof].props=malloc(sizeof(stat));
stat(nc_strcat(dir,d_file->d_name), (*files)[nof].props);
#ifdef DEBUG
pr_debug(„stat ok”);
#endif
}
closedir(d_dir);
return nof;
}nc.h:
Code:#include
#ifndef NC_H
#define NC_H#define pr_debug(msg) printf(„DEBUG: %s %d. %sn”,__FILE__,__LINE__,msg);
/// This structure stores the file’s properties.
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;/// return value: number of files, -1 if error
int nc_readdir (char *dir , nc_file **filesx);
/// get string name
char *nc_filetype (struct stat *st);#endif
Namost ha meghívom az nc_readdir függvényt, az esetek túlnyomó részében szegmens hibával száll el.
Amennyire rájöttem, az strdup-sorral kezdődik a probléma, méghozzá mintha nem lenne memória foglalva.
Valamint ha /home/zsolt/data paraméterrel hívom az nc_readdir-t, akkor jó. Ha /home/zsolt/data/-val, akkor szegmens hiba.Mi lehet a gond?
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.
legutóbbi hsz