文字列列挙で

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

文字列列挙で

#1

投稿記事 by polpol » 14年前

このサンプルを参考に→http://homepage2.nifty.com/natupaji/DxL ... am.html#N6
文字列列挙方法を学んでいるのですが

#define MOJI_SIZE 24

// 仮想テキストバッファの横サイズ縦サイズ
#define STRBUF_WIDTH 24
#define STRBUF_HEIGHT 20
char StringBuf[ STRBUF_HEIGHT ][ STRBUF_WIDTH * 2 + 1 ] ;
int CursorX = 0 , CursorY = 0 ; // 仮想画面上での文字表示カーソルの位置
int SP , CP ;
char OneMojiBuf[ 3 ] ; // 1文字分一時記憶配列
ch[5][256]={
"プログラムを習得するに@は、実際に自分で書いてみることが大事。",
"参考書を読むことも重要だが、数学のように演習を通して、",
"体に身につけるようにしよう。",
"きっと、よりはっきりと、関数の使い方、",
"プログラムの書き方がわかるだろう。"
};
while(!ProcessMessage() && !ClearDrawScreen() && !GetHitKeyStateAll( Key ) && !Key[KEY_INPUT_ESCAPE]){

// 1文字分抜き出す
OneMojiBuf[ 0 ] = ch[ SP ][ CP ] ;
OneMojiBuf[ 1 ] = ch[ SP ][ CP + 1 ] ;
OneMojiBuf[ 2 ] = '\0' ;

StringBuf[ CursorY ][ CursorX] = OneMojiBuf[ 0 ] ;
StringBuf[ CursorY ][ CursorX+ 1 ] = OneMojiBuf[ 1 ] ;

// テキストバッファの描画
for( i = 0 ; i < STRBUF_HEIGHT ; i ++ )
{
DrawString( 8 , i * MOJI_SIZE , StringBuf[ i ] , GetColor( 255 , 255 , 255 ) ) ;
}



CP ++ ;

CursorX ++ ;
if(ch[ SP ][ CP ]=='\0') {
SP ++ ;CursorY++ ;CP=0 ;CursorX=0 ;}
}
上のように書いて"実際に自分で書いてみることが大事という"部分が一度描画されてその上から
次の文の"参考書を読むことも重要だが・・・"の文が描画され上書きされてしまいます。
改行後にも"参考書を読むことも重要だが・・・"という文が2回連続で来てしまいます
なぜこうなるのかご教授願います

polpol

Re: 文字列列挙で

#2

投稿記事 by polpol » 14年前

http://homepage2.nifty.com/natupaji/DxL ... m.html#N20
↑のサンプルで
StringBuf[ CursorY ][ CursorX * 2 ] = OneMojiBuf[ 0 ] ;
StringBuf[ CursorY ][ CursorX * 2 + 1 ] = OneMojiBuf[ 1 ] ;
の* 2 を消すと文字化けして同じようなバグになります。
(ここでなぜ* 2 を付けるのかよくわかりません。付ける理由も教えて頂けたらと思います。)

polpol

Re: 文字列列挙で

#3

投稿記事 by polpol » 14年前

失礼しました・・・
まだトピック立ててはいけないんですね・・・
問題があるならこのトピ消してもらっていいです
申し訳ない

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

Re: 文字列列挙で

#4

投稿記事 by Dixq (管理人) » 14年前

> polpolさん

もう少し解りやすく書けばよかったですね、長文で解りにくかったと思います、すみません。
記事の分散を避けたい意図があったのですが、過去ログ変換には影響無いので書き込みして下さって大丈夫です。

アバター
ゆーずぃ
記事: 62
登録日時: 14年前
住所: 埼玉県

Re: 文字列列挙で

#5

投稿記事 by ゆーずぃ » 14年前

>という文が2回連続で来てしまいます
多分ここに載ってない部分で、SPをどこかでマイナスしてる。
そんなに長くなければ全掲載して下さいm(__)m

>(ここでなぜ* 2 を付けるのかよくわかりません。付ける理由も教えて頂けたらと思います。)
英数字は1文字1バイト、日本語は1文字2バイトだからです。上半身と下半身で一つの人間なのに、別々で扱ったら二目と見れない姿(文字化け)になるということです。

polpol

Re: 文字列列挙で

#6

投稿記事 by polpol » 14年前

ゆーずいさん返答ありがとうございます。
どうやらSTRBUF_WIDTHの初期値が短かったらしく、STRBUF_WIDTH 24→240
とすれば直りました。
>英数字は1文字1バイト、日本語は1文字2バイトだからです
なるほど。英数字が入れば*2としないと文字化けするんですね。
2通りで場合分けしないといけないようですね
勉強になりました。解決しました
ありがとうございます。

閉鎖

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