分割fileを作ってみました

double-clutch.
記事: 21
登録日時: 9年前
住所: 近畿

分割fileを作ってみました

投稿記事 by double-clutch. » 9年前

現在参考書の『応用データ構造』という項目を学習中でして、C_codeで実装できたものを
より、実用的に使いまわせるように、分割コンパイルに対応した形に直してみました。

....多分、ここで投稿している内容を含有する『標準ライブラリ』があるんだと思うのですが、
なんだか自分で書いてみたくて、作ってみました。



qeueu.h の内容...
► スポイラーを表示
qeueu.c の内容
► スポイラーを表示
擬似言語の仕様
► スポイラーを表示
擬似言語
► スポイラーを表示

アバター
みけCAT
記事: 6734
登録日時: 14年前

Re: 分割fileを作ってみました

投稿記事 by みけCAT » 9年前

qeueu…独創的な名前ですね。
また、C言語ではアンダースコアで始まる識別子は予約されており、マクロとして定義すると未定義動作になるので、使ってはいけません。

【追記】
ん…しかもよく見たらヘッダファイルじゃなくてソースファイルの方に名状しがたいインクルードガードのようなものを書いている…どういうことだ!説明しろ苗木!

【追記2】
さらによく見たら、enq()関数でQ_SIZE == p->lenの時にエラーとして判定していないので、データが壊れても気づかない可能性がありますね。
しかも、eqの更新のしかたがおかしいので、一旦何かをエンキューした後デキューして空っぽにし、再度エンキューすると、次のデキュー以降データがうまく取り出せなくなりますね。
ついでに、deteという名前も独創的ですね。

【追記3】
この擬似言語では「添字は 1 から数える」はずなのに、なんでdete[0] にデータを入れたりdete[0] のデータを取り出したりできるんだろう…?
1, 0, 2, -1, 3, -2, 4, ... みたいな数え方なのかな…?でもそれだと要素数の条件と合わなすぎるし…?
最後に編集したユーザー みけCAT on 2016年7月03日(日) 01:35 [ 編集 3 回目 ]
理由: 擬似言語におかしな所発見

double-clutch.
記事: 21
登録日時: 9年前
住所: 近畿

Re: 分割fileを作ってみました

投稿記事 by double-clutch. » 9年前

みけCAT さん...
ご返信ありがとうございます。

CODE:

変数名について::

	dete ではなく data が正しかったです。
	qeueu ではなく queue が正しかったです。

マクロ名について::

	_QEUEU_H_ の先頭のアンダースコアを取り除きます。

関数 enq()内での、構造体メンバ変数 eq の更新について::

	不要な分岐を廃し、続く文を適切な位置に移しました。

enq()関数でQ_SIZE == p->lenの時にエラーとして判定していない

	『if (Q_SIZE len) exit(1)』を『if (Q_SIZE len) exit(1)』と改めました。
ソースファイル...
► スポイラーを表示
queue.h
► スポイラーを表示
main.c
► スポイラーを表示
また、今回は『 visual studio 』ではなく、
『borland C++』のフリーソフト 『bcc32』の使用を想定してcodeを記述しています。

参考にしたサイトさん
http://www.asahi-net.or.jp/~yf8k-kbys/c14.html

...コマンドラインにて、
// bcc32 が適切にインストールされている事
// main.c queue.h queue.c があるカレントに移動している
// 上記二点が前提事項です。

bcc32 -c main.c
bcc32 -c queue.c
bcc32 -etest main.obj qeueu.obj
と入力すると、test.exe が生成されました。

この test.exe では、みけCAT さんにご指摘いただいた
『一度全てのデータがデキューして、空になった後にエンキューした場合、それらを正しくデキューできない』
という問題点は解消出来ました。

最後になりますが、具体的なご指摘ありがとうございました。
指摘されなければ、自力で気付く事は難しかったと思います。

ありがとうございました。
最後に編集したユーザー double-clutch. on 2016年7月03日(日) 23:24 [ 編集 1 回目 ]
理由: queue.h の記述が間違っていた。

アバター
みけCAT
記事: 6734
登録日時: 14年前

Re: 分割fileを作ってみました

投稿記事 by みけCAT » 9年前

それでも、QEUEU_H_とqueue.h(およびmain.c)のqeueuは残すのか…

【追記】
double-clutch. さんが書きました:bcc32 -c main.c
bcc32 -c queue.c
bcc32 -etest main.obj qeueu.obj
と入力すると、test.exe が生成されました。
これだと古い(バグがある)オブジェクトファイルをリンクしているようですね…

【追記2】
そもそも、どうしてソースファイルが一般的にはインクルードガードで使用されるような#ifndef~#endifで囲まれているのだろう…?
まさか、将来ソースファイルを直接インクルードするつもりなのだろうか…?
インクルードガードは違う翻訳単位には効かないですよ…二重定義エラーの原因になるからソースファイルのインクルードはダメですよ…

前のコメントで指摘したのに直さず全力でスルーしているし、貼られたリンク先にもこのような不自然なインクルードガードに使われる構文の使い方は無いので、
何か明確な理由にもとづいて使用しているのですよね…?
最後に編集したユーザー みけCAT on 2016年7月04日(月) 00:36 [ 編集 2 回目 ]
理由: なんでソースファイルにインクルードガードっぽいプリプロセッサ命令があるのん?

double-clutch.
記事: 21
登録日時: 9年前
住所: 近畿

Re: 分割fileを作ってみました

投稿記事 by double-clutch. » 9年前

みけCAT さん...

もう一度 サイトを確認しました。
http://www.asahi-net.or.jp/~yf8k-kbys/c14.html

自分の認識が間違っていました。

『インクルードガード』を行う必要があるのは、
ソースファイルではなく、ヘッダファイルでした。


queue.h と main.c の、qeueu, dete等の間違った構造体型名、メンバ変数名を改めました。
また、queue.c で、queue.h をインクルードするように変更し、queue.h に含まれる宣言を取り除きました。

間違いのご指摘ありがとうございました。

main.c
► スポイラーを表示
queue.h
► スポイラーを表示
queue.c
► スポイラーを表示

double-clutch.
記事: 21
登録日時: 9年前
住所: 近畿

Re: 分割fileを作ってみました

投稿記事 by double-clutch. » 8年前

flowを書いてみました。
[album]1011[/album]

追記
flow図をよく見てみたら、欠字が二箇所ほどあったり、exit()関数を実行したあとの流れがおかしかったり
していたので、修正しました。
[album]1016[/album]
最後に編集したユーザー double-clutch. on 2016年12月05日(月) 04:23 [ 編集 1 回目 ]