関数の移植によって発生した「~から~に変換できません」について

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

関数の移植によって発生した「~から~に変換できません」について

#1

投稿記事 by wasawasa » 11年前

こんにちは、いつもお世話になっています。
特定フォルダのpngファイル名を取得してそれを元に画像をロードするプログラムとして下記の記述1のように記述したところ無事動作しました。
これを受けてこのプログラムのファイルを検索する関数を抜き出し、フォルダのパスと拡張子を指定してファイルを検索してファイル名を取得する関数として下記の記述2のように一部書き換えて別のプログラムに移植したところ、こちらでは21,43,64行目にてビルド時に「'FindFirstFileW' : 1 番目の引数を 'char *' から 'LPCWSTR' に変換できません。」、「'strcpy' : 2 番目の引数を 'WCHAR [260]' から 'const char *' に変換できません。」といったエラーが発生してしまいました。
この二つの間の差異として思いつく点にはインクルードするファイルの違いがありますが、この部分を書き換えてもやはりエラーの状況に影響はありませんでした。
これらの関数の間で変数の形式や構造などは手を加えていないのですが、一体この二つの間にどんな違いがあって記述2がエラーを発生させてしまうのでしょうか?

記述1

コード:

#include "DxLib.h"
#include <windows.h>
#include <tchar.h>
#include <math.h>

#define MAXPATH 256

char **SearchFile(char *FolderPass,char *ExtPass,int *FileAmount){
	int i,j;
	//ファイル検索用
	WIN32_FIND_DATA fFind;
	HANDLE hSearch;
	char *FindPath;								//検索用パス(フォルダパス+拡張子)
	//画像名格納用
	char **FileName;							//ファイル名一覧格納ポインタ
	char **FileName2;							//ポインタサイズ変更用ポインタ
	int FileNameLong=0;							//ファイル名文字数

	//ファイル検索
	FindPath=(char*)malloc(sizeof(char*)*(strlen(FolderPass)+strlen(ExtPass)));
	strcpy(FindPath,FolderPass);
	strcat(FindPath,ExtPass);
	hSearch=FindFirstFile(FindPath,&fFind); // 探索開始 
	//1個目が見つからない場合
	if (hSearch==INVALID_HANDLE_VALUE) {// 見つからなければ探索終了 
          FindClose(hSearch);
          return 0;
	}
	else{
		i=1;
		j=0;
		while(fFind.cFileName[j]!='\0'){
			j++;
		}
		FileNameLong=j;
		FileName2=(char**)malloc(sizeof(char*)*i);
		for(j=0;j<i;j++){
			FileName2[j]=(char*)malloc(sizeof(char*)*FileNameLong);
		}
		FileName=FileName2;
		FileName2=NULL;
		strcpy(FileName[i-1],fFind.cFileName);
		//残りを検索
		while (FindNextFile(hSearch,&fFind)) { /* 全ファイルを処理 */
			i++;
			j=0;
			while(fFind.cFileName[j]!='\0'){
				j++;
			}
			FileNameLong=j;
			FileName2=(char**)malloc(sizeof(char*)*i);
			for(j=0;j<i;j++){
				FileName2[j]=(char*)malloc(sizeof(char*)*FileNameLong);
			}
			for(j=0;j<i-1;j++){
				strcpy(FileName2[j],FileName[j]);
			}
			FileName=FileName2;
			FileName2=NULL;
			strcpy(FileName[i-1],fFind.cFileName);
		}
		*FileAmount=i;
	}
	FindClose(hSearch);
	return FileName;
}

void hoge()
{
	//フォルダ絶対パス検索用
	int i,j;
	int length;									//プロジェクト実行ファイルパスサイズ
	char *X;									//[\]から[/]へ書き換え用
	char delpath[] = "Debug\\DXlib_test.exe";	//消す文字列(サイズ測定用)
	char picfol[] = "Data\\Pics\\TileA\\";		//目的フォルダ相対パス
	char path[MAXPATH]={0};						//プロジェクトフォルダパス格納用
	char *picpath;								//picフォルダ絶対パス格納用
	//ファイル検索用
	WIN32_FIND_DATA fFind;
	HANDLE hSearch;
	char *FindPath;								//検索用パス(フォルダパス+拡張子)
	char FindPng[] = "*.png";					//pngファイル検索用
	//画像名格納用
	char **FileName;							//ファイル名一覧格納ポインタ
	char **FileName2;							//ポインタサイズ変更用ポインタ
	int FileNameLong=0;							//ファイル名文字数
	int FileAmount;								//検索したファイルの数
	//画像ハンドル格納用
	char *LoadPath;
	int *hpicture;

	//picフォルダパス検出
	length = GetModuleFileName(NULL, path, MAXPATH);
	path[length-strlen(delpath)] = '\0';
	picpath=(char*)malloc(sizeof(char*)*(length-strlen(delpath)+strlen(picfol)+1));
	strcpy(picpath,path);
	strcat(picpath,picfol);
	//ファイル検索
	FileName=SearchFile(picpath,FindPng,&FileAmount);

	//画像のロード
	hpicture=(int*)malloc(sizeof(int*)*FileAmount);
	for(i=0;i<FileAmount;i++){
		LoadPath=(char*)malloc(sizeof(char*)*(strlen(picpath)+strlen(FileName[i])));
		strcpy(LoadPath,picpath);
		strcat(LoadPath,FileName[i]);
		while(1){
			X = strchr(LoadPath,'\\');
			if(X != NULL){
				*X = '/';
			}
			else{break;}
		}
		hpicture[i]=LoadGraph(LoadPath);
		free(LoadPath);
	}

	for(i=0;i<100;i++){
		//DrawStringToHandle( 0, i*10, FileName[i], GetColor( 0, 255, 0 ),CreateFontToHandle( "メイリオ",10,  1, DX_FONTTYPE_ANTIALIASING_EDGE ) ); // 文字を描画する
		DrawGraph( i*20 , i*20 , hpicture[i] , FALSE ) ;
	}
	ScreenFlip();
	WaitKey() ;
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定


		hoge();
        /*while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
        }*/

        DxLib_End();    // DXライブラリ終了処理
        return 0;
}
記述2

コード:

#include <windows.h>
#include <commctrl.h>


#include "Def_ReadData.h"

char **FileSearch(char *FolderPass,char *ExtPass){
	int i,j;
	//ファイル検索用
	WIN32_FIND_DATA fFind;
	HANDLE hSearch;
	char *FindPass;
	//画像名格納用
	char **FileName;							//ファイル名一覧格納ポインタ
	char **FileName2;							//ポインタサイズ変更用ポインタ
	int FileNameLong=0;							//ファイル名文字数

	FindPass=(char*)malloc(sizeof(char*)*(strlen(FolderPass)+strlen(ExtPass)));
	strcpy(FindPass,FolderPass);
	strcat(FindPass,ExtPass);
	hSearch=FindFirstFile(FindPass,&fFind); // 探索開始
	//1個目が見つからない場合
	if (hSearch==INVALID_HANDLE_VALUE) {// 見つからなければ探索終了 
          FindClose(hSearch);
          return 0;
	}
	else{
		i=1;
		//ファイル名格納領域サイズ設定
		j=0;
		while(fFind.cFileName[j]!='\0'){
			j++;
		}
		FileNameLong=j;
		//配列サイズ変更
		FileName2=(char**)malloc(sizeof(char*)*i);
		for(j=0;j<i;j++){
			FileName2[j]=(char*)malloc(sizeof(char*)*FileNameLong);
		}
		FileName=FileName2;
		FileName2=NULL;
		//ファイル名格納
		strcpy(FileName[i-1],fFind.cFileName);
		//残りを検索
		while (FindNextFile(hSearch,&fFind)) { /* 全ファイルを処理 */
			i++;
			//ファイル名格納領域サイズ設定
			j=0;
			while(fFind.cFileName[j]!='\0'){
				j++;
			}
			FileNameLong=j;
			//配列サイズ変更
			FileName2=(char**)malloc(sizeof(char*)*i);
			for(j=0;j<i;j++){
				FileName2[j]=(char*)malloc(sizeof(char*)*FileNameLong);
			}
			for(j=0;j<i-1;j++){
				strcpy(FileName2[j],FileName[j]);
			}
			FileName=FileName2;
			FileName2=NULL;
			//ファイル名格納
			strcpy(FileName[i-1],fFind.cFileName);
		}
	}
	FindClose(hSearch);
	return FileName;
}


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

Re: 関数の移植によって発生した「~から~に変換できません」について

#2

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

各ファイルの最初に

コード:

#undef UNICODE
#undef _UNICODE
という2行を追加すると、直るかもしれません。

※試していないので、直らないかもしれません。間違っていたらごめんなさい。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: 関数の移植によって発生した「~から~に変換できません」について

#3

投稿記事 by かずま » 11年前

2つのプロジェクトのプロパティを開き、「構成プロパティ」の「全般」で、
「文字セット」を比べてみてください。
- マルチバイト文字セットを使用する
- Unicode 文字セットを使用する
と異なっているでしょう。
マルチバイト文字セットにして、「適用」ボタンを押してみてください。

それから、前に指摘した問題点が直っていません。

FindFirstFile と FindClose のマニュアルをよく読んでください。
FindClose は、FindFirstFile が成功して返したハンドルを引数にします。

free() がなくなっていますね。

FileName = FileName2;
free(FileName);

は間違いで、

free(FileNmae);
FileNmae = FileName2;

が正しい。
他にもたくさんバグがあります。

wasawasa
記事: 94
登録日時: 11年前

Re: 関数の移植によって発生した「~から~に変換できません」について

#4

投稿記事 by wasawasa » 11年前

返信ありがとうございます。
変換できないエラーはマルチバイト文字とUnicode文字の文字列を扱う方法の差異によるものだったのですね。
移植先のプログラムはUnicode文字である事を前提に記述してあったので、そちらとの兼ね合いを考えてみたいと思います。

>>かずまさん
重ね重ねの返信ありがとうございます。
かずまさんの返信を読んでいくつか疑問に思ったことがあるので質問させて頂きます。

まず、前回質問した時点で私がfree()を使って開放していたのはFileNameではなくFileName2ですが、free()をFileName2に対して使用していた理由は、質問した時点ではポインタに格納された変数アドレスを別のポインタに渡すという処理を、アドレスに対応した変数とその内部のデータをコピーした上でコピーによって新しく確保された変数に対するアドレスを返すという物だと勘違いしていたため、freeで解放しないとメモリリークが発生してしまうと考えたからです。なので、ポインタからポインタへ渡す処理についてご指摘いただいた結果、free()を使用する必要は無いと判断しました。
かずまさんのfree(FileName);についてのご指摘の真意がFileNameにFileName2に格納したアドレスを代入する前にFileNameを初期化するべきだという物であるなら、FileName2に格納したアドレスを代入する事でFileNameの初期化の役割を行えるのではないのかという点の是非についての質問を一つ、
次に、FindClose はFindFirstFile が成功して返したハンドルを引数にするという事ですが、FindFirstFileの返り値は
hSearch=FindFirstFile(FindPass,&fFind);
という形でhSearchに格納し、これをFindCloseの引数として使用しているのでFindCloseの仕様に反していないと思ったのですが、この点についての是非の質問を一つ、
そして、他にもたくさんのバグがあるとの事ですが、ご指摘頂いているのはどの部分の記述によるどういった挙動を起こしてしまうバグなのかという点についての質問を一つ、
以上の三点について疑問に感じたので質問させて頂きます。

また、かずまさんの提示してくださったコードをいつも拝見いたしております。
私の抱える問題点に対しての具体的な解決案を貴重な時間を割いて提示してくださる事は大変有難いのですが、そもそもの問題の原因を私が把握できていないが為にかずまさんが問題に対してどういったアプローチでソースを書かれたのかを理解する事が難しい事や、私の力が及ばないが為にどういった処理を行うソースを書かれていらっしゃるのかが把握できないといった事が御座います。
大変恐縮ですが、どういった問題が起きているのかといった事やその問題に対してどういったアプローチを試みておられるのか等を示した文を短文で良いので添えて頂けると有難いです。
質問をしている立場の分際で非常に厚かましい事を書いている事は承知しておりますが、これらの点についてのご理解とご一考の程何卒よろしくお願い致します。

かずま

Re: 関数の移植によって発生した「~から~に変換できません」について

#5

投稿記事 by かずま » 11年前

1. free の問題
FileName は古いデータを指しています。
FileName2 は新しく確保したデータを指しています。
free(FileName) で古いデータを解放します。
FileName = FileName2; で FileName が新しいデータを指します。
これがやりたいことですね。

先に、FileName = FileName2; を実行すると、
FileName が新しいデータを指すことになり、
古いデータを指すポインタがなくなります。
古いデータはメモリリークです。
FileName2 もまだ 新しいデータを指したままです。
ことで、free(FileName2) を実行すると、
新しいデータはなくなります。
FileName が指しているデータがなくなるということです。
free(FileName2) をしないと、新しいデータは残りますが、
古いデータはメモリリークのままです。

2. FindClose の問題
FindFirstFile でググると、Microsoft の MSDN の
ページが先頭に出てきます。
「 戻り値  関数が成功すると、検索ハンドルが返ります。この検索ハンドルは、
それ以降の FindNextFile 関数や FindClose 関数で使います。」
と書かれています。失敗した場合のハンドル値 INVALID_HANDLE_VALUE を
FindClose に渡してはいけません。
また、そのページにはサンプルコードがあって、FindFirstFile が
失敗したときは、FindClose を呼び出していません。

fp = fopen(...); が失敗したとき、fclose(fp); を実行しないのと同じです。

3. その他の問題
FileName2[j]=(char*)malloc(sizeof(char*)*FileNameLong);
ファイル名の文字数分のメモリを確保するんですよね。
FileName2[j]=(char*)malloc(sizeof(char)*FileNameLong);
または、sizeof(char) は 1 なので、
FileName2[j]=(char*)malloc(FileNameLong);
で十分です。
sizeof(char*) * FileNameLong だと 4バイトか 8バイトのポインタを
FileNameLong 個確保します。変ですよね。
その直前の

コード:

        j=0;
        while(fFind.cFileName[j]!='\0'){
            j++;
        }
        FileNameLong=j;
は、間違いとは言えませんが、
FileNameLong = strlen(Fine.cFileName); で済むことです。
ただ、この FileNameLong は、文字列の最後の '\0' を含んでいません。
だから、FileName2[j] = malloc(FileNameLong + 1);
としなければなりません。
今は、バグで 4倍または 8倍の領域を確保しているため、
'\0' の分の 1バイトがなくてもエラーにならないだけです。

while (FindNextFile(hSearch, &fFind)) { のループの中で、
古いデータから新しいデータにコピーしていますが、
新しいデータのファイル名は、最新のファイル名 fFind.cFineName の
長さで領域を割り当てています。
古いデータの複数のファイル名は、それぞれ異なる長さを持っています。
最新のファイル名の長さがそれより短ければ、strcpy(FileName2[j], FileName[j]);
でおかしなことになります。

さらに、ファイル名の領域を新たに割り当てて、そこに古い領域から
strcpy したあと、古い領域を free しないとメモリリークとなります。

紙と鉛筆を用意して、メモリの使用状況がどのように変化するのか
箱と矢印を書いてみればわかることです。

それから、パス名の '\\' を '/' に変換しているのはなぜですか?

DrawGraph するのは、100個の hpicture なのですか?

以上、まずは、wasawasaさんのプログラムの問題点を指摘するだけにして、
私のプログラムについては、あとで説明させていただきます。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: 関数の移植によって発生した「~から~に変換できません」について

#6

投稿記事 by へにっくす » 11年前

wasawasa さんが書きました:

コード:

//記述2の53行めあたりから
//配列サイズ変更
FileName2=(char**)malloc(sizeof(char*)*i);
for(j=0;j<i;j++){
    FileName2[j]=(char*)malloc(sizeof(char*)*FileNameLong);
}
for(j=0;j<i-1;j++){
    strcpy(FileName2[j],FileName[j]);
}
FileName=FileName2;
FileName2=NULL;
かずま さんが書きました:紙と鉛筆を用意して、メモリの使用状況がどのように変化するのか
箱と矢印を書いてみればわかることです。
これについて補足しておくと、かずまさんが書かれている1.freeの問題を図にするとこんな感じです。
20140518_dixq_net_f3_t15114_1.png
上記のコードを図にすると。
20140518_dixq_net_f3_t15114_1.png (12.9 KiB) 閲覧数: 5475 回
malloc、callocなどで確保したメモリは、freeに渡さない限りリークするものだと思ってください。
written by へにっくす

かずま

Re: 関数の移植によって発生した「~から~に変換できません」について

#7

投稿記事 by かずま » 11年前

画像のディレクトリ(フォルダ)に elephant.png, lion.png, tiger.png の
3つの PNGファイルがあったとします。

wasawasaさんは、まず、次の状態を作っています。

コード:

         自動変数            mallocされた領域   mallocされた領域
         +--------+          +--------+         +----------------+
FileName |   **---------->[0]|    *------------>| "elephant.png" |
         +--------+          +--------+         +----------------+

         +--------+          +--------+         +----------------+
FileName2|   **---------->[0]|    *------------>| "elephant.png" |
         +--------+          +--------+         +------------+---+
                          [1]|    *------------>| "lion.png" |
                             +--------+         +------------+
ここでやるべきことは、
free(FileName[0]); これで "elepahnt.png" が解放されます。
free(FileName); これで "elephant.png" を指していたポインタが解放されます。
FileName = FileName2; これで、FileName は 新しいデータを指します。

コード:

         自動変数            mallocされた領域   mallocされた領域
         +--------+      
FileName |   **------+
         +--------+  | 
                     |
         +--------+  +--->   +--------+         +----------------+
FileName2|   **---------->[0]|    *------------>| "elephant.png" |
         +--------+          +--------+         +------------+---+
                          [1]|    *------------>| "lion.png" |
                             +--------+         +------------+
FileName2 = NULL; を実行すると、FileName2 は FileName[0] を指さなくなり
ますが、あまり意味はありません。

wasawasaさんのやりかたでは、次のように xxx のサイズが "lion.png" と
同じなので、"elephant.png" を strcpy すると、他のメモリ領域を壊します。

コード:

         自動変数            mallocされた領域   mallocされた領域
         +--------+          +--------+         +----------------+
FileName |   **---------->[0]|    *------------>| "elephant.png" |
         +--------+          +--------+         +----------------+

         +--------+          +--------+         +------------+
FileName2|   **---------->[0]|    *------------>|    xxx     |
         +--------+          +--------+         +------------+
                          [1]|    *------------>| "lion.png" |
                             +--------+         +------------+
かずまのやり方

コード:

         自動変数            mallocされた領域   mallocされた領域
         +--------+          +--------+         +----------------+
FileName |   **---------->[0]|    *------------>| "elephant.png" |
         +--------+          +--------+   +---->+----------------+
                                          |
         +--------+          +--------+   |
FileName2|   **---------->[0]|    *-------+
         +--------+          +--------+         +------------+
                          [1]|    *------------>| "lion.png" |
                             +--------+         +------------+
FileName2 = malloc(sizeof(char*) * 2);
FileName2[0] = FileName[0];
FileName2[1] = strdup(fFind.cFileName); // "lion.png" の箱を作って繋ぐ
free(FileName); // "elepahnt.png" へのポインタを解放
FileName = FileName2;

コード:

         自動変数            mallocされた領域   mallocされた領域
         +--------+                             +----------------+
FileName |    *-------+                   +---->| "elephant.png" |
         +--------+   |                   |     +----------------+
                      |                   |
         +--------+   +-->   +--------+   |
FileName2|    *---------->[0]|    *-------+
         +--------+          +--------+         +------------+
                          [1]|    *------------>| "lion.png" |
                             +--------+         +------------+
mallocした(strdupした)ファイル名は、malloc, strcpy をせずに使いまわします。
真ん中の、ポインタ配列だけが、サイズを増やしていきます。

コード:

         自動変数            mallocされた領域   mallocされた領域
         +--------+                             +----------------+
FileName |    *-------+                  +----->| "elephant.png" |
         +--------+   |                  |      +----------------+
                      |                  | 
         +--------+   |      +--------+  |      +------------+
FileName2|        |   +-->[0]|    *------+  +-->| "lion.png" |
         +--------+          +--------+     |   +------------+
                          [1]|    *---------+
          +--------+         +--------+         +--------------+
FileAmount|    3   |      [2]|    *------------>| "tiger.png"  |
          +--------+         +--------+         +--------------+

かずま

Re: 関数の移植によって発生した「~から~に変換できません」について

#8

投稿記事 by かずま » 11年前

ちょっと訂正
3個目のファイル名を入れる時、ポインタ配列はサイズ(capa)を 4個確保し、
次回のサイズ拡張を省略できるようにしています。

コード:

         自動変数            mallocされた領域   mallocされた領域
         +--------+                             +----------------+
FileName |    *-------+                  +----->| "elephant.png" |
         +--------+   |                  |      +----------------+
                      |                  | 
         +--------+   |      +--------+  |      +------------+
FileName2|        |   +-->[0]|    *------+  +-->| "lion.png" |
         +--------+          +--------+     |   +------------+
                          [1]|    *---------+
          +--------+         +--------+         +--------------+
FileAmount|    3   |      [2]|    *------------>| "tiger.png"  |
          +-------^+         +--------+         +--------------+
          +--------+      [3]|        |
      capa|    4   |         +--------+
          +--------+
5個目のファイル名を入れる時、ポインタ配列はサイズ(capa)を 8個確保し、
6~8個目のファイル名を入れる時、サイズの拡張を省略できるように
しています。これが capa = capa ? capa * 2 : 1; です。
最初は、capa = 0 なので、capa は 1 になりますが、
その後は倍々で増えていきます。

旅路のきのこ

Re: 関数の移植によって発生した「~から~に変換できません」について

#9

投稿記事 by 旅路のきのこ » 11年前

int *p = (int *)malloc(sizeof(int))
のように確保したメモリは、freeで解放しないといけません。メモリリークになります。
wasawasaさんは、pの値をどこかにおいておけばアプリケーション終了と自動的に解放されると考えているように見受けられます。(ローカル変数のように?)
メモリリークが発生するのは、その値を持つポインタが無いときであると考えているようにも見えました。
違ってたらごめんなさい。
とにかく、動的に割り当てた分は、ちゃんとfree()で解放しないといけないということです。
wasawasa さんが書きました:まず、前回質問した時点で私がfree()を使って開放していたのはFileNameではなくFileName2ですが、free()をFileName2に対して使用していた理由は、質問した時点ではポインタに格納された変数アドレスを別のポインタに渡すという処理を、アドレスに対応した変数とその内部のデータをコピーした上でコピーによって新しく確保された変数に対するアドレスを返すという物だと勘違いしていたため、freeで解放しないとメモリリークが発生してしまうと考えたからです。なので、ポインタからポインタへ渡す処理についてご指摘いただいた結果、free()を使用する必要は無いと判断しました。
wasawasaさんは、
「最初はFileNameとFileName2の二つにそれぞれメモリが確保されていると考えたので(不要と考えられる)一つを解放し、必要な一つは解放しなかった。
今回は片方のみにメモリが確保され、不要なメモリはないので解放しなかった」
……という感じに考えたのだと解釈しました。
両方とも解放です。残してはいけません。









free()についてですが、free(p)というのはpを初期化することではありません。(揚げ足取りで甲斐のないことを言っているのかもしれませんが)
free(p)は、pから始まるメモリ(動的に割り当てたメモリ)を解放します。
freeの前後でpの値は変わりません。
その後のメモリが解放されたかどうかです。

free()には、すでに解放してあるメモリを指すポインタを渡してもいけませんし、無関係の値を渡してもいけません。
ただし、NULLを渡したときには、何もしません。
ということなので、freeで痛い目に遭ったことがある人の中には、free(p) ; p=NULL ;とワンセットの処理のように書く人もいます。(誤って二重に解放することを防ぐという目的で)

ちなみに、前の質問のかずまさんのコードで最初にfreeが現れるとき、その変数の値はNULLになっていると思います。

FindCloseについては記述1の26行目、記述2の24行目あたりのことだと思います。

wasawasa
記事: 94
登録日時: 11年前

Re: 関数の移植によって発生した「~から~に変換できません」について

#10

投稿記事 by wasawasa » 11年前

皆さん返信ありがとうございます。
そしてこちらからの返信が遅れてしまって申し訳ございません。

かずまさんの詳細な説明とへにっくすさんと旅路のきのこさんの補足説明のおかげで記述の問題点とそれに付随する私の認識の間違いを把握する事が出来ました。
私が誤って認識していた点としては以下の点がありました。
①mallocによるメモリの割り当てをループ処理を行う場合において第n回目の処理の際に第n-1回目の処理で確保したメモリがそのまま残ることを見落としていた点
②FindFirstFileの処理を「ファイルを開く→ファイルの探索→ファイルがあるかないかの判定」という風に思っており、FindFirstFileによってファイルが見つかったかどうかに関わらずFindCloseを実行しなければいけないと思っていた点
③文字列型の変数に文字列を格納する際に文字列の文字一つ一つに対してsizeof(データ型*)の容量が必要だと思っていた点
④\0を格納する容量を確保する必要がある事を見落としていた点
⑤mallocによって文字列のサイズを更新する際にそれまで格納していたデータと新しく確保する容量をマッチさせる事を失念していた点
これらの点とかずまさんにご指摘頂いた問題点及び提示して頂いたソースを踏まえて書き直してみたいと思います。

パスの'\\'を'/'に変換しているのは、パスを取得する理由がLoadGraph()で画像を読み込む事なのですが、パスにおけるフォルダ階層の表記が'\\'のままだとLoadGraphで画像を読み込むことができなかったのが理由です。

とにかく、質問にお付き合いいただきありがとうございました。

閉鎖

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