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

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

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

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

3回答

1376閲覧

ヴィジュアルスタジオのハンドルされていない例外

cube2413

総合スコア0

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/06/30 03:23

編集2022/07/05 01:59

イメージ説明ヴィジュアルスタジオで「ハンドルされない例外が 0x00007FFC2088AFEC (ucrtbased.dll) で発生しました(ConsoleApplication1.exe 内): 無効なパラメーターを致命的と見なす関数に無効なパラメーターが渡されました。」という表示がでるのですが何が原因かわからないです。教えていただけますでしょうか。
コード全体です。

#ifdef WIN32
#define CRT_SECURE_NO_WARNIGS //scanfなどの警告抑制
#define USE_MATH_DEFINES //円周率πの使用
#endif //ifdef WIN32

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

void main()
{

static char inptfl[] = "input.csv"; /* simu1ation input*/ static char ouptfl[] = "output.csv"; /*simulation output*/ //definition FILE* finp; FILE* fotp; int err; char buf[500]; int i, ndat = 8, k, kk, nsteop = 2046; double data_old[8], data[8], X0, Y0, xx, yy, YY, XX, hd; double dt = 0.1, M_PI = 3.141592653589793; printf(" ConsoleApplication1 \n\n"); //出力ファイルを開く処理 err = fopen_s(&finp, inptfl, "r"); if (err != 0) { printf("cannot open input file \n\n"); exit(1); } err = fopen_s(&fotp, ouptfl, "w"); if (err != 0) { printf("cannot poen output file \n\n"); exit(1); } // 0.初期値入力 fgets(buf, 500, finp); fgets(buf, 500, finp); for (i = 0;i <= ndat;i++)//ndat=8 { fscanf_s(finp, "%lf,", &data_old[i]); //old --> 1行前のデータ } //緯度経度の初期値 X0,Y0 X0 = data_old[2]; Y0 = data_old[1]; for (k = 1, k <= nsteop; k++;) { kk = k; // 1. data input データ入力 for (i = 1; i <= ndat; i++) //ndat=8 { fscanf_s(finp, "%lf,", &data[i]); // &を忘れずに %lf, 倍精度 } // 2. compute heading 方位角の計算 hd = data_old[3] + (-data[5]) * dt; // 3. compute longitude latitude 経度緯度の計算(m) xx = data_old[2] + data[4] * dt * sin(data_old[3] * M_PI / 180.0); // 経度x (m) M_PI 後で定義 3.14 yy = data_old[1] + data[4] + dt * cos(data_old[3] * M_PI / 180.0); // 緯度y (m) // 4, compute longitude latitude too degree 経度緯度をdegに変換 YY = data[1] / (111111.0 + Y0); // Y (deg) XX = data[2] / (111111.0 * cos(YY * M_PI / 180.0)) + X0; // X (deg) // 5. out put データ出力 fprintf_s(fotp, "%lf, %lf, %lf, %lf, %lf, %lf, %lf, %lf, \n", data[0], data[5], data[4], hd, xx, yy, XX, YY); }

}

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

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

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

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

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

guest

回答3

0

fgets関数の第1、第3引数がnullポインタだと質問者様のおっしゃる例外が出ます。
詳しくは「質問への追記・修正依頼」のdodox86さんが貼ってくださったURLを見ていただけるとわかると思います。

原因は以下のコードです。

C

1// 0.初期値入力 2finp = 0; 3fgets(buf, 500, finp);

恐らく、finpが初期化されてないよーというエラーが出たのでfinp = 0という処理を加えたと思うのですが、finpはポインタ変数ですので0を代入するとnullポインタになります。

ということでfinp = 0;を削除し、入力ファイルを開く(finpにinputファイルのポインタ―を渡す)処理を入れることで解決するのではないでしょうか?

C

1//出力ファイルを開く処理 2 3err = fopen_s(&fotp, ouptfl, "r"); 4if (err != 0) 5{ 6printf("cannot poen output file \n\n"); 7exit(1); 8}

outputファイルを読み込みで開く処理になってますが、ここは

C

1err = fopen_s(&finp, inptfl, "r"); 2 if (err != 0) 3 { 4 printf("cannot open input file \n\n"); 5 exit(1); 6 }

とするのが正解なのではないでしょうか?
ご確認よろしくお願いします。

2022/07/05 追記
見てほしい設定箇所の画像を貼ります。確認お願いします。
イメージ説明

投稿2022/07/01 01:00

編集2022/07/05 02:42
ALOHAMS

総合スコア195

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

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

cube2413

2022/07/01 04:23

回答ありがとうございます。 言われた通り訂正したら下記コードの「fgets(buf, 500, finp);」の部分でも例外が出てくるのですが分かりますでしょうか。    // 0.初期値入力 fgets(buf, 500, finp); fgets(buf, 500, finp); の部分でも
ALOHAMS

2022/07/01 04:31 編集

修正したコードを質問本文中に追記していただけると助かります。 それと、どのような例外でしょうか?関数に無効なパラメータが渡されて起きた例外か、finpが初期化されてない旨の例外が出たのか、はたまたそれ以外なのか
cube2413

2022/07/01 07:19

#ifdef WIN32 #define CRT_SECURE_NO_WARNIGS //scanfなどの警告抑制 #define USE_MATH_DEFINES //円周率πの使用 #endif //ifdef WIN32 #include <stdlib.h> #include <stdio.h> #include <math.h> void main() { static char* inptfl = "input.csv"; /* simu1ation input*/ static char* ouptfl = "output.csv"; /*simulation output*/ //definition FILE* finp; FILE* fotp; int err; char buf[500]; int i, ndat = 8, k, kk, nsteop = 2046; double data_old[8], data[8], X0, Y0, xx, yy, YY, XX, hd; double dt = 0.1, M_PI = 3.141592653589793; printf(" ConsoleApplication1 \n\n"); //出力ファイルを開く処理 err = fopen_s(&finp, inptfl, "r"); if (err != 0) { printf("cannot open input file \n\n"); exit(1); } err = fopen_s(&fotp, ouptfl, "w"); if (err != 0) { printf("cannot poen output file \n\n"); exit(1); } // 0.初期値入力 fgets(buf, 500, finp); fgets(buf, 500, finp); for (i = 0;i <= ndat;i++)//ndat=8 { fscanf_s(finp, "%lf,", &data_old[i]); //old --> 1行前のデータ } //緯度経度の初期値 X0,Y0 X0 = data_old[2]; Y0 = data_old[1]; for (k = 1, k <= nsteop; k++;) { kk = k; // 1. data input データ入力 for (i = 1; i <= ndat; i++) //ndat=8 { fscanf_s(finp, "%lf,", &data[i]); // &を忘れずに %lf, 倍精度 } // 2. compute heading 方位角の計算 hd = data_old[3] + (-data[5]) * dt; // 3. compute longitude latitude 経度緯度の計算(m) xx = data_old[2] + data[4] * dt * sin(data_old[3] * M_PI / 180.0); // 経度x (m) M_PI 後で定義 3.14 yy = data_old[1] + data[4] + dt * cos(data_old[3] * M_PI / 180.0); // 緯度y (m) // 4, compute longitude latitude too degree 経度緯度をdegに変換 YY = data[1] / (111111.0 + Y0); // Y (deg) XX = data[2] / (111111.0 * cos(YY * M_PI / 180.0)) + X0; // X (deg) // 5. out put データ出力 fprintf_s(fotp, "%lf, %lf, %lf, %lf, %lf, %lf, %lf, %lf, \n", data[0], data[5], data[4], hd, xx, yy, XX, YY); } } すみません。こちらです。 「ハンドルされない例外が 0x00007FFCAB521548 (ntdll.dll) で発生しました(ConsoleApplication1.exe 内): 0xC0000005: 場所 0x0000000000000758 の読み取り中にアクセス違反が発生しました。 」という表示が出ました。
ALOHAMS

2022/07/01 07:55 編集

ありがとうございます。 質問本文は編集できますので、できればそこに修正したコードを追記する形で載せていただくと見やすくて良いです。 static char* inptfl = "input.csv"; /* simu1ation input*/ static char* ouptfl = "output.csv"; /*simulation output*/ ここを static char inptfl[] = "input.csv"; /* simu1ation input*/ static char ouptfl[] = "output.csv"; /*simulation output*/ このように修正してみてください。 それと確認していただきたいことがあります。 VisualStudio上部のツール → オプション → プロジェクトおよびソリューション → ビルドして実行 右側の「実行時に、ビルドまたは配置のエラーが発生したとき」の設定はどうなっているでしょうか?
cube2413

2022/07/03 01:30 編集

返答遅くなり申し訳ございません。 修正を行ったところ、 // 0.初期値入力 fgets(buf, 500, finp); この部分でランタイムライブラリの警告(?)が、〇で×を囲ってあるマークの表示が出てきます。 そのあとに、「ハンドルされない例外が 0x00007FFC2A74AFEC (ucrtbased.dll) で発生しました(ConsoleApplication1.exe 内): 無効なパラメーターを致命的と見なす関数に無効なパラメーターが渡されました。」という表示が出てきます。 設定は、「アクティブな項目をソリューションエクスプローラーで選択された状態にする」以外に全てチェックが入っています。 #ifdef WIN32 #define CRT_SECURE_NO_WARNIGS //scanfなどの警告抑制 #define USE_MATH_DEFINES //円周率πの使用 #endif //ifdef WIN32 #include <stdlib.h> #include <stdio.h> #include <math.h> void main() { static char inptfl[] = "input.csv"; /* simu1ation input*/ static char ouptfl[] = "output.csv"; /*simulation output*/ //definition FILE* finp; FILE* fotp; int err; char buf[500]; int i, ndat = 8, k, kk, nsteop = 2046; double data_old[8], data[8], X0, Y0, xx, yy, YY, XX, hd; double dt = 0.1, M_PI = 3.141592653589793; printf(" ConsoleApplication1 \n\n"); //出力ファイルを開く処理 err = fopen_s(&finp, inptfl, "r"); if (err == 0) { printf("cannot open input file \n\n"); exit(1); } err = fopen_s(&fotp, ouptfl, "w"); if (err != 0) { printf("cannot poen output file \n\n"); exit(1); } // 0.初期値入力 fgets(buf, 500, finp); fgets(buf, 500, finp); for (i = 0;i <= ndat;i++)//ndat=8 { fscanf_s(finp, "%lf,", &data_old[i]); //old --> 1行前のデータ } //緯度経度の初期値 X0,Y0 X0 = data_old[2]; Y0 = data_old[1]; for (k = 1, k <= nsteop; k++;) { kk = k; // 1. data input データ入力 for (i = 1; i <= ndat; i++) //ndat=8 { fscanf_s(finp, "%lf,", &data[i]); // &を忘れずに %lf, 倍精度 } // 2. compute heading 方位角の計算 hd = data_old[3] + (-data[5]) * dt; // 3. compute longitude latitude 経度緯度の計算(m) xx = data_old[2] + data[4] * dt * sin(data_old[3] * M_PI / 180.0); // 経度x (m) M_PI 後で定義 3.14 yy = data_old[1] + data[4] + dt * cos(data_old[3] * M_PI / 180.0); // 緯度y (m) // 4, compute longitude latitude too degree 経度緯度をdegに変換 YY = data[1] / (111111.0 + Y0); // Y (deg) XX = data[2] / (111111.0 * cos(YY * M_PI / 180.0)) + X0; // X (deg) // 5. out put データ出力 fprintf_s(fotp, "%lf, %lf, %lf, %lf, %lf, %lf, %lf, %lf, \n", data[0], data[5], data[4], hd, xx, yy, XX, YY); } }
ALOHAMS

2022/07/04 00:42 編集

返答ありがとうございます。 修正したプログラムはここには貼らず、質問文の左下の「編集」から追記してください。お願いします。 >err = fopen_s(&finp, inptfl, "r"); >if (err == 0) ここのif文の比較演算子ですが、!=だったのを==にしたのはなぜですか? >設定は、「アクティブな項目をソリューションエクスプローラーで選択された状態にする」以外に全てチェックが入っています。 それはツール → オプションで見れるところですよね? そこから左側の「ビルドして実行」をクリックしたところの設定が見たいのです。よろしくおねがいします
cube2413

2022/07/05 02:00

こちらのミスで変えてしまいました。 設定の画面はスクリーンショットの設定画面であってますでしょうか。
ALOHAMS

2022/07/05 02:52

見てほしい設定の画像をこの回答に追記しましたのでご確認ください。 自分の環境ではcube2413様のコードで動作し、output.csvにデータが出力されていることは確認できました。 それと、これは本質問とは関係のないところではありますが、61行目の for (k = 1, k <= nsteop; k++;) は、おそらくkが2046になるまで処理を繰り返したいところだと思うのですが、この処理ですと2046を超えてもループし続けてしまうので修正が必要だと思います。 ご確認ください。
cube2413

2022/07/05 03:50

すみません。ビジュアルスタジオを開きなおしたところ、そのプロパティが消えてしまいました。 確認できる方法をご存知でしょうか。 >for (k = 1, k <= nsteop; k++;) 確認してみます。
ALOHAMS

2022/07/05 04:10

今までプロパティという言葉は出てきていないのでプロパティとはなにを指しているのかが良くわかりませんが、あなたが貼ってくださった画像と同じウィンドウです。 あなたの貼った画像ですと「環境」が一番上になってますが、上にスクロールできますよね?そこに「プロジェクトおよびソリューション」があるのでダブルクリックするなりツリーを開いてください。 その中に「ビルドして実行」があるので確認してみてください
guest

0

多分forは0~8まで回してるのにその中で参照している配列は8しか確保してないからじゃないですかね?

double data_old [8], for (i = 0;i <= ndat;i++)//ndat=8 fscanf_s(finp,"%lf,",&data_old[i]); //old --> 1行前のデータ

投稿2022/06/30 03:52

RiaFeed

総合スコア2701

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

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

cube2413

2022/06/30 10:18

そこでは例外が出なかったのでそこではない気がします。 デバックを実行した所、、他の所のコードでも例外が出てきます。コード全体はこんな感じです。原因分かりますでしょうか。 #ifdef WIN32 #define CRT_SECURE_NO_WARNIGS //scanfなどの警告抑制 #define USE_MATH_DEFINES //円周率πの使用 #endif //ifdef WIN32 #include <stdlib.h> #include <stdio.h> #include <math.h> void main() { static char* inptfl = "input.csv"; /* simu1ation input*/ static char* ouptfl = "output.csv"; /*simulation output*/ //definition FILE* finp; FILE* fotp; int err; char buf[500]; int i, ndat = 8, k, kk, nsteop = 2046; double data_old[8], data[8], X0, Y0, xx, yy, YY, XX, hd; double dt = 0.1, M_PI = 3.141592653589793; printf(" ConsoleApplication1 \n\n"); //出力ファイルを開く処理 err = fopen_s(&fotp, ouptfl, "r"); if (err != 0) { printf("cannot poen output file \n\n"); exit(1); } err = fopen_s(&fotp, ouptfl, "w"); if (err != 0) { printf("cannot poen output file \n\n"); exit(1); } // 0.初期値入力 finp = 0; fgets(buf, 500, finp); fgets(buf, 500, finp); for (i = 0;i <= ndat;i++)//ndat=8 { fscanf_s(finp, "%lf,", &data_old[i]); //old --> 1行前のデータ } //緯度経度の初期値 X0,Y0 X0 = data_old[2]; Y0 = data_old[1]; for (k = 1, k <= nsteop; k++;) { kk = k; // 1. data input データ入力 for (i = 1; i <= ndat; i++) //ndat=8 { fscanf_s(finp, "%lf,", &data[i]); // &を忘れずに %lf, 倍精度 } // 2. compute heading 方位角の計算 hd = data_old[3] + (-data[5]) * dt; // 3. compute longitude latitude 経度緯度の計算(m) xx = data_old[2] + data[4] * dt * sin(data_old[3] * M_PI / 180.0); // 経度x (m) M_PI 後で定義 3.14 yy = data_old[1] + data[4] + dt * cos(data_old[3] * M_PI / 180.0); // 緯度y (m) // 4, compute longitude latitude too degree 経度緯度をdegに変換 YY = data[1] / (111111.0 + Y0); // Y (deg) XX = data[2] / (111111.0 * cos(YY * M_PI / 180.0)) + X0; // X (deg) // 5. out put データ出力 fprintf_s(fotp, "%lf, %lf, %lf, %lf, %lf, %lf, %lf, %lf, \n", data[0], data[5], data[4], hd, xx, yy, XX, YY); } }
guest

0

c

1finp = 0;

これは、以下のようにするつもりだったのではないでしょうか。

c

1if (fopen_s(&finp, inpfl, "r")) { 2 perror(inpfl); 3 exit(1); 4}

投稿2022/06/30 03:49

int32_t

総合スコア20882

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

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

cube2413

2022/06/30 07:06

回答ありがとうございます!初期値にしたかったのでコード変更しました! ですが、まだ「ハンドルされない例外が 0x00007FFC2088AFEC (ucrtbased.dll) で発生しました(ConsoleApplication1.exe 内): 無効なパラメーターを致命的と見なす関数に無効なパラメーターが渡されました。」というエラーが出るのですが、どうしたらよろしいでしょうか。
int32_t

2022/06/30 07:19

あとは RiaFeed さんが指摘しているループ回数が1回多い件がありますが、それはこの例外とは関係ない気がします。 質問文にあるコードは全体ではないようですが、例外が出ているのは質問文にあるコード内で間違いないですか? デバッグ実行して確認してください。
cube2413

2022/06/30 10:16

デバックで他の所も観てみると別の部分でもでました。 コード全体はこんな感じです。 #ifdef WIN32 #define CRT_SECURE_NO_WARNIGS //scanfなどの警告抑制 #define USE_MATH_DEFINES //円周率πの使用 #endif //ifdef WIN32 #include <stdlib.h> #include <stdio.h> #include <math.h> void main() { static char* inptfl = "input.csv"; /* simu1ation input*/ static char* ouptfl = "output.csv"; /*simulation output*/ //definition FILE* finp; FILE* fotp; int err; char buf[500]; int i, ndat = 8, k, kk, nsteop = 2046; double data_old[8], data[8], X0, Y0, xx, yy, YY, XX, hd; double dt = 0.1, M_PI = 3.141592653589793; printf(" ConsoleApplication1 \n\n"); //出力ファイルを開く処理 err = fopen_s(&fotp, ouptfl, "r"); if (err != 0) { printf("cannot poen output file \n\n"); exit(1); } err = fopen_s(&fotp, ouptfl, "w"); if (err != 0) { printf("cannot poen output file \n\n"); exit(1); } // 0.初期値入力 finp = 0; fgets(buf, 500, finp); fgets(buf, 500, finp); for (i = 0;i <= ndat;i++)//ndat=8 { fscanf_s(finp, "%lf,", &data_old[i]); //old --> 1行前のデータ } //緯度経度の初期値 X0,Y0 X0 = data_old[2]; Y0 = data_old[1]; for (k = 1, k <= nsteop; k++;) { kk = k; // 1. data input データ入力 for (i = 1; i <= ndat; i++) //ndat=8 { fscanf_s(finp, "%lf,", &data[i]); // &を忘れずに %lf, 倍精度 } // 2. compute heading 方位角の計算 hd = data_old[3] + (-data[5]) * dt; // 3. compute longitude latitude 経度緯度の計算(m) xx = data_old[2] + data[4] * dt * sin(data_old[3] * M_PI / 180.0); // 経度x (m) M_PI 後で定義 3.14 yy = data_old[1] + data[4] + dt * cos(data_old[3] * M_PI / 180.0); // 緯度y (m) // 4, compute longitude latitude too degree 経度緯度をdegに変換 YY = data[1] / (111111.0 + Y0); // Y (deg) XX = data[2] / (111111.0 * cos(YY * M_PI / 180.0)) + X0; // X (deg) // 5. out put データ出力 fprintf_s(fotp, "%lf, %lf, %lf, %lf, %lf, %lf, %lf, %lf, \n", data[0], data[5], data[4], hd, xx, yy, XX, YY); } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問