文字のコピーがうまくいきません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
srpg大好きさん

文字のコピーがうまくいきません

#1

投稿記事 by srpg大好きさん » 9年前

興味本意でゲーム作りを初めて3か月になります
基礎事項をある程度わかっていると思ったので、このサイトを参考にゲーム作りをさせていただいているのですが、
ちょっとしたエラーが出てしまって困っています。
他力本願で失礼ですが、どなたか解決策を出してください。お願いします。
以下必要と思われるコード

コード:

//現在は、倉庫から取り出す限定の関数の予定
//フラグが15で倉庫ではなく、直接アイテムを作りだす
void item_cheng(int knd_flag ,int p,int i,int k){//順に「所持物か倉庫」を選んで、所持品の何番目を倉庫の何番目に何個入れるか決める
	if(knd_flag==0){
		if(play.home_box[i].nokori>k){
			play.item_box[p].img	=play.home_box[i].img;
			play.item_box[p].name	=play.home_box[i].name;
			play.item_box[p].hp		=play.home_box[i].hp;
			play.item_box[p].mp		=play.home_box[i].mp;
			play.item_box[p].atk	=play.home_box[i].atk;
			play.item_box[p].def	=play.home_box[i].def;
			play.item_box[p].matk	=play.home_box[i].matk;
			play.item_box[p].mdef	=play.home_box[i].mdef;
			play.item_box[p].move	=play.home_box[i].move;
			play.item_box[p].sp		=play.home_box[i].sp;
		}
		else printfDx("倉庫のアイテムの数が足りません\n");
	}
	else if(knd_flag==15){
		play.item_box[p].img	=item[i].img;
		play.item_box[p].name	=item[i].name;
		play.item_box[p].hp		=item[i].hp;
		play.item_box[p].mp		=item[i].mp;
		play.item_box[p].atk	=item[i].atk;
		play.item_box[p].def	=item[i].def;
		play.item_box[p].matk	=item[i].matk;
		play.item_box[p].mdef	=item[i].mdef;
		play.item_box[p].move	=item[i].move;
		play.item_box[p].sp		=item[i].sp;
		play.item_box[p].nokori	=k;
	}
}
void item_name(){//アイテムの名前の読込
	int i,fp;
	char fname[32]={"dat/item_name.txt"};

	fp = FileRead_open(fname);//ファイル読み込み
	if(fp == NULL){
		printfDx("read error\n");
		return;
	}
	while( FileRead_eof( fp ) == 0 ){		// ファイルの終端が来るまで表示する
		for(i=0;i<ITEM_MAX;i++){
			FileRead_gets( item[i].name, 40, fp) ;		// 一行読み込み
		}
	}
	FileRead_close( fp ) ;					// ファイルを閉じる
}
アイテムの構造体は
//アイテムに関する構造体
typedef struct{
	int img;		//画像
	int hp,mp,atk,def,matk,mdef,move,sp;
	int kns;		//武器の種類(0で武器、1で防具、2で回復アイテム、3で消費アイテム)
	int criti;		//特攻属性(何の種族に特攻か?)(0で人間に特攻撃、1で妖怪ry、2で妖精、3で幽霊、10で特攻無し)
	int attri;		//このアイテム装着時の基本属性(0=月,1=火,2=水,3=木,4=金,5=土,6=日,7=破,8=聖,15=追加属性なし)
	int etc;		//あと後役立つかもしれないので作った。
	char name[40];	//名前(ないとは思うが一応20文字分)
	int nokori;		//これは所持数

	int flag;		//フラグ(その欄にアイテムがあるかのフラグっぽい?)
}item_t;
で、エラーは
1>etc.cpp
1>.\mydat\source\etc.cpp(22) : error C2106: '=' : 左のオペランドが、左辺値になっていません。
1>.\mydat\source\etc.cpp(36) : error C2106: '=' : 左のオペランドが、左辺値になっていません。
と言うことでした。 最初の関数の部分の名前がうまくコピーできません  説明が下手ですが解決策よろしくお願いします。

srpg大好きさん

Re: わすれもの

#2

投稿記事 by srpg大好きさん » 9年前

書き忘れていたことがありました
「item_name.txt」の内容ですが、
「アイテム名1
 アイテム名2
 アイテム名3
 アイテム名4
 (以下省略  」となっています。
一行目の文字=1個目のロードするときのアイテムの名前となっています。

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

Re: 文字のコピーがうまくいきません

#3

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

とりあえずこうでしょうか?

コード:

//現在は、倉庫から取り出す限定の関数の予定
//フラグが15で倉庫ではなく、直接アイテムを作りだす
void item_cheng(int knd_flag ,int p,int i,int k){//順に「所持物か倉庫」を選んで、所持品の何番目を倉庫の何番目に何個入れるか決める
    if(knd_flag==0){
        if(play.home_box[i].nokori>k){
            play.item_box[p].img    =play.home_box[i].img;
            //play.item_box[p].name   =play.home_box[i].name;
            lstrcpy(play.item_box[p].name,play.home_box[i].name);
            play.item_box[p].hp     =play.home_box[i].hp;
            play.item_box[p].mp     =play.home_box[i].mp;
            play.item_box[p].atk    =play.home_box[i].atk;
            play.item_box[p].def    =play.home_box[i].def;
            play.item_box[p].matk   =play.home_box[i].matk;
            play.item_box[p].mdef   =play.home_box[i].mdef;
            play.item_box[p].move   =play.home_box[i].move;
            play.item_box[p].sp     =play.home_box[i].sp;
        }
        else printfDx("倉庫のアイテムの数が足りません\n");
    }
    else if(knd_flag==15){
        play.item_box[p].img    =item[i].img;
        //play.item_box[p].name   =item[i].name;
        lstrcpy(play.item_box[p].name,item[i].name);
        play.item_box[p].hp     =item[i].hp;
        play.item_box[p].mp     =item[i].mp;
        play.item_box[p].atk    =item[i].atk;
        play.item_box[p].def    =item[i].def;
        play.item_box[p].matk   =item[i].matk;
        play.item_box[p].mdef   =item[i].mdef;
        play.item_box[p].move   =item[i].move;
        play.item_box[p].sp     =item[i].sp;
        play.item_box[p].nokori =k;
    }
}
void item_name(){//アイテムの名前の読込
    int i,fp;
    char fname[32]={"dat/item_name.txt"};
 
    fp = FileRead_open(fname);//ファイル読み込み
    if(fp == NULL){
        printfDx("read error\n");
        return;
    }
    while( FileRead_eof( fp ) == 0 ){       // ファイルの終端が来るまで表示する
        for(i=0;i<ITEM_MAX;i++){
            FileRead_gets( item[i].name, 40, fp) ;      // 一行読み込み
        }
    }
    FileRead_close( fp ) ;                  // ファイルを閉じる
}
アイテムの構造体は
//アイテムに関する構造体
typedef struct{
    int img;        //画像
    int hp,mp,atk,def,matk,mdef,move,sp;
    int kns;        //武器の種類(0で武器、1で防具、2で回復アイテム、3で消費アイテム)
    int criti;      //特攻属性(何の種族に特攻か?)(0で人間に特攻撃、1で妖怪ry、2で妖精、3で幽霊、10で特攻無し)
    int attri;      //このアイテム装着時の基本属性(0=月,1=火,2=水,3=木,4=金,5=土,6=日,7=破,8=聖,15=追加属性なし)
    int etc;        //あと後役立つかもしれないので作った。
    char name[40];  //名前(ないとは思うが一応20文字分)
    int nokori;     //これは所持数
 
    int flag;       //フラグ(その欄にアイテムがあるかのフラグっぽい?)
}item_t;
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

srpg大好きさん

Re: 文字のコピーがうまくいきません

#4

投稿記事 by srpg大好きさん » 9年前

なるほどそんな関数があったなんて知りませんでした

素早い返答ありがとうございます。

早速試しましたが、次はこのようなエラーが・・・
1>.\mydat\source\etc.cpp(23) : error C2664: 'lstrcpyW' : 1 番目の引数を 'char [40]' から 'LPWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。
1>.\mydat\source\etc.cpp(42) : error C2664: 'lstrcpyW' : 1 番目の引数を 'char [40]' から 'LPWSTR' に変換できません。(新しい機能 ; ヘルプを参照)
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。

もう、どうしたらいいのでしょうか?全く分かりません。
後、申し遅れましたが私はこのサイトを見てやり始めたのでC言語をほぼ飛ばしてC++から入りましたということを記させてください。
どなたか、良い解決策を・・・

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

Re: 文字のコピーがうまくいきません

#5

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

コード:

//現在は、倉庫から取り出す限定の関数の予定
//フラグが15で倉庫ではなく、直接アイテムを作りだす
void item_cheng(int knd_flag ,int p,int i,int k){//順に「所持物か倉庫」を選んで、所持品の何番目を倉庫の何番目に何個入れるか決める
    if(knd_flag==0){
        if(play.home_box[i].nokori>k){
            play.item_box[p].img    =play.home_box[i].img;
            //play.item_box[p].name   =play.home_box[i].name;
            lstrcpyA(play.item_box[p].name,play.home_box[i].name);
            play.item_box[p].hp     =play.home_box[i].hp;
            play.item_box[p].mp     =play.home_box[i].mp;
            play.item_box[p].atk    =play.home_box[i].atk;
            play.item_box[p].def    =play.home_box[i].def;
            play.item_box[p].matk   =play.home_box[i].matk;
            play.item_box[p].mdef   =play.home_box[i].mdef;
            play.item_box[p].move   =play.home_box[i].move;
            play.item_box[p].sp     =play.home_box[i].sp;
        }
        else printfDx("倉庫のアイテムの数が足りません\n");
    }
    else if(knd_flag==15){
        play.item_box[p].img    =item[i].img;
        //play.item_box[p].name   =item[i].name;
        lstrcpyA(play.item_box[p].name,item[i].name);
        play.item_box[p].hp     =item[i].hp;
        play.item_box[p].mp     =item[i].mp;
        play.item_box[p].atk    =item[i].atk;
        play.item_box[p].def    =item[i].def;
        play.item_box[p].matk   =item[i].matk;
        play.item_box[p].mdef   =item[i].mdef;
        play.item_box[p].move   =item[i].move;
        play.item_box[p].sp     =item[i].sp;
        play.item_box[p].nokori =k;
    }
}
void item_name(){//アイテムの名前の読込
    int i,fp;
    char fname[32]={"dat/item_name.txt"};
 
    fp = FileRead_open(fname);//ファイル読み込み
    if(fp == NULL){
        printfDx("read error\n");
        return;
    }
    while( FileRead_eof( fp ) == 0 ){       // ファイルの終端が来るまで表示する
        for(i=0;i<ITEM_MAX;i++){
            FileRead_gets( item[i].name, 40, fp) ;      // 一行読み込み
        }
    }
    FileRead_close( fp ) ;                  // ファイルを閉じる
}
アイテムの構造体は
//アイテムに関する構造体
typedef struct{
    int img;        //画像
    int hp,mp,atk,def,matk,mdef,move,sp;
    int kns;        //武器の種類(0で武器、1で防具、2で回復アイテム、3で消費アイテム)
    int criti;      //特攻属性(何の種族に特攻か?)(0で人間に特攻撃、1で妖怪ry、2で妖精、3で幽霊、10で特攻無し)
    int attri;      //このアイテム装着時の基本属性(0=月,1=火,2=水,3=木,4=金,5=土,6=日,7=破,8=聖,15=追加属性なし)
    int etc;        //あと後役立つかもしれないので作った。
    char name[40];  //名前(ないとは思うが一応20文字分)
    int nokori;     //これは所持数
 
    int flag;       //フラグ(その欄にアイテムがあるかのフラグっぽい?)
}item_t;
うごかない可能性があります。
とりあえずやってみてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
lriki
記事: 88
登録日時: 9年前

Re: 文字のコピーがうまくいきません

#6

投稿記事 by lriki » 9年前

lstrcpy じゃなくて strcpy を使ってみたらどうでしょうか?

アバター
pooka
記事: 7
登録日時: 10年前
住所: 福井

Re: 文字のコピーがうまくいきません

#7

投稿記事 by pooka » 9年前

strcpyを使用してみてください。

strcpy(play.item_box[p].name, play.home_box.name);

strcpy(play.item_box[p].name, item.name);

srpg大好きさん

Re: 文字のコピーがうまくいきません

#8

投稿記事 by srpg大好きさん » 9年前

たくさんの回答ありがとうございます

片っ端からやってみましたが、はやりうまくコピーできません

ちゃんとstring.hをインクルードしているのですが、何故なのですか?

「元の文字が読みこめていない?」と思い、↓のコードを打ち試してみましたが
DrawFormatStringToHandle(380,15,color[0],font[6],"%s",item[0].name);

結果は「水の書」と正しく表示できました。

恐らく無視していいとは思いますが、
1>.\mydat\source\etc.cpp(25) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> C:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h(74) : 'strcpy' の宣言を確認してください。
1>.\mydat\source\etc.cpp(48) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> C:\Program Files\Microsoft Visual Studio 9.0\VC\include\string.h(74) : 'strcpy' の宣言を確認してください。
このような警告も出てきました
もう一度現在のコードを貼っておきます

コード:

//現在は、倉庫から取り出す限定の関数の予定
//フラグが15で倉庫ではなく、直接アイテムを作りだす
void item_cheng(int knd_flag ,int p,int i,int k){//順に「所持物か倉庫」を選んで、所持品の何番目を倉庫の何番目に何個入れるか決める
	if(knd_flag==0){
		if(play.home_box[i].nokori>k){
			play.item_box[p].img	=play.home_box[i].img;
	//		play.item_box[p].name   =play.home_box[i].name;
	//		lstrcpyA(play.item_box[p].name,play.home_box[i].name);
			strcpy(play.item_box[p].name, play.home_box[i].name);
			play.item_box[p].hp		=play.home_box[i].hp;
			play.item_box[p].mp		=play.home_box[i].mp;
			play.item_box[p].atk	=play.home_box[i].atk;
			play.item_box[p].def	=play.home_box[i].def;
			play.item_box[p].matk	=play.home_box[i].matk;
			play.item_box[p].mdef	=play.home_box[i].mdef;
			play.item_box[p].move	=play.home_box[i].move;
			play.item_box[p].sp		=play.home_box[i].sp;
			play.item_box[p].criti	=play.home_box[i].criti;
			play.item_box[p].attri	=play.home_box[i].attri;
			play.item_box[p].kns	=play.home_box[i].kns;
			play.item_box[p].etc	=play.home_box[i].etc;
			play.item_box[p].nokori	=k;
			play.home_box[i].nokori	=play.home_box[i].nokori-k;
		}
		else printfDx("倉庫のアイテムの数が足りません\n");
	}
	else if(knd_flag==15){
		play.item_box[p].img	=item[i].img;
		printfDx("%d\n",item[i].img);
	//	play.item_box[p].name   =item[i].name;
	//	lstrcpyA(play.item_box[p].name,item[i].name);
		strcpy(play.item_box[p].name, item[i].name);
	//	strncpy(play.item_box[p].name, item[i].name,28);
		play.item_box[p].hp		=item[i].hp;
		play.item_box[p].mp		=item[i].mp;
		play.item_box[p].atk	=item[i].atk;
		play.item_box[p].def	=item[i].def;
		play.item_box[p].matk	=item[i].matk;
		play.item_box[p].mdef	=item[i].mdef;
		play.item_box[p].move	=item[i].move;
		play.item_box[p].sp		=item[i].sp;
		play.item_box[p].criti	=item[i].criti;
		play.item_box[p].attri	=item[i].attri;
		play.item_box[p].kns	=item[i].kns;
		play.item_box[p].etc	=item[i].etc;
		play.item_box[p].nokori	=k;
	}
	DrawFormatStringToHandle(150,100,color[0],font[6],"%s",item[0].name);
}
インクルードされているのは、
#include "../../../include/DxLib.h"
#include "define.h"
#include "math.h"
#include <stdio.h>
#include <string.h>
の5つです

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

Re: 文字のコピーがうまくいきません

#9

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

srpg大好きさん さんが書きました:片っ端からやってみましたが、はやりうまくコピーできません
具体的にどうなりますか?
(全くコピーされない、文字化けする、後ろに余計な文字がつく、etc)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

srpg大好きさん

Re: 文字のコピーがうまくいきません

#10

投稿記事 by srpg大好きさん » 9年前

結果だけを言ってしまうと、全くコピーできないんですよね

前述の通り、元の文字列は正しくあるのでコピーする部分に問題があると思っています。

確認方法ですが、HNの通りSRPGを作っているのですが
func_stateでメインコントロールを制御して、
control_main()により、メニュー画面に入り、
アイテム画面を出し、アイテム欄に表示されるのがplay.item_box[p].nameという感じなのですよね
その時に、表示が何も出ないのですよね   item[0].nameに変えるとちゃんと「水の書」と表示できるので欄の部分にミスは無いと思います。

需要は0だと思いますが、ここまで来ると自分のコードもあやしくなってくるのでおかしい点などの確認もお願いいたします。

コード:

//↓はアイテムのフォント関係
#define lenki 38//行間隔(1行1行の縦の間隔 = y )
#define fiski 77//行の初めの位置(y)
#define lenkis 38//行間隔(1行1行の縦の間隔 = y )
#define fiskis 264//行の初めの位置(y)
void item_sta_win(int *page,int *book1,int *book2){		//ステータスウィンドウ
	if((*page)==0){
		DrawExtendGraph(330,15,330+48,15+48,icon[play.item_box[menu.knd+(*book1)*10].img],TRUE);//2倍
		DrawFormatStringToHandle(380,15,color[0],font[6],"%s",play.item_box[menu.knd+(*book1)*10].name);
		switch(play.item_box[menu.knd+(*book1)*10].kns){
			case 0:		//武器
			case 1:		//防具(両方まとめても大丈夫そうなので今はまとめて置く)
				DrawFormatStringToHandle(400,45,color[0],font[3],"HP  +%2d",play.item_box[menu.knd+(*book1)*10].hp);
				DrawFormatStringToHandle(520,45,color[0],font[3],"MP  +%2d",play.item_box[menu.knd+(*book1)*10].mp);
				DrawFormatStringToHandle(388,70,color[0],font[3],"ATK  +%2d",play.item_box[menu.knd+(*book1)*10].atk);
				DrawFormatStringToHandle(513,70,color[0],font[3],"DEF  +%2d",play.item_box[menu.knd+(*book1)*10].def);
				DrawFormatStringToHandle(385,90,color[0],font[3],"MAT  +%2d",play.item_box[menu.knd+(*book1)*10].matk);
				DrawFormatStringToHandle(510,90,color[0],font[3],"MDF  +%2d",play.item_box[menu.knd+(*book1)*10].mdef);
				DrawFormatStringToHandle(368,113,color[0],font[6],"MOVE  +%2d",play.item_box[menu.knd+(*book1)*10].move);
				DrawFormatStringToHandle(520,113,color[0],font[6],"SP  +%2d",play.item_box[menu.knd+(*book1)*10].sp);
				if(play.item_box[menu.knd+(*book1)*10].kns==0){
					switch(play.item_box[menu.knd+(*book1)*10].criti){	//何に特攻か?
						case 0:		DrawFormatStringToHandle(325,135,color[0],font[1],"人間");	break;
						case 1:		DrawFormatStringToHandle(325,135,color[2],font[1],"妖怪");	break;
						case 2:		DrawFormatStringToHandle(325,135,color[6],font[1],"妖精");	break;
						case 3:		DrawFormatStringToHandle(325,135,color[3],font[1],"幽霊");	break;
						case 10:	DrawFormatStringToHandle(325,135,color[0],font[2],"特攻無し");	break;
					}
					if(play.item_box[menu.knd+(*book1)*10].criti!=10)	DrawFormatStringToHandle(380,138,color[0],font[2],"に大ダメージ");
					switch(play.item_box[menu.knd+(*book1)*10].attri){	//通常攻撃に属性追加
						case 15:	DrawFormatStringToHandle(470,160,color[0],font[2],"属性追加無し");	break;
						case 0:	DrawFormatStringToHandle(507,156,color[10],font[1],"月");	break;
						case 1:	DrawFormatStringToHandle(507,156,color[2],font[1],"火");	break;
						case 2:	DrawFormatStringToHandle(507,156,color[4],font[1],"水");	break;
						case 3:	DrawFormatStringToHandle(507,156,color[3],font[1],"木");	break;
						case 4:	DrawFormatStringToHandle(507,156,color[5],font[1],"金");	break;
						case 5:	DrawFormatStringToHandle(507,156,color[8],font[1],"土");	break;
						case 6:	DrawFormatStringToHandle(507,156,color[9],font[1],"日");	break;
						case 7:	DrawFormatStringToHandle(507,156,color[2],font[1],"破");	break;
						case 8:	DrawFormatStringToHandle(507,156,color[5],font[1],"聖");	break;
					}
					if(play.item_box[menu.knd+(*book1)*10].attri!=15)	DrawFormatStringToHandle(390,160,color[0],font[2],"通常攻撃に  属性追加");
				}
				if(play.item_box[menu.knd+(*book1)*10].kns==1){
					switch(play.item_box[menu.knd+(*book1)*10].criti){	//何に特攻か?
						case 0:		DrawFormatStringToHandle(325,135,color[0],font[1],"人間");	break;
						case 1:		DrawFormatStringToHandle(325,135,color[2],font[1],"妖怪");	break;
						case 2:		DrawFormatStringToHandle(325,135,color[6],font[1],"妖精");	break;
						case 3:		DrawFormatStringToHandle(325,135,color[3],font[1],"幽霊");	break;
						case 10:	DrawFormatStringToHandle(325,135,color[0],font[2],"ダメージ減少無し");	break;
					}
					if(play.item_box[menu.knd+(*book1)*10].criti!=10)	DrawFormatStringToHandle(380,138,color[0],font[2],"から受けるダメージ減少");
					switch(play.item_box[menu.knd+(*book1)*10].attri){	//通常攻撃に属性追加
						case 15:	DrawFormatStringToHandle(470,160,color[0],font[2],"属性追加無し");	break;
						case 0:	DrawFormatStringToHandle(507,156,color[10],font[1],"月");	break;
						case 1:	DrawFormatStringToHandle(507,156,color[2],font[1],"火");	break;
						case 2:	DrawFormatStringToHandle(507,156,color[4],font[1],"水");	break;
						case 3:	DrawFormatStringToHandle(507,156,color[3],font[1],"木");	break;
						case 4:	DrawFormatStringToHandle(507,156,color[5],font[1],"金");	break;
						case 5:	DrawFormatStringToHandle(507,156,color[8],font[1],"土");	break;
						case 6:	DrawFormatStringToHandle(507,156,color[9],font[1],"日");	break;
						case 7:	DrawFormatStringToHandle(507,156,color[2],font[1],"破");	break;
						case 8:	DrawFormatStringToHandle(507,156,color[5],font[1],"聖");	break;
					}
					if(play.item_box[menu.knd+(*book1)*10].attri!=15)	DrawFormatStringToHandle(370,160,color[0],font[2],"装備キャラに  属性追加");
				}
				break;
			case 2:		//回復アイテム
				if(play.item_box[menu.knd+(*book1)*10].hp==9999)	DrawFormatStringToHandle(360,80,color[0],font[2],"使用するとHPを完全回復");
				else DrawFormatStringToHandle(360,80,color[0],font[2],"使用するとHPを%4d回復",play.item_box[menu.knd+(*book1)*10].hp);
				if(play.item_box[menu.knd+(*book1)*10].mp==9999)	DrawFormatStringToHandle(360,110,color[0],font[2],"使用するとMPを完全回復");
				else DrawFormatStringToHandle(360,110,color[0],font[2],"使用するとMPを%4d回復",play.item_box[menu.knd+(*book1)*10].mp);
				break;
			case 3:		//消費アイテム
				break;
		}
	}
	else if((*page)==1){
		DrawExtendGraph(330,15,330+48,15+48,icon[play.home_box[menu.knd+(*book2)*5].img],TRUE);//2倍
		DrawFormatStringToHandle(380,15,color[0],font[6],"%s",play.home_box[menu.knd+(*book2)*5].name);
		switch(play.home_box[menu.knd+(*book2)*5].kns){
			case 0:		//武器
			case 1:		//防具(両方まとめても大丈夫そうなので今はまとめて置く)
				DrawFormatStringToHandle(400,45,color[0],font[3],"HP  +%2d",play.home_box[menu.knd+(*book2)*5].hp);
				DrawFormatStringToHandle(520,45,color[0],font[3],"MP  +%2d",play.home_box[menu.knd+(*book2)*5].mp);
				DrawFormatStringToHandle(388,70,color[0],font[3],"ATK  +%2d",play.home_box[menu.knd+(*book2)*5].atk);
				DrawFormatStringToHandle(513,70,color[0],font[3],"DEF  +%2d",play.home_box[menu.knd+(*book2)*5].def);
				DrawFormatStringToHandle(385,90,color[0],font[3],"MAT  +%2d",play.home_box[menu.knd+(*book2)*5].matk);
				DrawFormatStringToHandle(510,90,color[0],font[3],"MDF  +%2d",play.home_box[menu.knd+(*book2)*5].mdef);
				DrawFormatStringToHandle(368,113,color[0],font[6],"MOVE  +%2d",play.home_box[menu.knd+(*book2)*5].move);
				DrawFormatStringToHandle(520,113,color[0],font[6],"SP  +%2d",play.home_box[menu.knd+(*book2)*5].sp);
				if(play.home_box[menu.knd+(*book2)*5].kns==0){
					switch(play.home_box[menu.knd+(*book2)*5].criti){	//何に特攻か?
						case 0:		DrawFormatStringToHandle(325,135,color[0],font[1],"人間");	break;
						case 1:		DrawFormatStringToHandle(325,135,color[2],font[1],"妖怪");	break;
						case 2:		DrawFormatStringToHandle(325,135,color[6],font[1],"妖精");	break;
						case 3:		DrawFormatStringToHandle(325,135,color[3],font[1],"幽霊");	break;
						case 10:	DrawFormatStringToHandle(325,135,color[0],font[2],"特攻無し");	break;
					}
					if(play.home_box[menu.knd+(*book2)*5].criti!=10)	DrawFormatStringToHandle(380,138,color[0],font[2],"に大ダメージ");
					switch(play.home_box[menu.knd+(*book2)*5].attri){	//通常攻撃に属性追加
						case 15:	DrawFormatStringToHandle(470,160,color[0],font[2],"属性追加無し");	break;
						case 0:	DrawFormatStringToHandle(507,156,color[10],font[1],"月");	break;
						case 1:	DrawFormatStringToHandle(507,156,color[2],font[1],"火");	break;
						case 2:	DrawFormatStringToHandle(507,156,color[4],font[1],"水");	break;
						case 3:	DrawFormatStringToHandle(507,156,color[3],font[1],"木");	break;
						case 4:	DrawFormatStringToHandle(507,156,color[5],font[1],"金");	break;
						case 5:	DrawFormatStringToHandle(507,156,color[8],font[1],"土");	break;
						case 6:	DrawFormatStringToHandle(507,156,color[9],font[1],"日");	break;
						case 7:	DrawFormatStringToHandle(507,156,color[2],font[1],"破");	break;
						case 8:	DrawFormatStringToHandle(507,156,color[5],font[1],"聖");	break;
					}
					if(play.home_box[menu.knd+(*book2)*5].attri!=15)	DrawFormatStringToHandle(390,160,color[0],font[2],"通常攻撃に  属性追加");
				}
				if(play.home_box[menu.knd+(*book2)*5].kns==1){
					switch(play.home_box[menu.knd+(*book2)*5].criti){	//何に特攻か?
						case 0:		DrawFormatStringToHandle(325,135,color[0],font[1],"人間");	break;
						case 1:		DrawFormatStringToHandle(325,135,color[2],font[1],"妖怪");	break;
						case 2:		DrawFormatStringToHandle(325,135,color[6],font[1],"妖精");	break;
						case 3:		DrawFormatStringToHandle(325,135,color[3],font[1],"幽霊");	break;
						case 10:	DrawFormatStringToHandle(325,135,color[0],font[2],"ダメージ減少無し");	break;
					}
					if(play.home_box[menu.knd+(*book2)*5].criti!=10)	DrawFormatStringToHandle(380,138,color[0],font[2],"から受けるダメージ減少");
					switch(play.home_box[menu.knd+(*book2)*5].attri){	//通常攻撃に属性追加
						case 15:	DrawFormatStringToHandle(470,160,color[0],font[2],"属性追加無し");	break;
						case 0:	DrawFormatStringToHandle(507,156,color[10],font[1],"月");	break;
						case 1:	DrawFormatStringToHandle(507,156,color[2],font[1],"火");	break;
						case 2:	DrawFormatStringToHandle(507,156,color[4],font[1],"水");	break;
						case 3:	DrawFormatStringToHandle(507,156,color[3],font[1],"木");	break;
						case 4:	DrawFormatStringToHandle(507,156,color[5],font[1],"金");	break;
						case 5:	DrawFormatStringToHandle(507,156,color[8],font[1],"土");	break;
						case 6:	DrawFormatStringToHandle(507,156,color[9],font[1],"日");	break;
						case 7:	DrawFormatStringToHandle(507,156,color[2],font[1],"破");	break;
						case 8:	DrawFormatStringToHandle(507,156,color[5],font[1],"聖");	break;
					}
					if(play.home_box[menu.knd+(*book2)*5].attri!=15)	DrawFormatStringToHandle(370,160,color[0],font[2],"装備キャラに  属性追加");
				}
				break;
			case 2:		//回復アイテム
				if(play.home_box[menu.knd+(*book2)*5].hp==9999)	DrawFormatStringToHandle(360,80,color[0],font[2],"使用するとHPを完全回復");
				else DrawFormatStringToHandle(360,80,color[0],font[2],"使用するとHPを%4d回復",play.home_box[menu.knd+(*book2)*5].hp);
				if(play.home_box[menu.knd+(*book2)*5].mp==9999)	DrawFormatStringToHandle(360,110,color[0],font[2],"使用するとMPを完全回復");
				else DrawFormatStringToHandle(360,110,color[0],font[2],"使用するとMPを%4d回復",play.home_box[menu.knd+(*book2)*5].mp);
				break;
			case 3:		//消費アイテム
				break;
		}
	}
}
void item_menu(){
SetFontSize( 15 );//字の基本の大きさ変更
static int book1=0;
static int book2=0;
static int page=0;
	//----------------------------------キー設定関係---------------------------------------//
	if(CheckStatePad(configpad.down)==1){	//今回menu.knd_knsはページ数を表す
		if(page==0){
			if(menu.knd==10-1){
				menu.knd=0;
			}
			else menu.knd++;
		}
		else if(page==1){
			if(menu.knd==5-1){
				menu.knd=0;
			}
			else menu.knd++;
		}
	}
	else if(CheckStatePad(configpad.up)==1){
		if(page==0){
			if(menu.knd==0){
				menu.knd=10-1;
			}
			else menu.knd--;
		}
		else if(page==1){
			if(menu.knd==0){
				menu.knd=5-1;
			}
			else menu.knd--;
		}
	}
	else if(CheckStatePad(configpad.right)==1){
		if(page==0){
			page=1;
			menu.knd=0;
		}
	}
	else if(CheckStatePad(configpad.left)==1){
		if(page==1){
			page=0;
			menu.knd=0;
		}
	}
	if(CheckStatePad(configpad.Ltrigger)==1){
		if(page==0){
			if(book1==0)	book1=(ITEM_BOX_MAX/10)-1;
			else book1--;
		}
		else if(page==1){
			if(book2==0)	book2=(HOME_BOX_MAX/5)-1;
			else book2--;
		}
	}
	if(CheckStatePad(configpad.Rtrigger)==1){
		if(page==0){
			if(book1==(ITEM_BOX_MAX/10)-1)	book1=0;
			else book1++;
		}
		else if(page==1){
			if(book2==(HOME_BOX_MAX/5)-1)	book2=0;
			else book2++;
		}
	}

	//----------------------------------所持品関係----------------------------------//
	paint_box(40,20,315,460,5,color[0]);	//自作関数(枠w)所持品の枠
	DrawFormatStringToHandle(70,30,color[0],font[4],"所 持 品");
	DrawFormatStringToHandle(240,55,color[0],font[10],"%d/%dページ",book1+1,ITEM_BOX_MAX/10);
	DrawFormatStringToHandle(44,60,color[0],font[5],"―――――――――");
	for(int l=1;l<10;l++)	DrawFormatStringToHandle(44,60+1+38*l,color[0],font[5],"   ――――――――");

	SetDrawArea(44,60,310,455);
	for(int k=0;k<10;k++){
	//	DrawString(85,fiski+lenki*(k),"金符「エメラルドメガリス」",color[0]);
		DrawFormatString(85,fiski+lenki*(k),color[0],"%s",play.item_box[k+book1*10].name);
		DrawFormatString(85,fiski+lenki*(k)+18,color[0],"       所持数 %2d",play.item_box[k+book1*10].nokori);
	}

	SetDrawArea(0,0,640,480);
	//-----------------------------------倉庫関係-----------------------------------------------//
	paint_box(318,195,632,460,5,color[0]);	//自作関数(枠w)倉庫の枠
	DrawFormatStringToHandle(400,215,color[0],font[4],"倉 庫");
	DrawFormatStringToHandle(540,240,color[0],font[10],"%d/%dページ",book2+1,HOME_BOX_MAX/5);
	DrawFormatStringToHandle(323,245,color[0],font[5],"――――――――――-");
	for(int l=1;l<5;l++)	DrawFormatStringToHandle(323,245+4+38*l,color[0],font[5],"   ―――――――――-");
	SetDrawArea(323,245,628,455);
	DrawString(370,fiskis+lenkis*0,"金符「エメラルドメガリス」",color[0]);
	DrawFormatString(370,fiskis+lenkis*0+18,color[0],"         所持数 %2d",play.item_box[0].nokori);
	DrawString(370,fiskis+lenkis*1,"金符「エメラルドメガリス」",color[0]);
	DrawFormatString(370,fiskis+lenkis*1+18,color[0],"         所持数 %2d",play.item_box[0].nokori);
	DrawString(370,fiskis+lenkis*2,"金符「エメラルドメガリス」",color[0]);
	DrawFormatString(370,fiskis+lenkis*2+18,color[0],"         所持数 %2d",play.item_box[0].nokori);
	DrawString(370,fiskis+lenkis*3,"金符「エメラルドメガリス」",color[0]);
	DrawFormatString(370,fiskis+lenkis*3+18,color[0],"         所持数 %2d",play.item_box[0].nokori);
	DrawString(370,fiskis+lenkis*4,"金符「エメラルドメガリス」",color[0]);
	DrawFormatString(370,fiskis+lenkis*4+18,color[0],"         所持数 %2d",play.item_box[0].nokori);
	DrawString(370,fiskis+lenkis*5,"金符「エメラルドメガリス」",color[0]);
	DrawFormatString(370,fiskis+lenkis*5+18,color[0],"         所持数 %2d",play.item_box[0].nokori);
	SetDrawArea(0,0,640,480);
	//-------------------------------------選択アイテムステータス画面関係-----------------------------//
	paint_box(320,5,635,190,4,color[0]);	//自作関数(枠w)アイテムのステータスの枠
	item_sta_win(&page,&book1,&book2);//アイテムのステウィンド
	//----------------------------------その他-------------------------------------------------//
	SetFontSize( 24 );//字の基本の大きさ変更
	if(page==0)			DrawString(48,fiski+2+lenki*(menu.knd),"→",color[0]);//カーソル85-37
	else if(page==1)	DrawString(333,fiskis+2+lenkis*(menu.knd),"→",color[0]);//カーソル370
	SetFontSize( 22 );//字の基本の大きさ変更
SetFontSize( 13 );//字の大きさを戻す
DrawFormatStringToHandle(10,470,color[0],font[10],"%d,%d,%d",menu.knd,menu.knd+10*book1,menu.knd+5*book2);
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

Re: 文字のコピーがうまくいきません

#11

投稿記事 by softya(ソフト屋) » 9年前

はじめまして。RPG講座をここのサイトの日記で書いているsoftya(ソフト屋)です。
講座の中でデバッグ講座を書いたので、このテクニックを使って細かく調べてみてはどうでしょうか?
DXLIBでコンソールウィンドウを開いてprintfする手法を載せています。
http://dixq.net/forum/blog.php?u=114&b=982
strcpy直後の文字列のprintfをしてみるとか、添字が常に合っているかを確認するprintfなどをあちこちに挿入すると原因が見えてくると思います。
こういうバグは、文字コード問題、添字の間違い、何らかのメモリ破壊が怪しいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: 文字のコピーがうまくいきません

#12

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

item_cheng関数はどのように呼び出していますか?
このソースを検索しても見つかりませんでした。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

srpg大好きさん

Re: 文字のコピーがうまくいきません

#13

投稿記事 by srpg大好きさん » 9年前

>softya(ソフト屋) さん

良い返答ありがとうございます。一度HPを読みました。

printfを使いデバックを常に動いている関数から、怪しいと思われる一時的にしか呼ばない関数まで調べました

問題のitem_cheng(以下省略で);の関数でやったところ関数に入って、すぐに一度アイテム名を表示するようにしたら
最初は何も表示されなかったのですが、全く違う関数に同じことをしているうちにきちんと表示されるようになりました。
デバックの為のprintfしかコードを増やしていないので正直驚いています。
個人的には「解決」にしていいと思うのですが、ソフト屋さんのHPで書いてある通り、たまたま直ったので
きちんと原因を突き止めるまで「解決」にしようとは思っていません。
原因を見つけ次第、その原因を書いた方がいいでしょうか? 最後の最後にくだらない質問ですがよろしくお願いします。

>みけCATさん

現在は、動作確認程度にfunc_state(常時は50)を何もない30に通し、その時にitem_cheng(15,0,0,15);と言う感じで呼んでいます。
原因不明ですが、結果は直りました。 原因を見つけ次第 原因を書き「解決」マークを付けますので応援よろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 10年前
住所: 東海地方
連絡を取る:

Re: 文字のコピーがうまくいきません

#14

投稿記事 by softya(ソフト屋) » 9年前

srpg大好きさん さんが書きました:>softya(ソフト屋) さん
良い返答ありがとうございます。一度HPを読みました。
printfを使いデバックを常に動いている関数から、怪しいと思われる一時的にしか呼ばない関数まで調べました
問題のitem_cheng(以下省略で);の関数でやったところ関数に入って、すぐに一度アイテム名を表示するようにしたら
最初は何も表示されなかったのですが、全く違う関数に同じことをしているうちにきちんと表示されるようになりました。
デバックの為のprintfしかコードを増やしていないので正直驚いています。
個人的には「解決」にしていいと思うのですが、ソフト屋さんのHPで書いてある通り、たまたま直ったので
きちんと原因を突き止めるまで「解決」にしようとは思っていません。
原因を見つけ次第、その原因を書いた方がいいでしょうか? 最後の最後にくだらない質問ですがよろしくお願いします。
HPと言っても、ここ「C言語何でも質問掲示板」のあるサイトのC言語交流フォーラム ~ mixC++ ~内に間借りしてるんですけどね(^^;

で、ご質問の件ですがフォーラムルールに有りますとおり知識の共有をしたいのでぜひ報告をお願いします。

それと偶然直った場合は、添字の間違いやらメモリ破壊とかを疑ったほうが良いでしょう。あと変数の初期化漏れも疑われます。
直った様に見えるのは偶然なので、リリースビルドすると結果が変わってくる可能性が大きいでしょう。
なまじバグが再現しないほうが質が悪いので、再現できるように戻してみることをお勧めします。

あと稀にですが、ヘッダ修正時にコンパイルが漏れてしまう場合がありますので、そう云うコンパイル時の問題も頭においておいてください。
VC++だとのリューションファイルに登録されていないヘッダ等がある場合に起こりますので、これも確認してみてください。
分けのわからないバグが出たら全ビルド(リビルド)を時々してみましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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