質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

279閲覧

サブ関数のdentaku関数で加算のときに処理落ちしてしまいます。原因はどこでしょうか?

dabadaba

総合スコア11

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/04/17 12:35

前提・実現したいこと

実行&計算するたびに現在時刻がファイルに書き込み表示される電卓アプリケーションを作りたい。

発生している問題・エラーメッセージ

dentaku関数の加算処理で、処理落ちしてしまいます。

該当のソースコード

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> //マクロ宣言 #define ONE "もう一度入力してください" #define ERR "ファイルオープンエラー" #define FIL "log.txt" #define MAXC 100 #define MAXR 100 //昇順関数 int asc( const void * a , const void * b ) { return strcmp(( char * )a , ( char * )b ); } //降順関数 int desc( const void * a , const void * b ) { return strcmp(( char * )b , ( char * )a ); } //電卓関数 int dentaku(int a, char ch, int b, int *ans) { int okflag = 0; if(ch == '+'){ *ans = a + b; ←ここで処理落ちしてしまう。 printf("%d %c %d = %d\n",a,ch,b,*ans); okflag = 0; }else if(ch == '-'){ *ans = a - b; printf("%d %c %d = %d\n",a,ch,b,*ans); okflag = 0; }else if(ch == '*'){ *ans = a * b; printf("%d %c %d = %d\n",a,ch,b,*ans); okflag = 0; }else if(ch == '/'){ if(b == 0){ okflag = -1; printf("右辺の値に0が入力され、処理が終了しました。"); //return okflag; }else{ *ans = a / b; printf("%d %c %d = %d\n",a,ch,b,*ans); okflag = 0; } }else{ printf("演算子に想定外の文字が入力され、終了いたしました。\n"); okflag = -1; } return okflag; } int main(void) { //宣言 int i = 0; int n = 0; int *ans; int ret = 0; int ret1 = 0; int var1,hi1,hi3; int index = 0; int okflag = 0; char array[MAXR][MAXC],a,ch[10],hi2; char moji[MAXC]; char ret; char s[10] = "ASC"; char s1[10] = "DESC"; FILE *fp; fp = fopen(FIL, "a+" ); time_t timer; struct tm *local; timer = time(NULL); local = localtime(&timer); do{ fflush(stdin); ret = scanf("%d %c %d",&hi1,&hi2,&hi3); //printf("ret = %d\n",ret); }while(ret < 3); dentaku(hi1,hi2,hi3,ans); if(var1 == -1){ return 0; } fprintf(fp, "%d/%02d/%02d %02d:%02d:%02d, %02d %c %02d, %d\n",local->tm_year + 1900,local->tm_mon + 1,local->tm_mday,local->tm_hour,local->tm_min,local->tm_sec,hi1,hi2,hi3,ans); fclose(fp); fp = fopen(FIL,"r"); if(fp == NULL){ printf( "%s\n",ERR); return 0; } while(a = fgets(moji,sizeof(moji),fp) != NULL) { strcpy(array[index],moji); //printf("moji = %s\n array[index] = %s\n index = %d\n",moji,array[index],index); index++; } fclose(fp); do{ fflush(stdin); ret1 = scanf("%s",&ch[0]); printf("\n"); if(strcmp(ch,s) == 0){ printf("ASCを入力しました\n"); qsort(array[0], index, sizeof *array, asc); okflag = 1; }else if(strcmp(ch,s1) == 0){ qsort(array[0], index, sizeof *array, desc); printf("DESCを入力しました\n"); okflag = 1; }else{ printf("%s\n",ONE); } }while(okflag == 0); for (i = 0; i < index; i++) { printf("%s\n", array[i]); } return 0; }

試したこと

コメントアウトすれば一応通りますがよくわからない数値がでてしまいます。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

int *ans;

この変数は初期化されていないにもかかわらず使用されています

投稿2019/04/17 12:43

yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

間違えました、すみません。

投稿2019/05/04 09:39

dabadaba

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ansがポインタになっているので実体にしましょう。

c

1int *ans; 23int ans;

dentaku関数にはansのアドレスを渡しましょう。

c

1dentaku(hi1,hi2,hi3,ans); 23dentaku(hi1,hi2,hi3,&ans);

要はdentaku関数内でansに設定されているよくわからないアドレス(不定値)の場所にアクセスしておかしくなっています。

投稿2019/04/18 02:10

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問