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

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

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

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

Q&A

解決済

3回答

900閲覧

ファイル出力がされない。されても途中で終わる

kisara11235

総合スコア18

C

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

0グッド

0クリップ

投稿2022/12/07 02:52

編集2022/12/07 04:20

前提

プログラムの結果をファイルに出力したいが、途中までで終わったりそもそも出力されなかったりする。

実現したいこと

↑のことをかいけつしたい。

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

7.000000 9.000000 7.000000 7.000000 9.000000 7.000000 7.0

↑のように途中までしか書かれないか、全く出力されない。

該当のソースコード

#include <stdio.h> #include <math.h> #include <complex.h> #include <stdlib.h> #define M 6 // 存在するサイト数 #define N 12 //サイト数×2 A+Bの個数 #define L 24 //対角化に必要 N*2 #define P 400 #define EPS 0.000001 //収束範囲 double b_pi; double complex t_1, t_2, t_3, t_4, t_5, t_6, t_7, t_8, T_1, T_2, T_3, T_4,T_int; //,t_方向 double e[P+1],k_x[P+1]; double B_1[N][N], B_2[N][N],D[N][N]; double complex C[N][N]; double a[L][L],A[N]; double Energy[P+1][N]; double DOS[P+1][P+1][N]; double ddd[P+1][P+1],dd[P+1]; double fermi_1[P+1][N],fermi_2[P+1][N],fermisum_1[P+1],fermisum_2[P+1],f_2[P+1]; double complex u[P+1][N][N]; double u_2[P+1][N],u_3[P+1],u_4[P+1]; double n_dw[P+1][N][N],n_up[P+1][N][N]; //書き換え用 int main(int argc, char** argv){ b_pi=M_PI; double k_xx = -b_pi; double ene=-3.0; double delta_E=2.75*pow(10,-2); //エネルギー分解能 double kt=273*1.38*pow(10,-23); //0℃*ボルツマン定数 double meow=0.0; //科学ポテンシャル(フェルミエネルギー) double U=3.0; //相互作用エネルギーの平均 double t=2.75; //飛び移り積分 double n_down[P+1][N]; //代入する値 double n_upper[P+1][N]; double n_updw[N]; FILE* fp; FILE* fp_1; FILE* fp_2; FILE* fp_3; FILE* fp_4; FILE* fp_5; if ((fp = fopen("zigintene.txt", "w")) == NULL) { printf("Cannot open the file\n"); exit(1); } if ((fp_1 = fopen("zigintdos.txt", "w")) == NULL) { printf("Cannot open the file\n"); exit(1); } if ((fp_2 = fopen("zigintupper.txt", "w")) == NULL) { printf("Cannot open the file\n"); exit(1); } if ((fp_4 = fopen("zigintdown.txt", "w")) == NULL) { printf("Cannot open the file\n"); exit(1); } /*fp_3 = fopen("zigintupper.txt", "r"); if(fp_3 == NULL) { printf("ファイルを開くことが出来ませんでした.¥n"); } for(int l=0; l<=P; l++){ for(int i=0;i<N;i++){ fscanf(fp_3, "%lf", &(n_down[l][i])); } } fp_5 = fopen("zigintupper.txt", "r"); if(fp_5 == NULL) { printf("ファイルを開くことが出来ませんでした.¥n"); } for(int l=0; l<=P; l++){ for(int i=0;i<N;i++){ fscanf(fp_5, "%lf", &(n_upper[l][i])); } }*/ for(int i=0;i<=P;i++){ e[i]=ene+6.0/P*i; k_x[i]=k_xx+2.0*b_pi/P*i; } for(int r=0;r<=P;r++){ t_4 = 1; t_5 = cexp(-1 * I * -1/ 2 * k_x[r]); t_6 = cexp(-1 * I *1/2 * k_x[r]); t_1 =1; t_2 = cexp(I * -1 / 2 * k_x[r]); t_3 = cexp(I * 1 / 2 * k_x[r]); t_7 = -1 * t_4; t_8 = -1 * t_1; T_1 = t_5 + t_6; T_2 = t_2 + t_3; T_3 = -1 * T_1; T_4 = -1 * T_2; for(int i=0;i<N;i++){ n_upper[r][i]=6.5; n_down[r][i]=5.5; if(r%3==0){ n_updw[i]=0.7; } if(r%3==1){ n_updw[i]=n_upper[r][i]-n_down[r][i]; } else{ n_updw[i]=0.3; } //printf( "%2lf\n",n_updw[i]); } for (int k = 0;k < N;k++) { for (int h = 0;h < N;h++) { T_int=-U/t*n_updw[h]; for (int i = 0;i < M - 2;i++) { if (h < M) { if (k < M) { C[h][k] = 0; C[k][k]=-T_int; } else { C[0][M] = T_1; C[M - 1][N - 1] = T_1; C[M - 1][N - 2] = t_4; C[i + 1][M + i] = t_4; C[i + 1][M + i + 1] = T_1; } } else { if (k < M) { C[M][0] = T_2; C[M][1] = t_1; C[N - 1][M - 1] = T_2; C[M + i + 1][i + 1] = T_2; C[M + i + 1][i + 2] = t_1; } else { C[h][k] = 0; C[k][k]=-T_int; } } } //fprintf(fp_2, "%2f\n",C[h][k]); } } int k, h; for (k = 0;k < N;k++) { for (h = 0;h < N;h++) { D[h][k] = creal(C[h][k]); B_1[h][k] = -1 * cimag(C[h][k]); B_2[h][k] = cimag(C[h][k]); } } for (k = 0;k < L;k++) { for (h = 0;h < L;h++) { if (h < N) { if (k < N) { a[h][k] = D[h % N][k % N]; } else { a[h][k] = B_1[h % N][k % N]; } } else { if (k < N) { a[h][k] = B_2[h % N][k % N]; } else { a[h][k] = D[h % N][k % N]; } } } } for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ u[r][i][j]=0.0; } } for(int i=0;i<N;i++){ u[r][i][i]=1.0; } while (1) { double alpha, beta, gamma; double s, c, w; double wa, wb, wc; double max; int i, j, p, q, x, y; //最大要素の行と列を検索 max = 0.0; for (i = 0;i < L - 1;i++) { for (j = i + 1;j < L;j++) if (fabs(a[i][j]) > max) { p = i; q = j; max = fabs(a[i][j]); } } //収束したら解答打ち出し if (max < EPS) break; //sin, cos 計算 wa = a[p][p]; wb = a[p][q]; wc = a[q][q]; alpha = -wb; beta = 0.5 * (wa - wc); gamma = fabs(beta) / sqrt(alpha * alpha + beta * beta); s = sqrt(0.5 * (1.0 - gamma)); if (alpha * beta < 0) s = -s; c = sqrt(1.0 - s * s); //直行変換 for (j = 0;j < L;j++) { w = a[p][j] * c - a[q][j] * s; a[q][j] = a[p][j] * s + a[q][j] * c; a[p][j] = w; } for (j = 0;j < L;j++) { a[j][p] = a[p][j]; a[j][q] = a[q][j]; } w = 2.0 * wb * s * c; a[p][p] = wa * c * c + wc * s * s - w; a[q][q] = wa * s * s + wc * c * c + w; a[p][q] = 0; a[q][p] = 0; for (int i = 0;i < N;i++) { A[i] = a[i][i]; } double tmp; for (int i=0; i<N; i++) { for (int j=i+1; j<N ;j++) { if (A[i] > A[j]) { tmp = A[i]; A[i] = A[j]; A[j] = tmp; } } } for(i=0;i<N;i++){ w=u[r][i][p]*c-u[r][i][q]*s; u[r][i][q]=u[r][i][p]*s+u[r][i][q]*c; u[r][i][p]=w; } } for(int i=0;i<N;i++){ Energy[r][i]=A[i]; } } //状態密度 for(int i=0;i<=P;i++){ for(int j=0;j<=P;j++){ for(int k=0;k<N;k++){ DOS[i][j][k]=1/pow(b_pi*2,0.5)/delta_E/b_pi*exp(-1*pow(e[i]-Energy[j][k],2)/2/delta_E/delta_E); } } } for(int i=0;i<=P;i++){ for(int j=0;j<=P;j++){ for(int k=0;k<N;k++){ ddd[i][j]+=DOS[i][j][k]; } } } for(int i=0;i<=P;i++){ for(int j=0;j<=P;j++){ dd[i]+=ddd[i][j]; } } //波動関数の二乗=確率 for(int l=0;l<=P;l++){ for(int i=0;i<N;i++){ for(int j=0;j<N;j++){ u_2[l][i]+=pow(cabs(u[l][i][j]),2); } } } for(int l=0;l<=P;l++){ for(int i=0;i<N;i++){ u_3[l]+=u_2[l][i]; } } for(int l=0;l<=P;l++){ u_4[l]=u_3[l]/N; //printf( "%7.4lf\n", u_4[l]); //1になって然るべき } //個数をフェルミ関数から計算 for(int l=0;l<=P;l++){ for(int i=0;i<N;i++){ if(Energy[l][i]<=0){ fermi_1[l][i]=1/(1+exp((Energy[l][i]-meow)/kt)); //電子(↓側バンド)のフェルミ関数 } if(Energy[l][i]>=0){ fermi_2[l][i]=1/(1+exp((-fabs(Energy[l][i])-meow)/kt)); //正孔(上側バンド)のフェルミ関数 } //printf( "%7.4lf\n",fermi_2[l][i]); //fprintf(fp_4, "%2f %2f\n",fermi_1[l][i],fermi_2[l][i]); } } for(int l=0;l<=P;l++){ for(int i=0;i<N;i++){ fermisum_1[l]+=fermi_1[l][i]; //Nと等しくなる fermisum_2[l]+=fermi_2[l][i]; f_2[l]=fermisum_1[l]+fermisum_2[l]; } //printf( "%7.4lf\n",fermisum_2[l]); fprintf(fp_4,"%2f\n",fermisum_2[l]); } //printf( "%7.4lf\n",fermi_2[0]); //粒子数(サイト数) for(int i=0;i<=P;i++){ for(int j=0;j<N;j++){ fprintf(fp, "%2f %lf\n",k_x[i],Energy[i][j]); //fprintf(fp, "%2f %lf %lf\n",k_x[i],Energy[i][M-1],Energy[i][M]); //最低バンド } } for(int i=0;i<=P;i++){ fprintf(fp_1, "%2f %lf\n",e[i],dd[i]); //状態密度 } for(int l=0;l<=P;l++){ fprintf(fp_2,"%2f\n",fermisum_1[l]); //down fprintf(fp_4,"%2f\n",fermisum_2[l]); //upper } fclose(fp); fclose(fp_1); fclose(fp_2); fclose(fp_3); fclose(fp_4); fclose(fp_5); return 0; }

試したこと

fprintfの位置を変えたりした。コードではfp_4に書き込むことを二回行っているが、そうするとエラーのように途中までしかかかれないで終わる。どちらか片方にしても全くかかれない。printfの結果は正しいことが確認できている。

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

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

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

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

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

dameo

2022/12/07 04:36

まずは環境を書いた上でプログラムの終了コードを記載してください。
kisara11235

2022/12/07 04:41

すいません、何を書けばいいかわからないです。 使っているパソコンはubuntu、実行はcmdでicc、書いているアプリはVS 終了コードに関しては何を書けばいいかわからないです。
dameo

2022/12/07 04:53 編集

ubuntuなら普通プログラム終了直後にecho $?とすれば終了コードが見れます(特殊なshellだと違うかも)。 $ ./プログラム ... ... $ echo $? 0 $ みたいな感じです。このケースだと0ですね。
kisara11235

2022/12/07 04:56

echo $? 139 これで大丈夫ですか?
dameo

2022/12/07 05:05

終了コード139はSIGSEGVシグナルによる終了を意味しています。 SISSEGVシグナルは、セグメント違反を起こしたときに送られるシグナルです。 セグメント違反は、主に管理外の保護されているアドレスにアクセスしたときに発生します。 が、一言で言うと(プログラムの)バグです。 Intelコンパイラはよく知らないですが、デバッガくらいあると思うので、それを探しましょう。
guest

回答3

0

自己解決

なにかわかりませんがいろいろ引数とかを変更していたらうまく行きました。

投稿2022/12/07 06:04

kisara11235

総合スコア18

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

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

jimbe

2022/12/07 11:07 編集

>なにかわかりませんがいろいろ引数とかを変更していたらうまく行きました。 だけでは、結局何が原因で何が解決方法なのか全く分かりません。 せめて修正して動くようになったコードを載せられると良いと思います。 「4-2. どのように解決したのかを伝えましょう」 https://teratail.com/help/question-tips#questionTips42 > もしあなたが自身で解決できたら、解決方法を回答欄に書きシェアしてください。 > あなたがどのように解決したかを書き残しておくことで、あなたの質問は貴重なコンテンツ資産となります。 > いつか他の誰かがあなたと同じ問題に陥った時、そのコンテンツにたどり着いたらすぐに解決できるように情報を残しておいてあげてください。
guest

0

まずはデバッグできる環境を整えましょう
Cであれば、EclipseやVisualStudioでデバッグできます
ソースコードの任意の行にブレークポイントを設定すれば、そこで実行を止めることができ、各変数のナカミを参照できます。
また、そこから1行づつ実行させ、コードの流れや変数の変化を追いかけることもできます。

それができれば、なんかわからんけど動かない、ってことがなくなりますよ

投稿2022/12/07 04:49

y_waiwai

総合スコア87774

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

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

kisara11235

2022/12/07 04:54

デバッグできる環境はあったのですが、VSで今までできていたのに急にできなくなってしまい非常に困っています。 そこに関してはなんとかしようと思っています、
y_waiwai

2022/12/07 05:03

まずはそれをなんとかするのが先でしょう 他人に聞きに来る前に、自分ができることをやりましょう
guest

0

変数定義と、代入時のサイズが合いません。 領域を壊します。
(代入時 n_down[l][i] :: l=P*2の領域に書き込まれます)

double n_down[P+1][N]; //代入する値 double n_upper[P+1][N]; for(int l=0; l<=2*P; l++){ for(int i=0;i<N;i++){ fscanf(fp_3, "%lf", &(n_down[l][i])); } }

投稿2022/12/07 04:15

編集2022/12/07 04:23
yu-ima

総合スコア249

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

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

kisara11235

2022/12/07 04:19

それは別に入力する際に行っていた箇所です。いろいろ試していたときの戻し忘れです。申し訳ないです。 また実際この箇所は動いていないので無視してもらっても大丈夫だと思います。
yu-ima

2022/12/07 04:26

実際のソースを載せて下さい。
kisara11235

2022/12/07 04:34

ソースですか、、正直何を見せたらいいかわからないですが、 ・実際に動かして確認した ・/**/でfp_3、fp_5を囲んでいる。そもそもこの2つは入力用の関数でファイルの出力には関与していない ・ファイルに書いているのは↓ ``` for(int l=0;l<=P;l++){ fprintf(fp_2,"%2f\n",fermisum_1[l]); //down fprintf(fp_4,"%2f\n",fermisum_2[l]); //upper } ``` の箇所なのでここは変数定義にあっている(気がする、、) という感じだと思います。正直的はずれなことを言っているかもしれません。ご容赦ください。
yu-ima

2022/12/07 04:59

私が最初に指摘した場所は、実際は動かさないと言うことなので 別原因だとは思うのですが。 領域を壊すと言うことは、別の変数領域や、場合によってはロジック自体を壊すことになります。 その場合、領域を壊す動作の場所ではなく、 もっと後になって動作が不定になることもあります。
kisara11235

2022/12/07 05:00

何度ものコメントありがとうございます。そういうこともあるのですね、 いろいろ試してまいります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問