🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

4828閲覧

C言語コンパイル通るのに実行できません(エラー文はなし)

monakopan

総合スコア1

C

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

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/10/09 08:42

前提・実現したいこと

拡散方程式を差分法で解くc言語を使ったプログラムで時間と空間の3次元のグラフを出したくてファイル入力しています。(グラフはgnuplotでだしてます)
エディタはvscodeでコンパイラはgccを使っています。
このプログラムではコンパイルが通るのですが実行したときにprintfやfprintfが出力されません。(exeファイルはできています)
エラーメッセージが出ないので解決法が分からず質問させていただきました。
どなたか回答お願いします<(_ _)>

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

printf("%lf\n", tx[n][x]); fprintf(fp, "%d %lf %lf\n", x-500, t, tx[n][x]); コンパイルは通るのにこの二つの行が実行されない

該当のソースコード

c言語 # include <stdio.h> # include <math.h> int main(void){ double U[1001], dU[1001]; int x=0; int n=0; double t=0; double tx[100001][101];//U for(n=0; n<100000; n++){ for(x=0; x<100; x++){ tx[n][x]=0; } } double dt = 0.1; double dx = 1; double D = 1; double a = dt * D / (dx*dx); double end=100; FILE *fp; fp = fopen("aiueo.dat", "w"); /* 初期条件 */ for (x=0; x<=1000; x++) U[x] = exp(-(x-500.0) * (x-500.0) / 200); /* 境界条件 */ //U[0] = 0; U[100] = 0; for (t=0; t<end; t=t+dt){ for(n=0; n<(int)end/dt; n++){ for (x=1; x<=999; x++){ dU[x] = a * (U[x+1]-2*U[x]+U[x-1]); U[x] = U[x]+dU[x]; tx[n][x] = U[x]; } } } for(n=0; n<(int)end/dt; n++){ tx[n][0]=tx[n][1]; tx[n][1000]=tx[n][999]; } /* 結果の出力 */ for(t=0; t<end; t=t+dt){ for(n=0; n<(int)end/dt; n++){ for (x=0; x<=1000; x++){ printf("%lf\n", tx[n][x]); fprintf(fp, "%d %lf %lf\n", x-500, t, tx[n][x]); } } } fclose(fp); return 0; }

試したこと

試しに上の行のほうにprintfでAを出力しようとしても出力はされませんでした
二次元配列をあまり使ったことがなかったのでそこが間違っているような気もします・・・

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

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

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

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

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

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

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

guest

回答3

0

ベストアンサー

double tx[100001][101];//U

ローカル変数でこういう大きなサイズの配列は定義できません。
これでスタック食いつぶして暴走してますな。

グローバル変数にしよう

投稿2020/10/09 08:45

y_waiwai

総合スコア88040

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

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

monakopan

2020/10/12 05:58

回答ありがとうございます! ローカル変数とグローバル変数についての理解ができていませんでした。 おかげで解決できましたありがとうございます<(_ _)>
guest

0

グローバル変数にしなくても、static を付ければよいでしょう。
static double tx[100001][101];
とすると、どうなりますか?

投稿2020/10/10 01:48

kazuma-s

総合スコア8224

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

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

monakopan

2020/10/12 06:00

解決できました。回答ありがとうございます。
guest

0

既に回答が出ていますが、メモリ領域については以下で話が出ていますね。
https://teratail.com/questions/15198

投稿2020/10/09 11:25

Gak

総合スコア83

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

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

monakopan

2020/10/12 06:00

解決できました。回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問