LINUX.ORG.RU

Теряется сегментация


0

0

Здравствуйте. Столкнулся с проблемой когда при выполнении файла, выдается ошибка, о том что сегментация потеряна. Приведу текст программы: #include <string.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <fcntl.h> #include <sys/stat.h> #include <stdlib.h> #include <sys/time.h> #include <time.h>

#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[i], r_num * sizeof(int)); printf("обнулили");

return(&cms_stat); }

void cms_stat_ob(ps) CMS_STAT *ps; { int i, j; for(j=0;j<STRATEGY_MAXNUM;j++) { for(i=0;i<PASS_MAXNUM;i++) { ps->s_stat[j][i] = 0; } } }

void cms_print(ps) CMS_STAT *ps; { int i,j; for(i=0;i<STRATEGY_MAXNUM;i++) { for(j=0;j<PASS_MAXNUM;j++) { printf("%d ", ps -> s_stat[i][j]); } printf("\n"); } }

main() { cms_statinit(6,200); cms_print(); cms_stat_ob(); }

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

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

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

#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>

#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[i], r_num * sizeof(int));
    printf("обнулили");

  return(&cms_stat);
}

 void cms_stat_ob(ps)
 CMS_STAT *ps;
 {
  int i, j;
  
  for(j=0;j<STRATEGY_MAXNUM;j++)
  {
   for(i=0;i<PASS_MAXNUM;i++)
    {
     ps->s_stat[j][i] = 0;
    }
  }
 }


void cms_print(ps)
 CMS_STAT *ps;
 {  
 int i,j;
   for(i=0;i<STRATEGY_MAXNUM;i++)
    {
     for(j=0;j<PASS_MAXNUM;j++)
      {   
       printf("%d ", ps -> s_stat[i][j]); 
      }
     printf("\n");
    }
 }

main()
 {
  cms_statinit(3,30);
  cms_print(); 
  cms_stat_ob();
  /*cms_print(); 
   cms_print(); 
  cms_statistics();*/
 }

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

Надо в main так:
CMS_STAT *cms = cms_statinit(3,30);
cms_print(cms);
cms_stat_ob(cms);

Надо хоть какие-то данные в функции передвавть:)

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