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

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

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

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Q&A

解決済

1回答

595閲覧

for文の中が途中から実行されない

24_k

総合スコア1

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

0グッド

0クリップ

投稿2023/02/02 16:58

以下のコードを実行すると、
#t=0
のみ書かれたファイルが作られてしまいます。
エラーは表示されていないのですが、どうしたら配列hの値を計算、出力されるようになるのでしょうか。

該当のソースコード

C++

1#include<iostream> 2#include<string> 3#include<cstdlib> 4#include<ctime> 5#include<fstream> 6using namespace std; 7 8string name = "sand.data"; 9ofstream datafile; 10double h[100][100]; 11double D = 0.1; 12double Q = 0.1; 13int L, L0 = 1, b = 1; 14int i = 0, j = 0; 15 16//boundary conditions 17int i_bc(int i) { 18 if (i > 100) return i - 100; 19 else if (i < 0) return i + 100; 20 else return i; 21} 22 23int j_bc(int j) { 24 if (j > 100) return j - 100; 25 else if (j < 0) return j + 100; 26 else return j; 27} 28 29 30int main() 31{ 32 datafile.open(name); 33 34 srand(time(NULL)); 35 //yuragi 36 for (i = 0; i < 100; i++) { 37 for (j = 0; j < 100; j++) { 38 h[i][j] = rand(); 39 } 40 } 41 42 for (int t = 0; t < 100; t++) { 43 44 datafile << "#t=" << t << endl; 45 46 //creep 47 for (i = 0; i < 100; i++) { 48 for (j = 0; j < 100; j++) { 49 if (h[i][j] > h[i_bc(i + 1)][j_bc(j)] && h[i][j] > h[i_bc(i)][j_bc(j + 1)] && h[i][j] > h[i_bc(i)][j_bc(j - 1)] && h[i][j] > h[i_bc(i - 1)][j_bc(j)] && h[i][j] > h[i_bc(i + 1)][j_bc(j + 1)] && h[i][j] > h[i_bc(i - 1)][j_bc(j + 1)] && h[i][j] > h[i_bc(i - 1)][j_bc(j - 1)] && h[i][j] > h[i_bc(i + 1)][j_bc(j - 1)]) { 50 h[i][j] -= D * h[i][j]; 51 h[i_bc(i + 1)][j_bc(j)] += D * h[i][j] / 6; 52 h[i_bc(i)][j_bc(j + 1)] += D * h[i][j] / 6; 53 h[i_bc(i - 1)][j_bc(j)] += D * h[i][j] / 6; 54 h[i_bc(i)][j_bc(j - 1)] += D * h[i][j] / 6; 55 h[i_bc(i + 1)][j_bc(j + 1)] += D * h[i][j] / 12; 56 h[i_bc(i - 1)][j_bc(j + 1)] += D * h[i][j] / 12; 57 h[i_bc(i - 1)][j_bc(j - 1)] += D * h[i][j] / 12; 58 h[i_bc(i + 1)][j_bc(j - 1)] += D * h[i][j] / 12; 59 } 60 else continue; 61 } 62 } 63 64 //saltation 65 for (int k = 0; k < 10; k++) { 66 int i_ran = rand() % 100; 67 int j_ran = rand() % 100; 68 if (h[i_ran][j_ran] > 0) { 69 L = L0 + b * h[i_ran][j_ran]; 70 h[i_bc(i_ran)][j_bc(j_ran)] -= Q; 71 h[i_bc(i_ran + L)][j_bc(j_ran)] += Q; 72 } 73 else continue; 74 } 75 76 for (i = 0; i < 100; i++) { 77 for (j = 0; j < 100; j++) { 78 datafile << i << " " << j << " " << h[i][j] << endl; 79 } 80 datafile << endl << endl; 81 } 82 83 } 84 85 datafile.close(); 86 cout << "Output data in " << name << "." << endl; 87 return 0; 88 89}

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

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

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

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

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

guest

回答1

0

ベストアンサー

Visual C++ でデバッグ実行してみました。
71行目で配列の境界を超えてアクセスしている為に落ちているようです。
L4209となっているのは想定された値でしょうか?

イメージ説明

投稿2023/02/02 17:30

cx20

総合スコア4693

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

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

24_k

2023/02/03 06:09

回答ありがとうございます。 初歩的なことで申し訳ないのですが、71行目で i_bc(i_ran+L) が100以上の値となってしまうため落ちてしまうということでしょうか。 Lの値は想定していたものではなく、Lの式を変えてみたり、65~72行目を削除して実行してみたりしたのですが、改善されていない状況です。
cx20

2023/02/04 01:37

> 71行目で i_bc(i_ran+L) が100以上の値となってしまうため落ちてしまう そこもそうですが、それよりも前に配列の境界を越えてアクセスしている箇所があるようです。 例えば、52行目の h[i_bc(i)][j_bc(j + 1)] は、 i が 0 、j が 99 の場合、i_bc(i) が 0 を、j_bc(j + 1) が 100 を返します。 配列は h[100][100] と宣言されていた場合はアクセスできるのは h[0~99][0~99] までです。 h[0][100] をアクセスした場合は、配列の境界を越えてアクセスしていることになります。 そのような場合は、予期しないメモリ領域を壊してしまい、アプリケーションが不安定になったり落ちたりします。
24_k

2023/02/04 03:12

ありがとうございます。理解しました。 17~27行目を剰余の式に変えて、正常に値が出力されるようになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問