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

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

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

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

1回答

7335閲覧

C++/CLI FILE *fpの扱い方

hsgru3

総合スコア22

C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2019/05/21 12:01

前提・実現したいこと

C++/CLIでWindowsフォームアプリケーションの作成をしています。
comboboxで指定した値をsavedata.datに保存して、プログラムを再起動したさいその値を呼び出すようなプログラムを作りました。
Releaseモードで作成した実行可能ファイルを実行すると問題なくプログラムが動くのですが、デバッグの開始をすると

ハンドルされない例外が 0x00007FFC0C99CA78 (ucrtbase.dll) で発生しました(USPx64_3.exe 内): 無効なパラメーターを致命的と見なす関数に無効なパラメーターが渡されました。

と表示されます。
イメージ説明

fopen``fread``fcloseの使い方が間違っているのかと思いますが解決策がわかりません。
何か解決策、アドバイスがあれば教えていただきたいです。

該当のソースコード

#include <iostream> #include <time.h> #include <fstream> #include <vector> #include "yolo_v2_class.hpp" #include "opencv2\opencv.hpp" #include "pxcsensemanager.h" #include "PXCProjection.h" #include "aufd_v.1.3.h" using namespace cv; using namespace std; //カラー画像(処理用、保存用) Mat src, dst; //座標変換インスタンス PXCProjection *projection = nullptr; const PXCCapture::Sample *sample; PXCSenseManager *senseManager = 0; //デプス画像の距離情報格納バッファ vector<unsigned short> depthBuffer; //カラー画像の幅、高さ、解像度 const int COLOR_WIDTH = 640; const int COLOR_HEIGHT = 480; const int COLOR_FPS = 30; ~~~~省略~~~~~ //物体検出オブジェクトの作成 Detector detector("yolov2-obj.cfg", "yolov2-obj_23000.weights"); namespace UI { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// <summary> /// USP の概要 /// </summary> ~~~~~~省略~~~~~~~ #pragma endregion //初期化 private: System::Void USP_Load(System::Object^ sender, System::EventArgs^ e) { // SenseManagerを生成する senseManager = PXCSenseManager::CreateInstance(); if (senseManager == 0) { throw std::runtime_error("SenseManagerの生成に失敗しました"); } ~~~~~~~~~省略~~~~ //タイマーの初期化 timer1->Interval = 33; timer1->Enabled = true; //設定値の呼び出し FILE *fp; SaveData Data; fp = fopen("savedata.dat", "rb"); fread(&Data, sizeof(Data), 1, fp); fclose(fp); Frequency = Data.F; Time = Data.T; comboBox1->SelectedIndex = Frequency/10; comboBox2->SelectedIndex = Time - 1; } //実行 private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) { //描画 captureImage(); //設定値の反映 Int32::TryParse(comboBox1->SelectedItem->ToString(), Frequency); Int32::TryParse(comboBox2->SelectedItem->ToString(), Time);      } ~~~~~~~省略~~~~~~~~ //設定値の保存 private: System::Void button4_Click(System::Object^ sender, System::EventArgs^ e) { FILE *fp; SaveData Data = { Frequency, Time }; fp = fopen("savedata.dat", "wb"); fwrite(&Data, sizeof(Data), 1, fp); fclose(fp); cout << "設定値保存" << endl; } }; }

素人の質問で申し訳ありませんがよろしくお願いいたします。

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

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

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

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

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

pepperleaf

2019/05/21 12:42

SaveData を保存してますが、これは何でしようか? fread/fwriteは、バイト列を対象としてるので、その辺でも問題が起きてませんか? また、デバッグ実行でエラーとの事ですが、Breakを 気になる場所に置いて、ステップ実行するとどうしでょうか?
hsgru3

2019/05/21 12:53

struct SaveData { int F, T; }; 2つの変数Frequency,Timeを保存するための構造体です。 わかりずらくて申し訳ありません!
pepperleaf

2019/05/21 13:07

単純な struct なんで問題なさそうですが、 C++/CLIがちょっと気になります。 デバッグ実行が該当箇所で止める事ができないのでしょうか?
dodox86

2019/05/21 14:30

fopenが失敗したまま続行しているのでは?エラー(NULL)が返ってきているか確認してみてください。"savedata.dat"をC:\\data\\savedata.dat"などと正しいPATHを確実に指定してみてはどうでしょうか。
guest

回答1

0

ベストアンサー

fp = fopen("savedata.dat", "rb"); fread(&Data, sizeof(Data), 1, fp);

ファイルが開けなかった可能性を考慮していないのが問題です。
freadでブレークしてfpNULLになっていないか確認するとよいでしょう。

特にwindowsの場合はカレントディレクトリが起動の方法で変わることがあります。
カレントディレクトリがどこになっているかチェックするとよいでしょう。

投稿2019/05/21 14:37

asm

総合スコア15147

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

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

hsgru3

2019/05/22 01:20

回答ありがとうございます! fopenの後に if (fp == NULL) { return; } とすることでデバッグできました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問