リングバッファの数値の入出力についての質問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Toshita
記事: 23
登録日時: 8年前

リングバッファの数値の入出力についての質問

#1

投稿記事 by Toshita » 8年前

入力された整数をキューに順次格納していって、0が入力されたときに終了し、
キューから順次取り出して表示するプログラムのつもりで書きました。
(教科書からちょいちょいソースぱくってます。)
例)
INPUT : 1 2 3 0
OUTPUT : 1 2 3

どうしても、数字の入出力場所が自分でかいときながら、どういう仕組みなのかいまいち理解できません。
とりあえず、大学でやってるようにwhileでループさせて、0きたら終了的なことをやっているのですが、
データを取り出すときに、現在位置をどこにあてれば綺麗にとりだせるのでしょうか?
とりあえずinitで初期化させてとりだそうとするのですが、やり方がまずいのか、errorに突っ込んでいきます。;;


コード:

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>

typedef int ELEM;               /*待ち行列の要素の型*/
#define QUEUE_SIZE 100          /*待ち行列の大きさ*/

ELEM    queue[QUEUE_SIZE];      /*待ち行列の定義*/
int     front;                  /*待ち行列の先頭*/
int     rear;                   /*待ち行列の末尾*/

#define next(a) ( ((a)+1) % QUEUE_SIZE) //次の要素の添字を求める

/*エラー処理*/
void error(){
        printf("stderr");
        exit(1);
}

/*待ち行列の初期化*/
void init(){
        front = rear = 0;
}

/*待ち行列にデータを入れる*/
void enqueue(ELEM x){        /*訂正部分*/
        if(next(rear) == front) error("待ち行列がフル状態のため、要素が入りません。");
        queue[rear] = x;
        rear = next(rear);
}

/*待ち行列からデータを取り出す*/
ELEM dequeue(){
        ELEM x;
        if(front == rear) error("待ち行列が空状態のため、要素を取り出せません。");
        x = queue[front];
        front = next(front);
        return x;
}

/*待ち行列が空かどうかを調べる*/
/*空なら1,空でなければ0を返す*/
int empty(){
        return front == rear;
}
int main(void){
        int a,i;
        init();                         /*初期化*/
        do{
                scanf("%d",&a);
                enqueue(a);
                i++;
        }while(a != 0);
        init();
        do{
                printf("%d",dequeue(a));
                i--;
        }while(i != 0);
}
最後に編集したユーザー Toshita on 2015年11月14日(土) 17:58 [ 編集 5 回目 ]

box
記事: 2002
登録日時: 13年前

Re: 教えてリングバッファ

#2

投稿記事 by box » 8年前

Toshita さんが書きました:

コード:

void enqueu(ELEM x){
                enqueue(a);
呼び出している関数が
enqueue
であるのに、実体は
enqueu
だからです。

ただし、このエラーはリングバッファーとは何の関係もありません。
関数の名前をちゃんとしたからといって、プログラムが思ったとおりに
動くかどうかは、また別の話です。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Toshita
記事: 23
登録日時: 8年前

Re: 教えてリングバッファ

#3

投稿記事 by Toshita » 8年前

ずっとプログラムとにらめっこしてたのにきづきませんでした・・・。
素早い回答有難うございます。

閉鎖

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