• ベストアンサー

コンパイルエラー

前に質問したものですが、ちょっとソースをいじりました。 ファイルから読み込んだデータ文字列をキゅーにエンキゅーしたりできゆーしたりするプログラムを作っています。 コンパイルできて実行できました。 でもエンキューとデキューが実行されてません。 次のソースのうちどこを変えたらいいか教えてください #include <stdio.h> #include <stdlib.h> #include <string.h> #define NUMBER 100 /*--- キューを実現する構造体 ---*/ typedef struct { int max; /* キューのサイズ */ int num; /* 現在の要素数 */ int front; /* 先頭要素カーソル */ int rear; /* 末尾要素カーソル */ char (*que)[NUMBER]; /* キュー(の先頭要素へのポインタ) */ } Queue; /*--- キューの初期化 ---*/ int QueueAlloc(Queue *q, int max) { q->num = q->front = q->rear = 0; if ((q->que = calloc(max*20, sizeof(char))) == NULL) { q->max = 0; /* 配列の確保に失敗 */ return (-1); } q->max = max; return (0); } //--- キューの後始末 --- void QueueFree(Queue *q) { if (q->que != NULL) { free(q->que); // 配列を解放 q->max = q->num = q->front = q->rear = 0; } } /*--- キューにデータをエンキュー ---*/ int QueueEnque(Queue *q, char *buffer) { if (q->num >= q->max) return (-1); /* キューは満杯 */ else { q->num++; strcpy(q->que[q->rear++] ,&buffer[0]); if (q->rear == q->max) q->rear = 0; return (0); } } /*--- キューからデータをデキュー ---*/ int QueueDeque(Queue *q, char *buffer) { if (q->num <= 0) /* キューは空 */ return (-1); else { q->num--; strcpy(&buffer[0],q->que[q->front++]); if (q->front == q->max) q->front = 0; return (0); } } /*--- キューの大きさ ---*/ int QueueSize(const Queue *q) { return (q->max); } /*--- キューに蓄えられているデータ数 ---*/ int QueueNo(const Queue *q) { return (q->num); } /*--- キューは空か ---*/ int QueueIsEmpty(const Queue *q) { return (q->num <= 0); } /*--- キューは満杯か ---*/ int QueueIsFull(const Queue *q) { return (q->num >= q->max); } int main(void) { int i=0,j=0,ret; char buffer[20]; FILE *fpin; Queue que; double ab,ac; char aa[10]; fpin=fopen("input2.txt","r"); //テキストファイルを読み取りモードで開く if (QueueAlloc(&que, 100) == -1) { puts("キューの確保に失敗しました。"); return (1); } while (1) { int m, x; printf("現在のデータ数:%d/%d\n", QueueNo(&que), QueueSize(&que)); printf("(1) エンキュー (2) デキュー (0) 終了:"); scanf("%d", &m); if (m == 0) break; switch (m) { case 1: if(fgets(&buffer[0],sizeof(buffer),fpin) ==NULL) { puts("もう読み込むデータがありません"); goto END; } printf("データ:%s",&buffer[0]); if (QueueEnque(&que, buffer) == -1) puts("データのエンキューに失敗しました。"); break; case 2: if (QueueDeque(&que, buffer) == -1) puts("デキューできません。"); else { printf("デキューしたデータは%d。\n", &buffer[0]); break; } } } END: QueueFree(&que); fclose(fpin); return (0); }

質問者が選んだベストアンサー

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.4

/*--- キューを実現する構造体 ---*/ typedef struct { int max; /* キューのサイズ */ int num; /* 現在の要素数 */ int front; /* 先頭要素カーソル */ int rear; /* 末尾要素カーソル */ char *que[NUMBER]; /* キューへのポインタ */ } Queue; /*--- キューの初期化 ---*/ int QueueAlloc(Queue *q, int max) { int i; q->num = q->front = q->rear = 0; if (max > NUMBER) { q->max = 0; return (-1); } for (i = 0; i < max; i++) { if ((q->que[i] = calloc(20, sizeof(char))) == NULL) { q->max = 0; /* 配列の確保に失敗 */ return (-1); } } q->max = max; return (0); } //--- キューの後始末 --- void QueueFree(Queue *q) { int i; for (i = 0; i < q->max; i++) { if (q->que[i] != NULL) { free(q->que[i]); // 配列を解放 q->que[i] = NULL; } } q->max = q->num = q->front = q->rear = 0; } 私ならこうします

hiro3932
質問者

お礼

プログラムソースありがとうございます。 /*--- キューの初期化 ---*/の部分とか違いますね。 参考にします。 どうも。

その他の回答 (4)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.5

投稿のタイトルは「コンパイルエラー」ですね。 > コンパイルできて実行できました。 矛盾してますよ。

hiro3932
質問者

お礼

すみません。 間違えてしまいました…。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

QueueAlloc の calloc は論理的に間違ってます. 「20」という値はどこから出てきましたか? もちろん「論理的に間違っている」だけなのでプログラムの動作に影響しないこともありますが, 影響が出るようだと「原因を非常に特定しにくい」やっかいなバグです.

hiro3932
質問者

お礼

回答ありがとうございます。 確かになんで20って数字が出てきたんだろう・・・ 直してみます。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

printf("デキューしたデータは%d。\n", &buffer[0]); は printf("デキューしたデータは%s。\n", &buffer[0]); でしょうね

hiro3932
質問者

お礼

回答ありがとうございます。 初歩的なミスを… おかげでちゃんと実行できました。

  • precog
  • ベストアンサー率22% (966/4314)
回答No.1

具体的にはどう動くんですか?

hiro3932
質問者

お礼

実行結果はこんな感じです。 現在のデータ数:0/100 (1) エンキュー (2) デキュー (0) 終了:1 データ:Tom 75 60 現在のデータ数:1/100 (1) エンキュー (2) デキュー (0) 終了:1 データ:Jerry 85 90 現在のデータ数:2/100 (1) エンキュー (2) デキュー (0) 終了:1 データ:Spike 45 30 現在のデータ数:3/100 (1) エンキュー (2) デキュー (0) 終了:1 データ:Rachel 55 85 現在のデータ数:4/100 (1) エンキュー (2) デキュー (0) 終了:1 データ:Monica 75 90 現在のデータ数:5/100 (1) エンキュー (2) デキュー (0) 終了:1 データ:Phoebe 80 75 現在のデータ数:6/100 (1) エンキュー (2) デキュー (0) 終了:1 データ:Chandler 70 65 現在のデータ数:7/100 (1) エンキュー (2) デキュー (0) 終了:2 デキューしたデータはTom 75 60 。 現在のデータ数:6/100 (1) エンキュー (2) デキュー (0) 終了:2 デキューしたデータはJerry 85 90 。 現在のデータ数:5/100 (1) エンキュー (2) デキュー (0) 終了:2 デキューしたデータはSpike 45 30 。 現在のデータ数:4/100 (1) エンキュー (2) デキュー (0) 終了:2 デキューしたデータはRachel 55 85 。 現在のデータ数:3/100 (1) エンキュー (2) デキュー (0) 終了:2 デキューしたデータはMonica 75 90 。 現在のデータ数:2/100 (1) エンキュー (2) デキュー (0) 終了:2 デキューしたデータはPhoebe 80 75 。 現在のデータ数:1/100 (1) エンキュー (2) デキュー (0) 終了:2 デキューしたデータはChandler 70 65 。 現在のデータ数:0/100 (1) エンキュー (2) デキュー (0) 終了:2 デキューできません。

関連するQ&A

専門家に質問してみよう