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

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

新規登録して質問してみよう
ただいま回答率
86.02%
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

解決済

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

hsgru3
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のインターフェイスのエレメントにアクセスすることができます。

1回答

0グッド

0クリップ

6108閲覧

投稿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; } }; }

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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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を確実に指定してみてはどうでしょうか。

回答1

1

ベストアンサー

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

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

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

投稿2019/05/21 14:37

asm

総合スコア15141

Zuishin👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

hsgru3

2019/05/22 01:20

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

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のインターフェイスのエレメントにアクセスすることができます。