ハンドルされない例外が というエラーがでる

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
群馬県民

ハンドルされない例外が というエラーがでる

#1

投稿記事 by 群馬県民 » 7年前

ケッペンの気候区分のプログラムを作っている際にこのようなエラーがでます。配列には問題がないと思うのですが初心者なので何がなんだかわかりません。
エラーは↓
ハンドルされない例外が 0x00E71E6A (地理.exe) で発生しました: 0xC0000005: 場所 0xCCFACB68 の読み取り中にアクセス違反が発生しました。
で、どのような時に起こるエラーかもまだ把握できません。
今後のために合わせてお願いします

群馬県民

Re: ハンドルされない例外が というエラーがでる

#2

投稿記事 by 群馬県民 » 7年前

コード:

#include <stdio.h>
#include <conio.h>
#include <string.h>
#pragma warning(disable:4996)


//ケッペンの気候区分 中2-5 金野 俊

int main(){
    int natu, huyu, kion_tuki, kouu_tuki,swf;
    int hanbetu;
    char r;
    char name[20] = { 'Aw', 'Am', 'Af', 'Cw', 'Cs', 'Cfa', 'Cfb', 'Dw', 'Ds', 'Df', 'BS', 'BW', 'ET', 'EF'};
    double kion[13];
    double kouu[13];//順に各月の平均気温、降水量
    double maxkouu, worstkouu, totalkouu;//順に最多雨月降水量、最少雨月降水量、年降水量
    double maxkion, worstkion, avekion;//順に最暖月平均気温、最寒月平均気温、年平均気温
    //入力
    printf("1月から各月の平均気温、降水量の順に入力してください\nただし平均気温は小数または整数、降水量は0以上の小数または整数で入力してください\nまた、大きすぎる数が入力されると正しく判別されない場合があります\n");
    for (int i = 1; i<13; i++){
        printf("%d月平均気温(℃)", i);
        scanf("%lf", &kion[i]);
        printf("%d月降水量(mm)", i);
        scanf("%lf", &kouu[i]);
    }
    natu = kion[5] + kion[6] + kion[7] + kion[8];
    huyu = kion[11] + kion[12] + kion[1] + kion[2];

    //判別基準を確定
    maxkion = kion[1];
    worstkion = kion[1];
    maxkouu = kouu[1];
    worstkouu = kouu[1];
    for (int i = 1; i<12; i++){
        if (maxkion<kion[i + 1]){
            maxkion = kion[i + 1];
            kion_tuki = i + 1;
        }
        else if (maxkion == kion[i + 1])
        {
            maxkion = kion[1];
            kion_tuki = 1;
        }
        else if (maxkion>kion[i + 1]){
            maxkion = kion[1];
            kion_tuki = 1;
        }

        if (worstkion<kion[i + 1]){
            worstkion = worstkion;
        }
        else if (worstkion == kion[i + 1]){
            worstkion = worstkion;
        }
        else if (worstkion>kion[i + 1]){
            worstkion = kion[i + 1];
        }

        if (maxkouu<kouu[i + 1]){
            maxkouu = kouu[i + 1];
            kouu_tuki = i + 1;
        }
        else if (maxkouu == kouu[i + 1]){
            maxkouu = maxkouu;
            kouu_tuki = 1;
        }
        else if (maxkouu>kouu[i + 1]){
            maxkouu = maxkouu;
            kouu_tuki = 1;
        }

        if (worstkouu<kouu[i + 1]){
            worstkouu = worstkouu;
        }
        else if (worstkouu == kouu[i + 1]){
            worstkouu = worstkouu;
        }
        else if (worstkouu>kouu[i + 1]){
            worstkouu = kouu[i + 1];
        }



    }

    totalkouu = kouu[1] + kouu[2] + kouu[3] + kouu[4] + kouu[5] + kouu[6] + kouu[7] + kouu[8] + kouu[9] + kouu[10] + kouu[11] + kouu[12];
    avekion = (kion[1] + kion[2] + kion[3] + kion[4] + kion[5] + kion[6] + kion[7] + kion[8] + kion[9] + kion[10] + kion[11] + kion[12]) / 12;
    printf("\n最多雨月降水量 %lfmm\n最少雨月降水量 %lfmm\n年降水量 %lfmm\n最暖月平均気温 %lf℃\n最寒月平均気温 %lf℃\n年平均気温 %lf℃\n\n", maxkouu, worstkouu, totalkouu, maxkion, worstkion, avekion);

    //乾燥限界
    if (natu > huyu){

        if (kouu_tuki >= 5 && kouu_tuki <= 8){
            if (worstkouu * 10 < maxkouu){
                swf = 0;
            }
        }
        else if (kouu_tuki >= 1 && kouu_tuki <= 2){
            if (worstkouu * 3 < maxkouu){
                swf = 1;
            }
        }
        else if (kouu_tuki >= 11 && kouu_tuki <= 12){
            if (worstkouu * 3 < maxkouu){
                swf = 1;
            }
        }
        else{
            swf = 2;
        }
     if (natu < huyu){

        if (kouu_tuki >= 5 && kouu_tuki <= 8){
            if (worstkouu * 3 < maxkouu){
                swf = 1;
            }
        }
        else if (kouu_tuki >= 1 && kouu_tuki <= 2){
            if (worstkouu * 10 < maxkouu){
                swf = 0;
            }
        }
        else if (kouu_tuki >= 11 && kouu_tuki <= 12){
            if (worstkouu * 10 < maxkouu){
                swf = 0;
            }
        }
        else{
            swf = 2;
        }
    }



    }

    if (swf = 0){
        r = 20 * avekion;
    }
    else if (swf = 1){
        r = avekion + 7;
        r = r * 20;
    }
    else if (swf = 2){
        r = avekion + 14;
        r = r * 20;
    }




    //気候区分判別

    if (maxkion > 10) {
        if (totalkouu >= r) {
            if (worstkion > 18) {
                if (worstkouu > 60) {
                    hanbetu = 0;

                }
                else if (totalkouu < 2500) {
                    hanbetu = 1;

                }
                else {
                    hanbetu = 2;

                }
            }
            if (worstkion < -3 && worstkion < 18) {
                if (swf = 0) {
                    hanbetu = 3;

                }
                else if (swf = 1) {
                    hanbetu = 4;

                }
                else if (swf = 2) {
                    if (maxkion > 22) {
                        hanbetu = 5;

                    }
                    else {
                        hanbetu = 6;

                    }
                }
            }
            if (worstkion < -3) {
                if (swf = 0) {
                    hanbetu = 7;

                }
                else if (swf = 1) {
                    hanbetu = 8;

                }
                else if (swf = 2) {
                    hanbetu = 9;

                }
            }
        }
        else if (totalkouu >= 0.5*r) {
            hanbetu = 10;

        }
        else {
            hanbetu = 11;

        }

    }
    else {
        if (maxkion < 0) {
            hanbetu = 12;

        }
        else {
            hanbetu = 13;

        }
    }





    //出力

    if (worstkouu < 0) { printf("条件通り入力されなかったため正しく判別されませんでした\nいずれかのキーで終了します\n"); }
    else{
        printf("判別結果は%sです\nいずれかのキーで終了します\n", name[hanbetu]);

    }

  
    


    getch();
    return 0;
}
変数名などわかりにくいかもしれませんがお願いします

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: ハンドルされない例外が というエラーがでる

#3

投稿記事 by みけCAT » 7年前

234行目でchar*型のデータを要求するprintfの%s指定子にchar型のデータを渡し、未定義動作を起こしていますね。
nameをchar型の2次元配列にした上で、処理系定義の値である複数文字の文字定数の利用をやめ、(\0で終端された)文字列の配列にするといいでしょう。

また、if文の条件として不自然な代入が使用されている場所(137行目、140行目、144行目、他多数)があります。
比較(==)の間違いではないでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

群馬県民

Re: ハンドルされない例外が というエラーがでる

#4

投稿記事 by 群馬県民 » 7年前

初歩的なミスが多発してますね。もう一回見直してみます

box
記事: 2002
登録日時: 13年前

Re: ハンドルされない例外が というエラーがでる

#5

投稿記事 by box » 7年前

main関数に何でもかんでも詰め込んでいるのは
ちょっとどうなのかな?という気がします。
適切に関数を分ける方が、コード全体の見通しがよくなり、
修正しやすくなるのではないか、という気もします。

main関数は「あ~してこうしてああしろ」という司令塔の役目に徹して、
実際にあ~したりこうしたりああしたりするのは子どもの関数群、っていうのが
いいような気がします。試しにチャレンジしてみてはどうでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

群馬県民

Re: ハンドルされない例外が というエラーがでる

#6

投稿記事 by 群馬県民 » 7年前

みなさんありがとうございます。
実際に関数使ってみたところ見やすくもなり間違っている所などを発見できました

閉鎖

“C言語何でも質問掲示板” へ戻る