nixp.ru v3.0

22 января 2017,
воскресенье,
23:19:49 MSK

Аутсорсинг Linux с компанией «Флант»
visij написал 1 февраля 2006 года в 17:06 (448 просмотров) Ведет себя неопределенно; открыл 1 тему в форуме, оставил 1 комментарий на сайте.

Здравствуйте.

Столкнулся с проблемой когда при выполнении файла, выдается ошибка, о том что сегментация потеряна.

Приведу текст программы:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define STRATEGY_MAXNUM 6 // максимальное количество стратегий

#define PASS_MAXNUM 200 // максимальное количество прогонов

// структура статистики по отдельной стратегии

/*typedef struct {

int task_num[PASS_MAXNUM];

} SSTAT;

*/

// структураOC статистики выполнения заданий

typedef struct {

int strategy_num; // количество используемых стратегий

int run_num; // количество прогонов

int s_stat[STRATEGY_MAXNUM][PASS_MAXNUM]; // массив структур статистики по стратегиям

} CMS_STAT;

/****************************************************************************

cms_statinit — инициализация массива структур статистики

Входные параметры:

s_num — количество используемых стратегий

r_num — количество прогонов

Возвращаемое значение: указатель на массив статистики выполнения заданий

NULL — в случае ошибки

****************************************************************************/

CMS_STAT *cms_statinit(s_num,r_num)

int s_num,r_num;

{

int i,j;

static CMS_STAT cms_stat;

// проверка входных аргументов

if((s_num > STRATEGY_MAXNUM) || (r_num > PASS_MAXNUM))

{

printf(«%d > %d\n»,s_num, STRATEGY_MAXNUM);

printf(«%d > %d\n»,r_num, PASS_MAXNUM);

printf(«не обнулили»);

return((CMS_STAT *) NULL);

}

cms_stat.strategy_num = s_num;

cms_stat.run_num = r_num;

// обнуление массива структур статистики по стратегиям

for(i = 0; i < s_num;i++)

bzero((void *) cms_stat.s_stat, r_num * sizeof(int));

printf(«обнулили»);

return(&cms_stat);

}

void cms_stat_ob(ps)

CMS_STAT *ps;

{

int i, j;

for(j=0;j

{

for(i=0;i

{

ps->s_stat[j] = 0;

}

}

}

void cms_print(ps)

CMS_STAT *ps;

{

int i,j;

for(i=0;i

{

for(j=0;j

{

printf(«%d », ps -> s_stat[j]);

}

printf(«\n»);

}

}

main()

{

cms_statinit(6,200);

cms_print();

cms_stat_ob();

}

Допустимое количество элементов структуры может быть меньше 100, при обявлении 1200 элментов структуры выдается ошибка о сегментации.

Функция cms_statinit() по идеи должна обнулять элементы структуры, но это не происходит.

Подскажите пожалуйста, в чем ошибка.

Заранее благоарен.

Longobard

В какой момент происходит сегфолт?

Хинт: чтобы твой исходник легче было читать, заключай его в теги code ;)

Обнуляешь ты тоже очень странно. Достаточно сделать

struct TestStruct
{
    int a;
};
struct TestStruct SomeStruct;
memset (&SomeStruct,0,sizeof(SomeStruct));

И она будет обнулена. А зачем-то делать цикл…. Странное решение. Тем более что инициализацию элементов структуры всовываешь после ее обнуления memset-ом и все норм.

P.S.:

CMS_STAT *cms_statinit(s_num,r_num)
  int s_num,r_num;

вместо этого лучше писать

CMS_STAT *cms_statinit(int s_num, int r_num)

Так принято, так все привыкли, так понятнее.

Обнуление должно происходить в функции cms_statinit(), но оно не происходить. Какие то нелепые числа остаются. А обнуление в цикле сделал, ради теста :)

anonymous

А сегментация теряется, когда число элементов(которые облуящешь) больше ста. Если количество элементов структуры меньше 100, то программа работает.

anonymous

Спасибо за помощь. Разобрался.

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.