>>4398 68user 1093.txtのソースは何故か警告が出ることも無く、コンパイル出来ました。 定義を二回していますので、仰るとおり何か言われてもおかしくないと思われますが。 ちなみに下記はエラーが出ません。 #include <stdio.h> int a; int a = 10; int main(void) { printf("a = %d\n", a); return 0; } ただし下記はエラーが出ます。 #include <stdio.h> int main(void) { int a; int a = 10; printf("a = %d\n", a); return 0; } 上記の結果をみると、グローバルでは複数定義してもかまわないのかもしれません。 それと、本来は定義 codelist_t class_list[] = {...} をmain.cに書いて、 宣言 extern codelist_t class_list[]; を sub.c に書くのかも知れません。 ただ、そういたしますと、どうヘッダで一元管理すれば良いか思いつきませんでした。 修正した所 ・ soa_record_print の引数 ・ codelist_t を auto から static に変更しました。 static はどうしても値を保持し続けておかないといけない物以外には 使う必要がないと思ってました。 auto なら不要になったら解放されますし。 メモリ領域は、よく分かってないので勉強になります。 ・ main 部分を preprocessing(); … 前処理 make_query(); … 照会用の DNS パケットを作成 send_query(); … DNS サーバに問い合わせを送信 receive_response(); … DNS サーバからの応答を受信 parse_response(); … DNS サーバからの応答を解析 に集約しました。 分からなかった所 ・strcasecmp は、「大文字/小文字を無視して二つの文字列を比較する」そうですが、 私のソースでどうすれば有効活用出来るか分かりませんでしたので、使用しておりません。 それと Makefile のサンプルありがとうございません。 その記述で動作することを確認しました。 その書き方ですと、ソースファイルが増えても OBJS に追加するだけで良いので、 大変助かりました。 現状のソース(linux版(1ソース版)) http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1101.txt 上記のソースは今までと少し動作が違いまして、 【実行ファイル DNSサーバ 名前解決ホスト名】 と入力しますと、回答が得られるまで名前解決を行います。 現状の問題点 ・ リソースデータがドメイン名だけで、IPアドレスの情報が無いと名前解決が出来ない。 例) 198.41.0.4 www.livedoor.co.jp zns05.data-hotel.net と zns06.data-hotel.net しか返してくれません。 get_domain(); で、ドメイン名のラベルの部分を出力し、 print_domain(); で【.】を出力し、 ドメイン名の終端に達するまで両関数間を行ったりきたりしているのが原因です。 DNS サーバが IP アドレスでしたら、 a_record_print(); で姑息に sprintf で抜き出せたのですが。 そう考えますと、以前仰られていた > あと、hoge_print 関数も、わたしはこういう書き方をせずに > char *a_record_print(int_buf, search); > と文字列を返すほうですが、メモリ確保を行うのは呼び出し側か、関数の > 中で static に持つか、など悩ましいです。すっぱり割り切って関数内で > printf するのも、保守性はともかく可読性は悪くない、と思いました。 の部分が非常に重要かなと思いました。 文字列を上位に返すようにしていれば、流用もしやすかったのかなと。 そういう部分も保守性なのかなと思いました。 |