ケッペンの気候区分のプログラムを作っている際にこのようなエラーがでます。配列には問題がないと思うのですが初心者なので何がなんだかわかりません。
エラーは↓
ハンドルされない例外が 0x00E71E6A (地理.exe) で発生しました: 0xC0000005: 場所 0xCCFACB68 の読み取り中にアクセス違反が発生しました。
で、どのような時に起こるエラーかもまだ把握できません。
今後のために合わせてお願いします
ハンドルされない例外が というエラーがでる
Re: ハンドルされない例外が というエラーがでる
#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;
}
Re: ハンドルされない例外が というエラーがでる
234行目でchar*型のデータを要求するprintfの%s指定子にchar型のデータを渡し、未定義動作を起こしていますね。
nameをchar型の2次元配列にした上で、処理系定義の値である複数文字の文字定数の利用をやめ、(\0で終端された)文字列の配列にするといいでしょう。
また、if文の条件として不自然な代入が使用されている場所(137行目、140行目、144行目、他多数)があります。
比較(==)の間違いではないでしょうか?
nameをchar型の2次元配列にした上で、処理系定義の値である複数文字の文字定数の利用をやめ、(\0で終端された)文字列の配列にするといいでしょう。
また、if文の条件として不自然な代入が使用されている場所(137行目、140行目、144行目、他多数)があります。
比較(==)の間違いではないでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: ハンドルされない例外が というエラーがでる
main関数に何でもかんでも詰め込んでいるのは
ちょっとどうなのかな?という気がします。
適切に関数を分ける方が、コード全体の見通しがよくなり、
修正しやすくなるのではないか、という気もします。
main関数は「あ~してこうしてああしろ」という司令塔の役目に徹して、
実際にあ~したりこうしたりああしたりするのは子どもの関数群、っていうのが
いいような気がします。試しにチャレンジしてみてはどうでしょうか。
ちょっとどうなのかな?という気がします。
適切に関数を分ける方が、コード全体の見通しがよくなり、
修正しやすくなるのではないか、という気もします。
main関数は「あ~してこうしてああしろ」という司令塔の役目に徹して、
実際にあ~したりこうしたりああしたりするのは子どもの関数群、っていうのが
いいような気がします。試しにチャレンジしてみてはどうでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。