run-time check failure #2-Sが表示され、 プログラムた停止します。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
constructor2016810
記事: 22
登録日時: 9年前

run-time check failure #2-Sが表示され、 プログラムた停止します。

#1

投稿記事 by constructor2016810 » 9年前

習い始めてまだ日が浅いものです。
Visual studio express 2015 で、以下のような座席を計算させるプログラムで首題のようなエラーがかかり、 プログラムが停止してしまいます。 どのような問題があるのでしょうか?
尚、 コード中で、 赤線の波線が現れていますが、 実際のコードには、 現れていません。
よろしくお願いいたします。

コード:

// seat2.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//
/*以下のようなx、y座標で表された席で一番離れた席を決定するプログラムです

座席No     x座標 	y座標
1	          1.1     5.2
5	          3.4    1.6
8	          4.5    3.4
10             2.3	  2.6
15	          6.4	  5.7
16             7.6	  7.8
20             5.2	  4.4
22	          1.7	  3.5
25	          3.8	  6.3
30	          5.8	  6.3
*/





#include "stdafx.h"
#include "math.h"

#define MAX_SEAT 10  /* 空席の数*/



int main()
{
	
	int       seat_no[MAX_SEAT]               /* 空席の番号 */
		;double   point[MAX_SEAT][2];         /* 空席の座標point[n][0] = x座標 */
	                                         /*            point[n][1] = y座標 */

	;double  x_dis, y_dis;                   /*x,y方向の距離*/
	;double  dis;                            /*2つの空席の距離*/
	;double  max_dis = 0.0;                 /*最も離れた空席の距離*/
	int max_dis_seat[ 2 ];                 /*最も離れた空席の番号*/  
	int i, j;

	printf("シート番号とそのXおよびY座標を10回入力してください>>>");
	printf("例11  1.1 5.2(Enter キー)\n>>>");

	for (i = 0; i <MAX_SEAT; i++);
	{
		scanf_s(" %d %lf %lf", &seat_no[i], &point[i][0], &point[i][1]);
	}
	for (i = 0; i <MAX_SEAT - 1; i++);
	{
		for (j = i + 1; j <MAX_SEAT; j++);
		{
			x_dis = point[ i ][ 0 ] - point[ j ][ 0 ];
			y_dis = point[ i ][ 1 ] - point[ j ][ 1 ];
			
			dis = sqrt(x_dis * x_dis + y_dis * y_dis);        /*距離の計算*/
			if (max_dis < dis)
			{
				max_dis = dis;
				max_dis_seat[ 0 ] = seat_no[ i ];
				max_dis_seat[ 1 ] = seat_no[ j ];
			}
		}
	}

	printf("最も離れた席は%dと%dです(距離 %8.6f )\n",
		max_dis_seat[ 0 ], max_dis_sea

	return 0;

}
[code]

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: run-time check failure #2-Sが表示され、 プログラムた停止します。

#2

投稿記事 by みけCAT » 9年前

まず、

コード:

	printf("最も離れた席は%dと%dです(距離 %8.6f )\n",
		max_dis_seat[ 0 ], max_dis_sea
の後に閉じカッコとセミコロンが無いので、コンパイルエラーになるはずです。
さらに、stdafx.hの中身がわかりませんが、max_dis_seaが宣言・定義されていない可能性がありますし、このままカッコを閉じても書式に対してデータが足りません。

次に、

コード:

for (i = 0; i <MAX_SEAT; i++);
で実質iにMAX_SEATを代入した後、

コード:

scanf_s(" %d %lf %lf", &seat_no[i], &point[i][0], &point[i][1]);
を実行しているので、読み込みに成功すれば確保された範囲の外にデータを書き込み、未定義動作になります。
運悪くここで動作が停止しなかった場合、さらにx_disやy_disの計算で未初期化の自動変数point[MAX_SEAT-1][0]やpoint[MAX_SEAT-1][1]の値(不定)を利用し、再び未定義動作になります。

「run-time check failure #2-S」でググったところスタック上のデータが壊されたみたいな情報が出てきたので、多分範囲外アクセスによりデータの破壊が起きたのでしょう。
というわけで、行うべき修正は
  • 最後のprintfの呼び出しを完成させる
  • for文の後の余計なセミコロンを消して、for文の後ろにあるブロックをループで実行するようにする
  • scanf_sの戻り値を見て読み込みに成功したかどうかをチェックするようにする
でしょう。double型の変数宣言の前に余計なセミコロンがある(pointの宣言の前のセミコロンは余計ではない)ので、
文と宣言を混ぜることができるC99以降なら問題はないですが、気持ち悪ければ取ってもいいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

constructor2016810
記事: 22
登録日時: 9年前

Re: run-time check failure #2-Sが表示され、 プログラムた停止します。

#3

投稿記事 by constructor2016810 » 9年前

みけCAT 様

漸く、解決することができました。
ありがとうございました。
     constructor2016810

閉鎖

“C言語何でも質問掲示板” へ戻る