【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.23063

リングバッファのやり方と表示のやり方について
投稿者---初心者(2005/09/14 15:12:40)


リングバッファ char ring_Buf[256]に char Buf[7]のデータを書き込みます。
そして、ループ内で、
printfを使ってring_Buf[0]〜ring_Buf[6]の7文字を表示し
次からはring_Buf[7]〜ring_Buf[13]の7文字という風に
ring_Buf内の文字を7文字ずつ順番に表示していくプログラムはどうすれば良いのでしょうか。

それと、リングバッファのやり方で、
例えばring_Buf[256]あったして、そこにデータBuf[7]を書き込んでいくときに最後のring_Buf[256]になった時に、
剰余算の%256を使って余りが0ならring_Buf[0]に戻って書き込みを続けていくというような処理ができると聞きました。
if文を使わないので処理が重たくならないと言われました。
そのようなやり方は、どうすればいいのでしょうか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:リングバッファのやり方と表示のやり方について 23066 DD. 2005/09/14 16:18:36
<子記事> Re:リングバッファのやり方と表示のやり方について 23102 tetrapod 2005/09/15 12:48:34


No.23066

Re:リングバッファのやり方と表示のやり方について
投稿者---DD.(2005/09/14 16:18:36)


%256 することで、256で割った余りを求めますので
0〜255 までを繰り返すことになります。

ただ、ループで文字列を表示し続け、%256 してしまうと、
永遠と繰り返し、文字列を表示するだけになってしまうと思いますが。

ループ内で7文字づつずらして表示するだけならば、
+7づつ加算するカウントでもつければいいかと思います。



この投稿にコメントする

削除パスワード

No.23069

Re:リングバッファのやり方と表示のやり方について
投稿者---初心者(2005/09/14 16:46:22)


>%256 することで、256で割った余りを求めますので
>0〜255 までを繰り返すことになります。

プログラムで
for(i=0, j=0; i<=256; i++, j++){
if(Buf[i] == '?0') break;
ring_Buf[i] = Buf[j];
}
j=0;

と書いているのですが、ここでどのように%256を使ったらいいのでしょうか?
for文を使わないで書けるのでしょうか?

>ループ内で7文字づつずらして表示するだけならば、
>+7づつ加算するカウントでもつければいいかと思います。

プログラムでは、printfを使って
printf("Received:%s?n", ConvPrintableString(ring_Buf));
と書いています。

ConvPrintableString関数は受信した文字列が2バイトかどうかをチェックする関数です。

/* 文字列の加工 */
static LPSTR ConvPrintableString(LPSTR Buf_word)
{
LPSTR p;
for(p = Buf_word; *p; p++) {
if(IsDBCSLeadByte(*(BYTE*)p) && p+1)//2バイト文字かの判断
p++;
else if(!isprint(*p))//制御コードなどが混じっていたら"_"に変換
*p = '_';
}
return Buf_word;
}

printf("Received:%s?n", ConvPrintableString(ring_Buf));の部分をどのようにすればいいのでしょうか?


この投稿にコメントする

削除パスワード

No.23092

Re:リングバッファのやり方と表示のやり方について
投稿者---DD.(2005/09/14 21:07:23)


>と書いているのですが、ここでどのように%256を使ったらいいのでしょう>か?
255 までしかループしていないので、%256 を使う必要性はないぽいです。
for 文の判定が i < 256より大きい数 であるならば意味はあると思いますが。

>for文を使わないで書けるのでしょうか?
質問の内容的にループは必要だと思います。

>>ループ内で7文字づつずらして表示するだけならば、
>>+7づつ加算するカウントでもつければいいかと思います。
cnt = 0 に初期化。
文字列の先頭から7文字分を表示。
cnt += 7
文字列の cnt 番目から7文字分を表示。
cnt += 7
文字列の cnt 番目から7文字分を表示。
etc...
な、かんじで。



この投稿にコメントする

削除パスワード

No.23102

Re:リングバッファのやり方と表示のやり方について
投稿者---tetrapod(2005/09/15 12:48:34)


簡単な producer-consumer パターンなんかでよく使いますね > ringbuffer
こんなのとか。
struct ring_buffer {
    size_t put_point;
    size_t get_point;
    char ring[256];
};

int put_data(struct ring_buffer *r, char c) {
    r->ring[r->put_point]=c;
    r->put_point=(r->put_point+1)&255;
    return 0;
}

int get_data(struct ring_buffer *r, char* c) {
    *c=r->ring[r->get_point];
    r->get_point=(r->get_point+1)&255;
    return 0;
}

初期化やエラーチェックの類をわざと省略してあるので、動きを理解した上で修正してみてください。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧