久しぶりのプログラミング

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

久しぶりのプログラミング

投稿記事 by MoNoQLoREATOR » 14年前

ずいぶんと久しぶりにプログラミングをしました。
やはり楽しいですね。
さて、現在次のような関数をつくっています。

例えば
I'mMoNoQLoREATOR!!
という文字列を放り込むと、座標(100,200)の位置に黄色で32ピクセルの I'm が表示され、続けて、水色で64ピクセルの縁付き文字 MoNoQLoREATOR!! が表示されるというものです。内部でDrawFormatStringToHandle()を呼び出して描画しています。つまり、HTML感覚で文字列を描画できるということです。これを利用すれば、テキストファイルから文字列を読み込んで、それをそのままこの関数に渡すだけで思い通りに文字列を表示することができます。

・・・しかし、原因不明のエラーが・・・orz
文字列処理って難しいですよね。文字列をコピーしているのか、先頭アドレスを記憶しているだけなのか、どちらかわかりません。多分その辺りが問題ではないかと思うのですが、どうなのでしょう。vectorは克服したと思ったのになぁ・・・。

書きかけのはずかしいコードなので質問掲示板に乗せられませんw
以下エラー内容とソースコードです。原因がわかる方、よろしくおねがいしますm(_ _)m

CODE:

エラー内容

TagString.exe の 0x0089f71c でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x008a5ff0 に書き込み中にアクセス違反が発生しました。

とりあえず、アクセス違反だそうです。場所0x008a5ff0とか言われてもチンプンカンプンなのですが・・・

CODE:

#define _CRT_SECURE_NO_DEPRECATE
#include "DxLib.h"
#include 
#include 
#include 
#include 



//描画した際、その横幅を返す


std::vector CreateTagData(const char *baseStr){
	using namespace std;

	vector tagData;
	vector subs;
	subs.resize(1);

	// ''で分割する
	{
		vector paredStr;

		for(size_t i=0;i') paredStr.push_back("");
			else paredStr[paredStr.size()-1] += baseStr[i];	//文字列追加
		}

		//0番目から始まり偶数番目の文字列については':'又は';'で分割する
		{
			int count = -1;

			for(size_t i=0;i tagData){
	using namespace std;

	int width = 0;
	int argu[7] = {0,0,0,0,0,0,0};
	string fontName;

	argu[4] = 9;
	argu[5] = 32;
	argu[7] = DX_FONTTYPE_NORMAL;


/*
0 出力
1 x座標
2 y座標
3 色
4 太さ
5 大きさ
6 フォント
7 フォントタイプ(淵付き,アンチエイリアス等)   
*/


	//配列の0番目から走査し、属性によって適切な回数パラメーターの値を設定する
	for(size_t i=0;i test = CreateTagData("fj;as;ofuoafoa");


	while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
        ClsDrawScreen();


		TagString(test);

		
		ScreenFlip();
	}
	DxLib_End();
	return(0);
}

アバター
MNS
記事: 35
登録日時: 14年前

Re: 久しぶりのプログラミング

投稿記事 by MNS » 14年前

基本的な知識が抜け落ちているようです。
まず、文字列リテラルはアクセスは出来ても、書き換えはできません。
つまり、char *cHandle = "0"; と宣言しても、cHandleは書き換え不可です。
よって、_itoaに渡すと、アクセス違反が発生し、そのようなエラーがでます。

ですから、単純にcHandleは配列として宣言するのが懸命です。
たとえば、char cHandle[32] = "0\0"; などでしょうか。
それか、std::stringを使うようにして、boostのようなライブラリを使うのもアリかもしれません

あと、int argu[7] = {0,0,0,0,0,0,0}; としたとき、言うまでもなく要素は7個です。
argu[7] = DX_FONTTYPE_NORMAL; などとしたら、8個目の要素にアクセスしようとするので、
これもアクセス違反が発生すると思います。

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

Re: 久しぶりのプログラミング

投稿記事 by MoNoQLoREATOR » 14年前

ホントですね。
char *cHandle;
とだけ書いたら初期化されていない変数がどうたらこうたらと言われたので適当に初期値を代入したら静かになったのですが、書き換えできないんですね。
あと配列の数。これはいつもやってしまうorz  久しぶりにプログラミングしたときは特にひどい(;´Д`)

とりあえず、エラーは出なくなりました。ありがとうございました。
うん。書いたとおりに動いた(思い通りに動かなかった)。デバッグ頑張ります。

アバター
うしお
記事: 56
登録日時: 14年前

Re: 久しぶりのプログラミング

投稿記事 by うしお » 14年前

失礼します。
文字列はいろいろと面倒ですよね×-×

boostの文字列関係のライブラリは一度触れてみる価値はあるかもしれません。
http://www.kmonos.net/alang/boost/string.html
とてもシンプルでちゃちゃっと作れます^-^

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

Re: 久しぶりのプログラミング

投稿記事 by MoNoQLoREATOR » 14年前

boostの変換機能は便利そうですね。今度からboostを使ってみようかな^^

ちなみに、思い通りに動くようになりました。これから2つ3つ機能を追加し、最後に効率化して完成!という寸法です。・・・これから追加する機能がめんどくさいんだよな~。まあ数日後には完成すると思います。