トップページ > 記事閲覧
FileInfo.Nameで代入するとうまくいかない
名前:タニシン 日時: 2021/11/04 03:44

お世話になっております。 OGGファイルを複数読み込んで表示してまして、IDは正常に入るのですがタイトルがうまく表示できず困っています。 2ファイル目以降を代入するとそれまでに代入していたファイルも更新されてしまいます。 ただ、代入をFileInfo.Nameではなく直接文字列を入れた場合は正常に動作します。 よろしくお願いいたします。 以下はソースコードです。 #include <DxLib.h> class Test { private: int id; const char* title; public: Test() { title = u8"test"; id = -1; } int get_id()const { return id; } const char* get_title()const { return title; } void set_id(int id) { this->id = id; } void set_title(const char* title) { this->title = title; } }; int ToolTest() { // データ Test testData[10]; // 見つかったファイル数 int findFile = 0; // フォルダ内の曲の読み込み用 FILEINFO FileInfo; DWORD_PTR FindHandle; // 検索開始、最初のファイルの情報を取得 FindHandle = FileRead_findFirst(u8"*.ogg", &FileInfo); // ファイルが見つかった場合のみ実行 if (FindHandle != (DWORD_PTR)-1){ do{ // 画面をクリア ClearDrawScreen(); // ファイル(FALSE)かフォルダ(TRUE)判定 if (FileInfo.DirFlag == FALSE) { // 見つかったファイル名で書き込む testData[findFile].set_title(FileInfo.Name); testData[findFile].set_id(LoadSoundMem(FileInfo.Name)); for (int j = 0; j < 10; j++) { //if (j == 8) { } DrawFormatString(0, j * 20, -1, u8"title:%s id:%d", testData[j].get_title(), testData[j].get_id()); } findFile++; } // 裏画面の内容を表画面に反映 ScreenFlip(); // キー入力待ち WaitKey(); // 次のファイルを検索、無かったらループを抜ける } while (FileRead_findNext(FindHandle, &FileInfo) >= 0); } // 検索ハンドルの後始末 DxLib::FileRead_findClose(FindHandle); return 0; }
メンテ

Page: 1 |

Re: FileInfo.Nameで代入するとうまくいかない ( No.1 )
名前:管理人 日時:2021/11/05 01:44

set_title では引数である『文字列が格納されているメモリ領域の先頭アドレス』のみ保存していて、 『文字列自体』は保存していないので、引数として渡した FILEINFO FileInfo の内容が FileRead_findNext によって書き換わってしまうと get_title で取得できる文字列の内容も変わってしまいます ( get_title が返しているのは FileInfo.Name 配列の先頭アドレスなので ) これを防ぐには class Test のメンバー変数 title を const char *title; から char title[ 260 ]; に変更して、更にメンバー関数の set_title を { this->title = title; } から { strcpy( this->title, title ); } に変更する必要があります( アドレスだけを保存するのではなく、文字列自体を保存する形に変更 ) よろしければお試しください
メンテ
Re: FileInfo.Nameで代入するとうまくいかない ( No.2 )
名前:タニシン(解決済み) 日時:2021/11/06 17:33

管理人さん 変更してみましたところ、希望する動作ができるようになりました。 アドレス関連についてあとでもう一回勉強しなおそうと思います。 ありがとうございました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存