![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
C言語で、
キュー構造を作りたいのですが、うまくできません。
途中まで作ったのですが、うまく動きませんでした。
EnqueueやDequeueでデータの出し入れをするのですが、そのままではデータを取り出したときにデータが先頭に来ないので、refreshで先頭に持ってくるようにプログラムを組みました。
-----------------------------------------------------
#include<stdio.h>
#define MAXQUEUE 10
typedef struct queue{
int head, tail;
char entry[MAXQUEUE];
} Queue;
//キュー構造にデータを入れる。
void Enqueue(char item,Queue *q){
q->entry[q->tail]=item;
q->tail++;
}
//キュー構造からデータを取り出す。
void Dequeue(char *item,Queue *q){
*item=q->entry[q->head];
q->head++;
}
//キュー構造内のデータを先頭にずらす。
void refresh(Queue *q){
while(q->head==0){
q->entry[q->head-1]=q->entry[q->head];
q->head--;
q->tail--;
}
}
void main(){
Queue qu;
Enqueue('w1',&qu);
Enqueue('w2',&qu);
Enqueue('w3',&qu);
Enqueue('w4',&qu);
Dequeue(&qu,&qu);
Dequeue(&qu,&qu);
refresh(&qu);
}
----------------------------------------------------------------
mainからEnqueueやDequeueを呼び出すときに、引数として何を渡せばいいのでしょうか?構造体をそのまま渡してみたのですが、「error C2664: 'Dequeue' : 1 番目の引数を 'Queue *' から 'char *' に変換できません。(新しい機能 ; ヘルプを参照)
指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。」というエラーを吐いてしまいます。
分かりづらい説明で申し訳御座いませんが、ご回答宜しくお願いいたします。
No.3ベストアンサー
- 回答日時:
ANo.2 = Interest です。
ここじゃあソースコード読みずらかったですね。ここを読んでもらった方が早いことに気付きました。
http://www.nurs.or.jp/~sug/soft/super/fifo.htm
No.2
- 回答日時:
参考までに。
私が昔作ったFIFO(=Queue)のソースをUpします。// fifo.h ------------------------------------------------------
/// 定数の定義
#define FIFO_OK0// 成功
#defineFIFO_ERROR_FATAL-1// 復旧できない深刻なエラー
#define FIFO_ERROR_NULL_POINTERR-2// 無効なポインタ
#define FIFO_ERROR_BUFFSIZE-3// バッファサイズ不足
#define FIFO_ERROR_EMPTY-4// データが空
/// データ構造の定義
typedef struct{
intrp;// 書き込み位置
intwp;// 読み出し位置
char*buffer;// データ保存領域へのポインタ
shortbufferSize;// データ保存領域の大きさ
}FIFO;
/// プロトタイプ宣言
int FIFO_init(FIFO *buf, short size, char *bufTop);
int FIFO_put(FIFO *buf, char c);
int FIFO_get(FIFO *buf, char *c);
int FIFO_isEmpty(FIFO *buf);
int FIFO_clear(FIFO *buf);
// fifo.c -----------------------------------------------------
/**
FIFOを初期化する。
@parambufFIFOのデータ構造へのポインタ
@param[in]sizeFIFOのバッファサイズ(バイト数)
@param[in]bufTopデータ保存領域の先頭アドレス
@retval FIFO_OK (0)成功
@retvalFIFO_ERROR_FATAL (-1)復旧できない深刻なエラー
@retvalFIFO_ERROR_NULL_POINTERR (-2)無効なポインタ
@retval FIFO_ERROR_BUFFSIZE(-3)バッファサイズ不足
*/
int FIFO_init(FIFO *buf, short size, char *bufTop)
{
if( NULL == buf || NULL == bufTop ){
return FIFO_ERROR_NULL_POINTERR;
}
if( 0 >= size ){
return FIFO_ERROR_BUFFSIZE;
}
buf->rp = 0;
buf->wp = 0;
/*
if( NULL == buf->buffer ){
// バッファ用メモリをヒープ領域から確保する。
buf->buffer = (char *)malloc( size * sizeof(char) );
if( NULL == buf->buffer ){
// メモリを確保できない場合、深刻なエラーとして処理を抜ける。
return FIFO_ERROR_FATAL;
}
}
*/
buf->buffer = bufTop;
buf->buffer[0] = '\0';
buf->bufferSize = size;
return FIFO_OK;
}
/**
FIFO にデータを一つ入れる。
@parambufFIFOのデータ構造へのポインタ
@param[in]c入れるデータ
@retvalFIFO_OK (0) 正常終了
@retvalFIFO_ERROR_NULL_POINTERR (-2)無効なポインタ
@retval FIFO_ERROR_BUFFSIZE(-3)バッファサイズ不足
@noteバッファが満杯になったら古いデータから落としていく。
*/
int FIFO_put(FIFO *buf, char c)
{
intwp, rp, next;
if( NULL == buf ){
return FIFO_ERROR_NULL_POINTERR;
}
if( NULL == buf->buffer ){
return FIFO_ERROR_NULL_POINTERR;
}
if( 0 == buf->bufferSize ){
return FIFO_ERROR_BUFFSIZE;
}
wp = buf->wp;
next = (wp + 1) % (buf->bufferSize);
// バッファが満杯なら読み出し位置を1つ進めて古いデータから落としていく。
if( next == buf->rp ){
rp = buf->rp;
buf->rp = (rp + 1) % (buf->bufferSize);
}
buf->buffer[ wp ] = c;
// 次の書き込み位置を更新する。
// 書き込み位置がバッファの末尾まできたら先頭に戻る。
buf->wp = next;
return FIFO_OK;
}
/**
FIFOからデータを取り出す。
@param[in]bufFIFOのデータ構造へのポインタ
@param[out]c取り出したデータを格納する領域へのポインタ
@retvalFIFO_OK (0) 正常終了
@retvalFIFO_ERROR_NULL_POINTERR (-2)無効なポインタ
@retvalFIFO_ERROR_EMPTY (-4)FIFOが空
*/
int FIFO_get(FIFO *buf, char *c)
{
intrp;
if(NULL == buf){
return FIFO_ERROR_NULL_POINTERR;
}
if(NULL == c){
return FIFO_ERROR_NULL_POINTERR;
}
rp = buf->rp;
if( FIFO_isEmpty(buf) ){
return FIFO_ERROR_EMPTY;
}
else{
*c = buf->buffer[rp];
// 次の読み込み位置を更新する。
// 読み込み位置がバッファの末尾まできたら先頭に戻る。
buf->rp = (rp + 1) % (buf->bufferSize);
return FIFO_OK;
}
}
/**
FIFOが空なら 1 を返す。
@param[in]bufFIFOのデータ構造へのポインタ
@retval1バッファは空
@retval0データが入っている
*/
int FIFO_isEmpty(FIFO *buf)
{
// rp == wp はバッファが空であることを意味する。
return (buf->rp == buf->wp) ? 1 : 0;
}
/**
FIFOのバッファをクリアする。
@param[in]bufFIFOのデータ構造へのポインタ
@retvalFIFO_OK (0) 正常終了
@retvalFIFO_ERROR_NULL_POINTERR (-2)無効なポインタ
*/
int FIFO_clear(FIFO *buf)
{
if( NULL == buf || NULL == buf->buffer ){
return FIFO_ERROR_NULL_POINTERR;
}
buf->rp = 0;
buf->wp = 0;
return FIFO_OK;
}
No.1
- 回答日時:
ざっと見た所感を述べます。
指摘1
初期化してください。
C言語の場合、初期化しないと
どんな値が入っているか分かりません。
×
Queue qu; /* 不定のまま */
○
Queue qu = {0}; /* 全部0 */
○
Queue qu; /* 不定のまま */
memset(&qu, 0, sizeof(qu)); /* 全部0 */
これをすることでrefresh関数もいらなく
なるかと。
指摘2
宣言が
void Enqueue(char item,Queue *q)
なのに、
Enqueue('w1',&qu);
というのは変です。
普通 char というと、半角1文字のことをいうので。
Enqueue('a', &qu);
という感じになると思います。
指摘3
宣言が
void Dequeue(char *item,Queue *q)
ということは、第1引数は、
char の変数のアドレスを渡せ、ということです
つまりこのように使います
char a = 0;
Dequeue(&a, &qu);
・・・
以上、参考になれば。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列の途中から途中までを抽出
-
C言語で文字列置き換え
-
文字列での代入 (C言語)
-
CStringからchar*への型変換に...
-
isalpha()関数について
-
char配列とcharポインタ
-
char *name1[4] とchar name2[]...
-
ポインタのキャスト
-
計算機言語(C言語)の課題です。
-
C,C++のsizeof演算子の仕様につ...
-
C++17で、unsigned char * 配列...
-
char *str; と char* str;
-
文字列の反転
-
入力された文字列の中の数字を...
-
関数の動作説明
-
VBAのプログラムで、DIAG = 1# ...
-
VBA基本構文の作り方 2列の...
-
malloc でのメモリ取得状況の可...
-
C言語 配列の再初期化
-
C言語 ファイルの指定された行...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のintとcharの違いってな...
-
char*を初期化したいのですが
-
C言語にて構造体のメンバがNULL...
-
CStringからchar*への型変換に...
-
strcat関数を自作したいです
-
new charとnew char[N]の違いは?
-
csvファイルをfscanfで読み込む...
-
char型にint型の数値を代入する。
-
動的メモリの初期化方法について。
-
C言語で文字列をかえす正しい書...
-
文字列str内の全ての数字を...
-
char 文字列型 の表現範囲が-12...
-
DWORDとcharの変換
-
fstream型オブジェクトを関数の...
-
小数点入りの文字列をfloat型に...
-
C言語のプログラムについてです
-
const char* s1とただのchar s1...
-
文字列内の数字削除
-
c言語でポインタ変数を用いた配...
-
szとlpszの違い
おすすめ情報