LINUX.ORG.RU

Обещаный код с ошибкой __int_malloc


0

0

вот код, который обещал выложить. это описание списка, который содержит еще один список.

<<< cut begin >>>

typedef struct data_define {
char * templ;
char * descr;
} Data;

typedef struct Nod_define {
Data data;
struct Nod_define * next;
} Nod;

typedef struct Spisok_define {
Nod * start, *current;
char * Name;
char * FileName;
char * Template;
unsigned long Count;
} Spisok;

/*
* TEMPLATE LIST
*/

typedef struct Template_data_define {
Spisok * List;
} Template_Data;

typedef struct Template_Nod_define {
Template_Data data;
struct Template_Nod_define * next;
} Template_Nod;

typedef struct Template_Spisok_define {
Template_Nod * start, *current;
unsigned long Count;
} Template_Spisok;

void Init_Spisok(Spisok *L);
unsigned int Spisok_Add(Spisok *L, Data *dt);
Data * Spisok_Get(Spisok *L, unsigned int z);
void Spisok_Delete(Spisok *L,unsigned int z);

void Init_Template_Spisok(Template_Spisok *L);
unsigned int Template_Spisok_Add(Template_Spisok *L, Template_Data *dt);
Template_Data * Template_Spisok_Get(Template_Spisok *L, unsigned int z);
void Template_Spisok_Delete(Template_Spisok *L,unsigned int z);


void Init_Spisok(Spisok *L)
{
L->start = L->current = NULL;
L->Count = 0;
};

unsigned int Spisok_Add(Spisok *L, Data *dt)
{
Nod * p;

if (!(p = (Nod *) malloc(sizeof(Nod))))
return RES_FALSE;


p->data = *dt;
p->next = NULL;

if(!L->start)
L->start = L->current = p;
else
L->current = L->current->next = p;
L->Count++;

return RES_TRUE;
};

Data * Spisok_Get(Spisok *L, unsigned int z)
{
unsigned int i;
Nod * t;

t = L->start;

for(i=0;i<z;i++) {
if(t->next)
t = t->next;
else
return &(t->data);
}

return &(t->data);
};

void Spisok_Delete(Spisok *L,unsigned int z)
{
unsigned int i;
Nod *t,*p;

if (L->Count == 0)
return;

if( z == 0 || L->Count == 1) {
p = L->start;
L->start = L->start->next;
free(p);
}
else {
t = L->start;

for (i=0;i<(z-1);i++)
if (t->next->next)
t = t->next;

p = t->next;

if (!t->next->next)
L->current = t;
t->next = t->next->next;

free(p);
}

if (L->Count)
L->Count--;
};


void Init_Template_Spisok(Template_Spisok *L)
{
L->start = L->current = NULL;
L->Count = 0;
};

unsigned int Template_Spisok_Add(Template_Spisok *L, Template_Data *dt)
{
Template_Nod * p;

if (!(p = (Template_Nod *) malloc(sizeof(Template_Nod))))
return RES_FALSE;

p->data = *dt;
p->next = NULL;

if(!L->start)
L->start = L->current = p;
else
L->current = L->current->next = p;

L->Count++;

return RES_TRUE;
};

Template_Data * Template_Spisok_Get(Template_Spisok *L, unsigned int z)
{
unsigned int i;
Template_Nod * t;

t = L->start;

for(i=0;i<z;i++) {
if(t->next)
t = t->next;
else
return &(t->data);
}

return &(t->data);
};

void Template_Spisok_Delete(Template_Spisok *L,unsigned int z)
{
unsigned int i;
Template_Nod *t,*p;

if (L->Count == 0)
return;

if( z == 0 || L->Count == 1) {
p = L->start;
L->start = L->start->next;
free(p);
}
else {
t = L->start;

for (i=0;i<(z-1);i++)
if (t->next->next)
t = t->next;

p = t->next;

if (!t->next->next)
L->current = t;
t->next = t->next->next;

free(p);
}

if (L->Count)
L->Count--;
};

<<< cut end >>>

Пример работы со списком:

char * find_templ_decr(char * templ)
{

unsigned int i,k;
unsigned int find = 0;
char * result = NULL;
Spisok * Ls;
Data * Dt;
Template_Data * TMPDt;

for (i=0;i<TMPS.Count && !find;i++) {

TMPDt = Template_Spisok_Get(&TMPS,i);
Ls = TMPDt.List;
if (strcmp(Ls->Name, cfg_mode.type_os) == 0)

for (k=0;k<Ls->Count && !find;k++) {

Dt = Spisok_Get(Ls,k);

if (strcmp(Dt.templ, templ) == 0) {
result = (char *)strdup(Dt->descr);
find = 1;
goto end_search;
}
}
}

end_search:
return result;
};

<<< cut end >>>

Больше спасибо тому, кто взглянет на код, и выскажет свои мысли.
Ведь где-то там ошибка !


Теперь, если не трудно, дайте еще кусочек кода (с main), на котором проявляется ошибка...

Навскидку же -- что произойдет при попытке удалить элемент из пустого списка (Count равен 0)?

vnp
()

>вот код, который обещал выложить. это описание списка, который содержит еще один список.

не напомнишь вкратце суть?

Reset ★★★★★
()

2vpn:
нет, там ошибки нет (if (L->Count == 0) return ).
черт побери, но main выложить не могу. есть проблема: это часть кода. по-отдельности они работают (эти части), но вместе - SIGSEGV. выложить сюда весь код не могу, т.к. форум не позволяет приаттачивать файлы, а весь текст слишком большой для сообщения. хм....
единственное где я его выложить - http://xai10.ai.kharkov.com/phpBB2 - это форум. там есть раздел - Программирование. далее надо выбрать тему: "Помощь в программе: __int_calloc". там я выложу файл - архив всей программы.

жаль, что LOR не позволяет этого зделать.

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

2Reset: зайди на указаный сайт - там я написал описание проблемы, или немного выше есть сообщение "мне SIGSEGV скоро сниться будет" - там более подробное описание.

если кто-то найдет ошибку - буду его должник. (жаль, если он тривиальна :)

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

>если кто-то найдет ошибку - буду его должник. (жаль, если он тривиальна :)

Неуж-то ты думаешь что кто-то будет дебажить твой код за тебя ? ;)

hint1: иди читай документацию на gdb особенно в районе bt (судя по сообщению ты до этого места не дочитал ;) )

hint2: поставь какую нибудь продвинутую морду к gdb типа ddd процесс станет более прозрачным на порядок...

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

>hint1: иди читай документацию на gdb особенно в районе bt (судя по >сообщению ты до этого места не дочитал ;) )

da, do etogo mesta ne do4ital.

>hint2: поставь какую нибудь продвинутую морду к gdb типа ddd >процесс станет более прозрачным на порядок...

Thanks.

ya i ne ras4ituval, 4to tko-ko budet moy kod smotret.

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

хмммм... насчет bt: а зачет делать backtrace ? что может расказать история порядок вызова функций ?

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

>хмммм... насчет bt: а зачет делать backtrace

Сокращает время поиска и локализации проблемы на порядок

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

все, всем спасибо. два дня работы с dmalloc, и все как рукой сняло.
про bt - он помог выявить самый вредный код.
спасибо sS, и всем кто помагал.

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