前提・実現したいこと
C言語で通信の研究をしています。
ノードにデータを持たせてノード同士の距離が近いとお互いのデータを交換するというプログラムを作っています。
発生している問題・エラーメッセージ
最初はノードの数を5個で行いました。
7個目からエラーが出て正しく実行できません。
エラー内容
Run-Time Check Failure #2 - Stack around the variable 'NODE' was corrupted
該当のソースコード
#include<stdio.h> #include<math.h> #include<stdlib.h> #define NODEMAX 7 #define X_MAX 7 #define Y_MAX 7 #define DISTANCE 1 //ノードの構造体// struct node { int x; int y; int data[5]; int CT; }; //重複しない乱数を発生させる関数 void shuffle(int ary[]) { for (int i = 0; i < NODEMAX; i++) { int j = rand() % NODEMAX; int t = ary[i]; ary[i] = ary[j]; ary[j] = t; } } //ノードの移動範囲のパラメータ// int main(void) { //乱数SEED設定// srand((int)time(NULL)); int N; //ノードをフィールド上に生成 struct node NODE[NODEMAX]; for (N = 0; N < NODEMAX; N++) { NODE[N].x = rand() % X_MAX; NODE[N].y = rand() % Y_MAX; printf("ノード%d\n%d %d\n",N, NODE[N].x, NODE[N].y); } //0~1の乱数を生成したのち上下左右どちらかで移動// //0~0.25でx+1、0.25~0.5で左にx-1、0.5~0.75でy+1、0.75~1でy-1// int M; double ram; for (M = 0; M < NODEMAX; M++) { ram = (double)rand() / RAND_MAX; printf("乱数%lf\n", ram); if (ram <= 0.25) { if (NODE[M].x != X_MAX) { NODE[M].x += 1; } } else if (ram <= 0.5) { if (NODE[M].x != 0) { NODE[M].x -= 1; } } else if (ram <= 0.75) { if (NODE[M].y != Y_MAX) { NODE[M].y += 1; } } else { if (NODE[M].y != 0) { NODE[M].y -= 1; } } printf("ノード%d\n%d %d\n", M, NODE[M].x, NODE[M].y); } //ノードにデータを持たせる //フィールド全体でデータの箱を作る int FIELDDATA[NODEMAX]; for (int O = 0; O < NODEMAX; O++) { FIELDDATA[O] = 1; } //ノードのデータの初期化 for (int a = 0; a < NODEMAX; a++) { for (int b = 0; b < NODEMAX; b++) { NODE[a].data[b] = 0; } } //ランダムでノードにデータをいれる int list[NODEMAX] = {0,1,2,3,4,5,6}; //個数を変える shuffle(list, NODEMAX); for (int P = 0; P < NODEMAX; P++) { printf("%d\n", list[P]); NODE[P].data[list[P]] = 1; } for (int R = 0; R < NODEMAX; R++) { printf("ノード%d,%d%d%d%d%d\n", R, NODE[R].data[0], NODE[R].data[1], NODE[R].data[2], NODE[R].data[3], NODE[R].data[4]);//各ノードに追加されたデータを表示 } //0-1.2.3.4 for (int T = 1; T < NODEMAX; T++) { printf("ノード0と%d X=% d,Y=% d\n",T, abs(NODE[0].x - NODE[T].x) , abs(NODE[0].x - NODE[T].y) ); if (abs(NODE[0].x - NODE[T].x) <= DISTANCE && abs(NODE[0].x - NODE[T].y) <= DISTANCE) { //ノード同士の距離を比較 for (int S = 0; S < NODEMAX; S++) { if (NODE[0].data[S] != NODE[T].data[S]) { //お互いにデータを比較し、どちらかがデータを持っていて、どちらかがデータを持っていない状態のとき if (NODE[0].data[S] == 0) { //データを持っていなかった方に新しくデータを受けっとたとみなすために2をいれる NODE[0].data[S] = 2; } else if(NODE[T].data[S] == 0) { //データを持っていなかった方に新しくデータを受けっとたとみなすために2をいれる NODE[T].data[S] = 2; } } } } } //1-.2.3.4.5.6 for (int T = 2; T < NODEMAX; T++) { printf("ノード1と%d X=% d,Y=% d\n", T, abs(NODE[1].x - NODE[T].x), abs(NODE[1].x - NODE[T].y)); if (abs(NODE[1].x - NODE[T].x) <= DISTANCE && abs(NODE[1].x - NODE[T].y) <= DISTANCE) { //ノード同士の距離を比較 for (int S = 0; S < NODEMAX; S++) { if (NODE[1].data[S] != NODE[T].data[S]) { //お互いにデータを比較し、どちらかがデータを持っていて、どちらかがデータを持っていない状態のとき if (NODE[1].data[S] == 0) { //データを持っていなかった方に新しくデータを受けっとたとみなすために2をいれる NODE[1].data[S] = 2; } else if (NODE[T].data[S] == 0) { //データを持っていなかった方に新しくデータを受けっとたとみなすために2をいれる NODE[T].data[S] = 2; } } } } } //2-3.4.5.6 for (int T = 2; T < NODEMAX; T++) { printf("ノード2と%d X=% d,Y=% d\n", T, abs(NODE[2].x - NODE[T].x), abs(NODE[2].x - NODE[T].y)); if (abs(NODE[2].x - NODE[T].x) <= DISTANCE && abs(NODE[2].x - NODE[T].y) <= DISTANCE) { //ノード同士の距離を比較 for (int S = 0; S < NODEMAX; S++) { if (NODE[2].data[S] != NODE[T].data[S]) { //お互いにデータを比較し、どちらかがデータを持っていて、どちらかがデータを持っていない状態のとき if (NODE[2].data[S] == 0) { //データを持っていなかった方に新しくデータを受けっとたとみなすために2をいれる NODE[2].data[S] = 2; } else if (NODE[T].data[S] == 0) { //データを持っていなかった方に新しくデータを受けっとたとみなすために2をいれる NODE[T].data[S] = 2; } } } } } //3-4.5.6 for (int T = 3; T < NODEMAX; T++) { printf("ノード3と%d X=% d,Y=% d\n", T, abs(NODE[3].x - NODE[T].x), abs(NODE[3].x - NODE[T].y)); if (abs(NODE[3].x - NODE[T].x) <= DISTANCE && abs(NODE[3].x - NODE[T].y) <= DISTANCE) { //ノード同士の距離を比較 for (int S = 0; S < NODEMAX; S++) { if (NODE[3].data[S] != NODE[T].data[S]) { //お互いにデータを比較し、どちらかがデータを持っていて、どちらかがデータを持っていない状態のとき if (NODE[3].data[S] == 0) { //データを持っていなかった方に新しくデータを受けっとたとみなすために2をいれる NODE[3].data[S] = 2; } else if (NODE[T].data[S] == 0) { //データを持っていなかった方に新しくデータを受けっとたとみなすために2をいれる NODE[T].data[S] = 2; } } } } } //以下の作業を6-7となるまで繰り返す。 for (int U = 0; U < NODEMAX; U++) { printf("ノード%d,%d%d%d%d%d\n", U, NODE[U].data[0], NODE[U].data[1], NODE[U].data[2], NODE[U].data[3], NODE[U].data[4]);//各ノードに追加されたデータを表示 } printf("新しく受け取ったデータを1→2にする\n"); for (int V = 0; V < NODEMAX; V++) { //新しく受け取ったデータを次のクールタイムで処理できるようにデータを2から1にする。 for (int X = 0; X < NODEMAX; X++) { if (NODE[V].data[X] == 2) { NODE[V].data[X] = 1; } } } for (int Y = 0; Y < NODEMAX; Y++) { printf("ノード%d,%d%d%d%d%d\n", Y, NODE[Y].data[0], NODE[Y].data[1], NODE[Y].data[2], NODE[Y].data[3], NODE[Y].data[4]); } return 0; }
試したこと
定義のところでNODEMAXを5から順番に1つずつ増やしたら7以上からエラーが出ました
補足情報(FW/ツールのバージョンなど)
Visual Studio 2022
エラーの原因とは別ですが(エラーの原因は既に出ている回答の箇所かと思います)、
VC++でコンパイルする際にいくつか警告が出ていたと思うので解消されることをお勧めします。
---------------------------
・warning C4013: 関数 'time' は定義されていません。int 型の値を返す外部関数と見なします。
⇒ time() を使用する際は time.h の #include が必要です。
・warning C4020: 'shuffle': 実引数が多すぎます。
⇒ 「shuffle(list, NODEMAX);」の第2引数が未使用です。
---------------------------
> エラーが出ました
なにをしたら/どうなったのか を述べてください。
タグ[C#]はどういう関係があるのでしょう?
タグは、あなたの質問が回答者の関心を呼ぶためにあるのではなく、後々似たような状況に陥って情報を探している人が欲しい情報を絞り込むためのものです。C#の情報を探している人がこの投稿に行きあたったときどう感じるか、想像してみてください。
C# は関係ないので C# のタグは外してください。C# のタグで見ている閲覧者にとってはこのスレッドはノイズにしかならず迷惑ですので。
回答2件
あなたの回答
tips
プレビュー