2016-11-26 5 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 <*観客)'がダブルスを比較するのは良い考えではありません。 – 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]のような配列インデックスの1つであることがほぼ確実です。したがって、iとjの値を必ず出力してください。配列の終わりを越えてインデックスを作成するか、ヌルポインタまたは初期化されていないポインタを逆参照することがあるので、printf("round[%d] at %p\n", i, &round[i])のようにポインタ値を出力してください。

1

いくつかのオペレーティングシステム上のSIGSEGVはシグナル11であり、セグメンテーションフォルトのプロセスに配信されます。

プログラムが許可されていない方法でメモリにアクセスすると、セグメンテーションフォールトが発生します。通常、ヌルポインタを逆参照しようとするか、配列の最後から実行されます。

プログラムでは、最も可能性の高い原因はアレイインデックス、round[i].match[j]およびです。 (もう1つの可能性は、引数が渡されたときに有効な場所ではありませんが、この場合はそうではありません)。デバッガにコードを挿入して実行すると、各アクセスが正しいかどうかを確認できます。

特に、ご使用のコンピュータがROUNDS_PR_SEASON &cと仮定した場合、値が正しい場合は、配列roundが完全に初期化されていないと、一部のround[i].matchにはnullが含まれている可能性が高いです。

+0

それは技術的に正しいのですが、なぜそれが起こるのか説明していませんが、それはここで問題と思われます。 – saeleko

+0

@ LudaOtaku私は、エラーそのものではなくエラーメッセージを理解していないと誤解しています。 – muhmuhten

関連する問題