LINUX.ORG.RU

[C/gtk+] Работа с GList


0

0

Доброго времени суток ЛОР, пытаюсь узнать длину GList в моем gtk+ приложении с помощью g_list_length(GList list), но вылетает странная ошибка:

Program received signal SIGSEGV, Segmentation fault. [Switching to >Thread 0xb73c4700 (LWP 7936)] IA__g_list_length (list=0x6e6920) at >glist.c:767 767 glist.c: No such file or directory. in glist.c


Что бы это значило?

Спасибо.


Ответ на: комментарий от yoghurt

то что это сегфолт это понятно, не понятно из-за чего он, дело в том что, вызываю эту функцию с одним и тем же листом в из 2 функций, в 1 проходит, а вот во второй вылетает вышеописанное.

shk
() автор топика

Вероятно, список уже кем-то/чем-то испорчен еще до вызова g_list_length.

dmitry_vk ★★★
()

Да, кастую код в студию, иначе не понятно, где ты там нахимичил.

MuZHiK-2 ★★★★
()

телепатия вещает мне, что список у тебя пустой и непроинициализированный

ananas ★★★★★
()
Ответ на: комментарий от yoghurt

Значит так: есть структура:


typedef struct _ImageList
{
    gchar* dir_path;
    GList* list;
    GList* current;
    time_t mtime;
} ImageList;

ImageList* image_list_new()
{
    ImageList* il = g_slice_new0( ImageList );

    if( ! supported_formats )
    {
        GSList* formats = gdk_pixbuf_get_formats();
        GSList* format;
        for( format = formats; format; format = format->next )
        {
            char** exts = gdk_pixbuf_format_get_extensions( (GdkPixbufFormat*)format->data );
            char** ext;
            for( ext  = exts; *ext ; ++ext )
                supported_formats = g_slist_prepend( supported_formats, *ext );
            g_free( exts ); 
        }
    }
    return il;
}

gboolean image_list_open_dir( ImageList* il, const char* path, GError** error )
{
    const char* name = NULL;
    GDir* dir;
    struct stat stbuf;

    if( il->dir_path && 0 == strcmp( path, il->dir_path ) )
        return TRUE;

    image_list_close( il );

    if( stat( path, &stbuf ) == -1 )
        return FALSE;

    dir = g_dir_open( path, 0, error );
    if( ! dir )
        return FALSE;

    il->dir_path = g_strdup( path );
    il->mtime = stbuf.st_mtime;

    while( ( name = g_dir_read_name ( dir ) ) )
    {
        if( image_list_is_file_supported( name ) )
            il->list = g_list_prepend( il->list, g_strdup(name) );
    }
    g_dir_close( dir );
    il->list = g_list_reverse( il->list );
    il->current = il->list;
    return TRUE;
}

Затем в другом файле следующее: Функция инициализирующая главное окно main_win_init:

void
main_win_init( MainWin*mw )
{
   ...
   mw->img_list = image_list_new();
   ...
}

И еще 2 функции - в 1 функции все выводится нормально, при вызове второй функции вылетает сегфолт, инициализация ImageList происходит в main_win_init:

ImageList*
main_win_open( MainWin* mw, const char* file_path)
{
  ...
    char* dir_path = g_path_get_dirname( file_path );
    image_list_open_dir( mw->img_list, dir_path, NULL );
    image_list_sort_by_name( mw->img_list, GTK_SORT_DESCENDING );
    g_free( dir_path );

    char* name = image_list_get_prev(mw->img_list);               
    printf(name);	

    name = image_list_get_prev(mw->img_list);
    printf(name);
}

main_win_open( MainWin* mw)
{
    char* name = image_list_get_prev(mw->img_list);               
    printf(name);	

    name = image_list_get_prev(mw->img_list);
    printf(name);
}

shk
() автор топика
Ответ на: комментарий от shk

Причем во второй функции сначала идет проверка на:

[code=c]
if(mw->img_list == NULL || image_list_is_empty( mw->img_list))
[/code]

Проверка проходит спокойно и падает дальше на image_list_get_prev.

shk
() автор топика
Ответ на: комментарий от shk
ImageList* il = g_slice_new0( ImageList );

Зачем это? Чем простой g_new0 не устроил? Глибный аллокатор сам разберётся, как выделить память.

akk ★★★★★
()
Ответ на: комментарий от akk

>>Не вижу, чтобы il->list что-нибудь присваивалось в image_list_new(). Да и в других местах тоже.

При аллокации нулями забивается все, в gcc же NULL == 0. Не?

MuZHiK-2 ★★★★
()
Ответ на: комментарий от MuZHiK-2

Ну это да. А отличное от NULL значение где?

Хотя g_slist_length нормально воспринимает NULL на входе, возвращает 0.

akk ★★★★★
()
Ответ на: комментарий от shk

> Проверка проходит спокойно и падает дальше на image_list_get_prev.
А где собственно код image_list_get_prev?

Gvidon ★★★★
()
Ответ на: комментарий от akk

А отличное от NULL значение где?

Если список первый раз используется - оно не нужно. Но без всего кода сложно сказать, что там действительно криво работает.

MuZHiK-2 ★★★★
()

Попробуй создать минимальный по размерам компилируемый файл с кодом, в котором повторяется ошибка, и запости его сюда. Так гадать сложно, конечно. Может и сам в процессе локализуешь и найдёшь ошибку.

Gvidon ★★★★
()
Ответ на: комментарий от akk

> Зачем это? Чем простой g_new0 не устроил? Глибный аллокатор сам разберётся, как выделить память.

Не надо учить плохому. g_new0 всегда использует malloc.

k_andy ★★★
()
Ответ на: комментарий от k_andy

Вы так говорите, как будто это плохо.

akk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.