
前提・実現したいこと
C言語で年内の経過日数を求めるプログラムを作っています。
二次元配列のことで上手くコンパイラできないので質問をさせていただきます。
発生している問題・エラーメッセージ
例外がスローされました:読み取りアクセス違反。 days が 0x1110131 でした。
該当のソースコード
c
1 2 3//年を入力させて、○月○日は年内で何日経過しているかを導いてくれるプログラムを作成する 4 5#include<stdio.h> 6 7//使う関数の定義 8int which_year(int y); 9int day_of_month(int which, int month, int day, int **days); 10 11//うるう年か平年かを示す関数 12int which_year(int y) 13{ 14 return y % 4 == 0 && y % 100 != 0 || y % 400 == 0; 15} 16 17 18//一か月の日にちの配列を組み立てる関数 19int day_of_month(int which, int month,int day,int **days) 20{ 21 int i; 22 int sumday = 0; 23 24 25 for (i = 0; i < month - 1; i++) 26 sumday += days[which][i]; //←←ここで「例外がスローされました」と表示されて失敗 27 28 return sumday+day; //日数を返す 29 30} 31 32 33//main関数 34int main(void) 35{ 36 //days[0][12]:平年 days[1][12]:うるう年 37 int days[2][12] = { { 31,28,31,30,31,30,31,31,30,31,30,31 },{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } }; 38 39 int year; 40 int month; 41 int day; 42 int pathday; 43 int which; //うるう年:1 平年:0を返す 44 int remainday; 45 46 //年月日を入力させる 47 printf("年:"); scanf_s("%d", &year); 48 printf("月:"); scanf_s("%d", &month); 49 printf("日:"); scanf_s("%d", &day); 50 51 //平年(0) or うるう年(1) 52 which = which_year(year); 53 54 55 //年内で何日目?? 56 pathday = day_of_month(which, month, day,**days); //実際に年内で経過した日数 57 printf("年内で%d日目です。\n", pathday); 58 59 60 return 0; 61 62} 63
試したこと
day_of_month関数の
int day_of_month(int which, int month,int day,int **days) を
int day_of_month(int which, int month,int day,int days[2][12]) に、
main関数の
pathday = day_of_month(which, month, day,**days); を、
pathday = day_of_month(which, month, day,days); に変更したら成功します。
ですが、なぜ**daysを使うと上手くいかないのかが納得できません。
どうしてなのか、どなたか説明していただけないでしょうか?
###最後に
この度初めて質問させていただきます。
C言語を学び始めて2か月ほどの初心者で拙い部分もあるかと思います。
「ココの部分をもっとこうしたほうが良い」といった質問以外の所で訂正の箇所がありましたら併わせてご指摘いただけますと大変嬉しく思います。
回答5件
あなたの回答
tips
プレビュー