2016-11-26 2 views
-3

배열에서 여러 개의 일치를 살펴보고 일부 조건을 충족하는 모든 팀을 찾습니다. 발견되면 새로운 배열에 할당해야합니다. 새 배열을 출력 매개 변수로 사용해야합니다.세그먼트 오류 : 11

내가 전화 할 때 segmentation fault: 11가 표시됩니다. 디버깅을 시도했지만 이유가없는 것처럼 보입니다. 메인에 선언 다음은

TEAM team_least_viewers; 
double spectators = 99999;  
solve_task_four(round, team, &team_least_viewers, &spectators); 

그리고 함수 자체 : 요청으로

void solve_task_four(ROUND *round, TEAM *team, TEAM *team_least_viewers, double *spectators) { 
    int i, j, k = 0; 

    for(i=0; i<ROUNDS_PR_SEASON; i++) { 
    for(j=0; j<MATCH_PR_ROUND; j++) { 
     if(round[i].match[j].year == 2015) { 
     /* Searching for team name in team[]*/ 
     for(k=0; k<NUMBER_OF_TEAMS; k++) { 
      /* If it matches */ 
      if (round[i].match[j].home_team == team[k].name) { 
      team[k].spectators_home_last_year += round[i].match[j].spectators; 
      } 
     } 
     } 
    } 
    for(k=0; k<NUMBER_OF_TEAMS; k++) { 
    if(team[k].spectators_home_last_year < *spectators) { 
     *spectators = team[k].spectators_home_last_year; 
    } 
    } 
    } 
} 

구조체 :

typedef struct { 
    char weekday[WEEKDAY_SIZE], start_time[START_TIME_SIZE], 
     home_team[TEAM_SIZE], away_team[TEAM_SIZE]; 
    double spectators; 
    int day, month, year, round, home_team_score, away_team_score; 
} MATCH; 

typedef struct { 
    MATCH match[MATCH_PR_ROUND]; 
} ROUND; 

typedef struct { 
    char *name; 
    int points, matches_played, 
     matches_won, matches_draw, matches_lost, 
     matches_won_home, matches_won_away, 
     goals_for, goals_against, goal_difference; 
    double spectators_home_last_year; 
} TEAM; 

어떤 도움을 주시면 감사 많은입니다.

+0

'if (team [k] .spectators_home_last_year <* 관중) '가 double을 비교하는 것은 좋은 생각이 아닙니다. – hbagdi

+0

@hbagdi : 복식 비교가 왜 나쁜 생각일까요? –

+0

TEAM, ROUND 및 MATCH 구조체를 게시 할 수 있습니까? 또한 'round [i] .match [j] .home_team == team [k] .name'은 문자열을 비교할 수 없습니다. – hbagdi

답변

2

질문을 추론하는 이유는 무엇입니까? 세분화 오류의 원인을 어떻게 파악합니까? 맞다면, 한 가지 대답은 디버거를 사용하는 것입니다. 또 다른 대답은 코드 전체에 print 문을 추가하는 것입니다. segfault는 거의 round [i] 또는 round [i] .match [j]와 같은 배열 색인 중 하나이므로 i와 j 값을 반드시 인쇄하십시오. 배열 끝을지나 색인을 생성하거나 널 포인터 또는 초기화되지 않은 포인터를 역 참조 할 수 있으므로 printf("round[%d] at %p\n", i, &round[i])과 같은 포인터 값을 인쇄하십시오.

1

여러 운영 체제에서 SIGSEGV는 신호 11이며 세그멘테이션 오류시 프로세스로 전달됩니다.

프로그램이 허용되지 않는 방식으로 메모리에 액세스 할 때 세그먼트 오류가 발생합니다. 일반적으로 널 포인터를 참조 해제하거나 배열 끝에서 실행하려고 시도하면됩니다.

프로그램에서 가장 많이 발생하는 원인은 배열 인덱스, round[i].match[j] 및 입니다. (또 다른 가능성은 인수가 전달 된 유효한 위치가 아니기 때문에 spectator 인수가 전달 될 수도 있지만이 경우는 그렇지 않습니다.) 디버거에 코드를 삽입하거나 실행하여 각 액세스가 올바른지 확인할 수 있습니다.

특히, 귀하의 ROUNDS_PR_SEASON & c라고 가정합니다. 값이 정확하면 round 배열이 완전히 초기화되지 않은 경우 일부 round[i].match에 null이 포함 된 것 같습니다.

+0

기술적으로는 정확하지만 왜 발생하는지 설명하지는 않습니다. 여기에 질문이있는 것 같습니다. – saeleko

+0

@ LudaOtaku 나는 오류 자체보다는 오류 메시지를 이해하지 못하는 것으로 질문을 읽었습니다. – muhmuhten