ページ 11

DXライブラリのTCHARの互換性エラーが出てしまいます

Posted: 2016年11月02日(水) 17:36
by Mokutsuno
LoadDivGraph(graph, 4, 1, 4, width, height, gh);のgraph部分で
「型"TCHAR"の引数は型"const TCHAR *"のパラメータと互換性がありません」と出てしまいます。
プロジェクトのプロパティで文字セットをマルチバイト文字に変更はしています。
どうすることで改善できますでしょうか?
環境は、win10 64bit visualstudio community 2015 です。
よろしくお願いします。

コード:

Main_ui_sub::Main_ui_sub(TCHAR graph)
{
		width = 325;
		height = 50;
		LoadDivGraph(graph, 4, 1, 4, width, height, gh);
}

Re: DXライブラリのTCHARの互換性エラーが出てしまいます

Posted: 2016年11月02日(水) 19:53
by みけCAT
「文字列」が必要なところに「文字」を入れようとしてエラーが出ているので、適切にコードを修正することで改善できるでしょう。

例えば、引数の型をTCHARからLPCTSTRにするか、
インターフェースを変えてはいけないのなら

コード:

Main_ui_sub::Main_ui_sub(TCHAR graph)
{
		TCHAR path[2] = {graph};
		width = 325;
		height = 50;
		LoadDivGraph(path, 4, 1, 4, width, height, gh);
}
みたいな感じでしょうか?

Re: DXライブラリのTCHARの互換性エラーが出てしまいます

Posted: 2016年11月02日(水) 22:15
by あんどーなつ
みけCAT さんが書きました: 例えば、引数の型をTCHARからLPCTSTRにするか、
というのは、

コード:

Main_ui_sub::Main_ui_sub(LPCTSTR graph)
{
        width = 325;
        height = 50;
        LoadDivGraph(graph, 4, 1, 4, width, height, gh);
}
という意味です。LPCTSTRは、const TCHAR *という型と同じなので、

コード:

Main_ui_sub::Main_ui_sub(const TCHAR *graph)
{
        width = 325;
        height = 50;
        LoadDivGraph(graph, 4, 1, 4, width, height, gh);
}
とも書けます。仮引数にconstと書いた場合、const TCHAR *型しか受け付けませんよ、という意味ではなく、
この関数定義においてgraphに代入することを禁止します、という意味です。なので、

コード:

TCHAR filename[256] = "file1.txt";
Main_ui_sub(filename);
という呼び出しはOKになります。

Re: DXライブラリのTCHARの互換性エラーが出てしまいます

Posted: 2016年11月02日(水) 22:18
by あんどーなつ
ごめんなさい、これはコンストラクタの定義なので、呼び出し方は

コード:

TCHAR filename[256] = "file1.txt";
Main_ui_sub main1(filename);
とかになりますね。

Re: DXライブラリのTCHARの互換性エラーが出てしまいます

Posted: 2016年11月02日(水) 22:24
by みけCAT
あんどーなつ さんが書きました:とも書けます。仮引数にconstと書いた場合、const TCHAR *型しか受け付けませんよ、という意味ではなく、
この関数定義においてgraphに代入することを禁止します、という意味です。
この場合は違います。

コード:

Main_ui_sub::Main_ui_sub(const TCHAR *graph)
は、graphではなくgraphの指す先に代入することを禁止するという意味です。

コード:

Main_ui_sub::Main_ui_sub(const TCHAR *graph)
{
        graph[0] = 0; // NG
        graph = 0; // OK
}
graphへの代入を禁止したい場合は、

コード:

Main_ui_sub::Main_ui_sub(TCHAR * const graph)
graphもgraphが指す先も代入を禁止したい場合は、

コード:

Main_ui_sub::Main_ui_sub(const TCHAR * const graph)
と書けます。

Re: DXライブラリのTCHARの互換性エラーが出てしまいます

Posted: 2016年11月02日(水) 23:02
by あんどーなつ
みけCAT さん

ホントにすいません。考えてみればそうですね。
const TCHAR filename[] = "file1.txt";
と書いたときは、[f][l][e][1][.][t][x][t][\0]が、コード領域(リードオンリー)に格納されるので、
そのデータを使えるようにするにはポインタじゃなくてTCHARのデータそのものを書き込まないようにしないといけないです。

C言語がこんなに便利な言語だとは思いませんでした。
K&Rにも書いてなかったと思います

Re: DXライブラリのTCHARの互換性エラーが出てしまいます

Posted: 2016年11月04日(金) 20:02
by Mokutsuno
ありがとうございます。
無事動きました!