ページ 11

構造体に入れた文字列の表示ができません。

Posted: 2011年12月11日(日) 19:15
by 化猫
現在DXライブラリを使用しゲームを作っていまして、分からないところがあります。

コード:

typedef struct
{
	int money;
	int life;
	char player_name[20];
}
ch_t;

GLOBAL ch_t ch;
と構造体を作り初期化をする部分で

コード:

ch.money = 0;
ch.life = 3;
ch.player_name = "あいうえお";
このように初期化しようとすると、moneyとlifeは問題ないのですが、player_nameは書き方が違うようでエラーになってしまいます。

コード:

ch_t ch = { 0, 3, "あいうえお"};
このように違う書き方をすれば、初期化自体は問題ないのですが、player_nameを表示する際に名前が出てきません。

名前を表示する時の書き方が間違っているかもしれないので、書いておきます。

コード:

DrawFormatStringToHandle( 0 , 0 , color[0] , font[0] , "%s" , ch.player_name );
質問したいこと
1.どのように書けば文字列を表示することができるのでしょうか?
2.何故初期化の書き方を変えると動くのでしょうか?(自分では、どっちで書いても同じだと思っています。書き方の間違いを指摘して下さい。)

この他の部分は正常に動作しているので、問題はないと思い、部分的に記述しました。
宜しくお願い致します。

Re: 構造体に入れた文字列の表示ができません。

Posted: 2011年12月11日(日) 19:44
by beatle
質問1に関しては、僕はDXライブラリに詳しくないので分かりません。

質問2に関してお答えします。
char配列に文字列リテラル("hoge"などという文字列)を代入することはできません。
ただし、文字列リテラルで初期化することはできます。
つまり

コード:

char s[32] = "hoge"; // OK

コード:

char s[32];
s = "hoge"; // ERROR
ということです。
初期化以外の場合にchar配列に文字列リテラルをコピーするにはstrcpy関数を使います。

Re: 構造体に入れた文字列の表示ができません。

Posted: 2011年12月11日(日) 20:32
by non
質問1はカラーやフォントハンドルをどう作っているかわからないと答えられません。

Re: 構造体に入れた文字列の表示ができません。

Posted: 2011年12月11日(日) 20:45
by 化猫
回答ありがとうございます。

カラー、フォントハンドルは以下のようになっています。

コード:

color[0] = GetColor(255,255,255); //白
font[0] = CreateFontToHandle( "HGP明朝E" , 20 , 0 , DX_FONTTYPE_ANTIALIASING_EDGE);

Re: 構造体に入れた文字列の表示ができません。

Posted: 2011年12月11日(日) 21:00
by non
問題なく動きます。サンプルです

コード:

#include "DxLib.h"
#include <string.h>

typedef struct
{
    int money;
    int life;
    char player_name[20];
}ch_t;
 
ch_t ch; 


int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
					 LPSTR lpCmdLine, int nCmdShow )
{
	int font[1];
	int color[1];
	ch.money = 0;
	ch.life = 3;
	strcpy_s(ch.player_name,"あいうえお"); 

	ChangeWindowMode( TRUE ) ;
	if( DxLib_Init() == -1 ) return 0 ;
	color[0] = GetColor(255,255,255);
	font[0] = CreateFontToHandle( "HGP明朝E" , 20 , 0 , DX_FONTTYPE_ANTIALIASING_EDGE); 
	DrawFormatStringToHandle( 0 , 0 , color[0] , font[0] , "%s" , ch.player_name ); 
	WaitKey() ;
	DeleteFontToHandle( font[0] ) ;
	DxLib_End() ;
	return 0 ;
}

Re: 構造体に入れた文字列の表示ができません。

Posted: 2011年12月11日(日) 21:26
by かば
char player_name[20];

char *player_name[20];
ポインタ変数にする。
ch.player_name = "あいうえお"; ←これを↓に変える。

char *c="00000000000000000000";//仮にいれる。自分は一応、要素数分だけなにかいれとく。
memcpy( player_name, c, 20 );
でできないでしょうか。
strcpyでもできます。使い方には気を付けましょう。20文字ならだいじょうぶでしょう。
memcpyよりstrcpyのほうが処理速度は速いです。(ほんと微妙ですが^^;)
自分は安パイとってmemcpyです。

Re: 構造体に入れた文字列の表示ができません。

Posted: 2011年12月11日(日) 21:31
by beatle
かばさん。
char *player_name[20];
はおかしいのではないでしょうか。char型へのポインタ20個分の配列っていう意味です。

char player_name[20];
の部分は変更せずに
memcpy(player_name, c, 20);
とするならば可能です。

Re: 構造体に入れた文字列の表示ができません。

Posted: 2011年12月11日(日) 21:34
by 化猫
無事、思ったように動きました。
strcpy等の文字列関係の関数について理解を深めることも出来ました。
皆さん、回答ありがとうございました。

問題は解決とさせて頂きます。

Re: 構造体に入れた文字列の表示ができません。

Posted: 2011年12月11日(日) 21:42
by かば
ごめんなさい。
確かに、おかしいですね。
ポインタに要素数は間違いでした。

混乱させてすみません。
beatle さんの言うとおりです。
化猫さん自分のレス飛ばして下さい。