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

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

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

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

Q&A

解決済

3回答

10316閲覧

コンパイルはできるが、実行ができない(エラーメッセージ無し)

kentohno

総合スコア3

C

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

0グッド

0クリップ

投稿2020/12/02 06:31

前提・実現したいこと

多腕バンディット問題をc言語で扱うプログラムをLinux環境でコンパイル・実行しようとしています。
エディタはemacsでコンパイラはgccを使っています。
エラーメッセージがないため解決方法が分からず質問させていただきました。
どなたかご回答お願いします。m(__)m

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

コンパイルまではできるのですが、実行するとエラーメッセージは何も出ず、そのまま止まってしまいます。
処理に時間がかかっているのかと思い待ちましたが全く進みません。

該当のソースコード

c

1#include<stdio.h> 2#include<time.h> 3#define M (5) 4#define N (500) 5#define L (100) 6 7int ID[L][N]; 8int Reward[L][N]; 9double ave_R[N]; 10double CDR[N]; 11double mu[L][M]; 12double R[L][M]; 13double T[L][M]; 14 15/* Mersenne Twister */ 16void init_genrand64(unsigned long long seed); // initialzes mt 17long long genrand64_int63(void); // generates a random number on [0, 2^63-1]-interval 18double genrand64_real1(void); 19 20int mySlotMachine( int id, double *p ){ 21 if(p[id] > genrand64_real1()) 22 return 1; 23 else return 0; 24} 25 26int main(void){ 27 int n, l, k, s, i, a; 28 double r, e, E, max; 29 30 unsigned long long seed; 31 double p[M+1]={ -1, 0.3, 0.1, 0.9, 0.7, 0.5 }; // 確率は固定.p[0] は欠番 32 seed = (unsigned long long)time(NULL); 33 init_genrand64( seed ); 34 35 for(e = 1; e < 11; e++){ 36 a = e; 37 if(e == 0) 38 E = 0; 39 else 40 E = e / 10; 41 42 for(l = 0; l < L; l++){ 43 44 for(n = 0; n < N; n++){ 45 r = genrand64_real1(); 46 max = 0.0; 47 48 if(r < E)//探索フェーズ 49 { 50 k = genrand64_int63() % M; 51 ID[l][n] = k + 1; 52 T[l][k] += 1; 53 Reward[l][n] = mySlotMachine(k, p);//スロットの結果 54 R[l][k] += Reward[l][n]; 55 mu[l][k] = R[l][k] / T[l][k]; 56 } 57 else //活用フェーズ 58 { 59 s = 0; 60 for(i = 0; i < M; i++){ 61 if(max < mu[l][i]){ 62 s = i; 63 max = mu[l][i]; 64 } 65 } 66 67 ID[l][n] = s + 1; 68 T[l][s] += 1; 69 Reward[l][n] = mySlotMachine(s, p);//スロットの結果 70 R[l][s] += Reward[l][n]; 71 mu[l][s] = R[l][s] / T[l][s]; 72 } 73 } 74 } 75 double sum[N]; 76 //平均報酬 77 sum[0] = 0; 78 for(l = 0; l < L; l++) 79 sum[0] += Reward[l][0]; 80 81 for(n = 1; n < N; n++){ 82 sum[n] = sum[n-1]; 83 for(l = 0; l < L; l++){ 84 sum[n] += Reward[l][n]; 85 } 86 } 87 88 for(n = 0; n < N; n++) 89 ave_R[n] = sum[n] / (L*(n+1)); 90 91 //平均正答率 92 for(n = 0; n < N; i++){ 93 sum[n] = 0; 94 for(l = 0; l < L; l++){ 95 if(ID[l][n] == 3) 96 sum[n] += 1; 97 } 98 } 99 100 for(n = 0; n < N; n++) 101 CDR[n] = sum[n] / L; 102 103 printf("%f %f %f\n",E, ave_R[N-1], CDR[N-1]); 104 } 105 106 107 return 0; 108} 109

試したこと

https://teratail.com/questions/296945
この質問と状況が似ていたため、ローカル変数をグローバル変数に変えました、が上手くいきませんでした。

補足情報

Ubuntu18.04 LTSでLinux環境を使い、エディタはemacsコンパイルにはgccコンパイラを使用しています。
コードの最初の方にある/* Mersenne Twister */の部分には配布された別のプログラムが必要で、それも一緒にコンパイルしています。別のプログラムと一緒にそのプログラムをコンパイルしたときには問題なく実行までできていたのでそのプログラムには問題がないと思われます。

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

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

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

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

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

guest

回答3

0

ベストアンサー

実行できないというよりダンマリってことですね。

デバッグ環境をすぐに構築できないなら、要所要所にprintf文でも入れて、

  • どのprintf文で止まっているか?
  • 特定のprintf文が延々と出力されるか?

で、ある程度箇所は特定できると思います。
一部のループ処理はブレスがないので、そういうループ処理内にprintf入れる場合は全体をブレスで囲みましょう。
自分はループ処理が1センテンスでもブレスで囲むよう習慣付いていますが、、、

投稿2020/12/02 06:49

DreamTheater

総合スコア1095

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

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

kentohno

2020/12/02 07:12

printf文を入れたところ、関数mySlotMachine( int id, double *p )の中に入れた際に延々と同じ文字列が出力されました。 しかしmain文の先頭にprintf文を入れてもまたダンマリしてしまいました。 これはこれで理解ができません。。 main文の中で関数mySlotMachineよりも先にprintf文を入れてもそれを無視して関数mySlotMachineがfor文のような動作をしてしまうのはどこに原因があるんでしょう、、
DreamTheater

2020/12/02 07:20

スクロールアウトしたんじゃないですか? 因みにループは最大で55万回ループするようです。 単に時間が掛かっているだけでは?
kentohno

2020/12/02 08:03

よく確認したらそもそもその関数をmain文の中で何万回と(意図的に)ループさせていたので当たり前の挙動でした。後半の方のfor文でループごとに値を増やす操作で間違っていたみたいです。 解決できました、ありがとうございました。
guest

0

・統合開発環境で、デバッガを使う
・要所にprintf/fprintfを入れる
・頭で処理を追う
のどれかです。

投稿2020/12/02 06:47

otn

総合スコア84538

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

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

0

C言語のコードを書くなら、デバッグできる環境を整えましょう。
Eclipseや、WindowsならVisualStudioなど。
コードの任意の場所で実行を止め、変数のナカミを見ることができます。そこから1行づつ実行して、コードの流れを見れるようになります
そうすれば、アテズッポでコードを書かなくて済むようになります。

投稿2020/12/02 06:32

y_waiwai

総合スコア87774

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問