人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

C言語の質問です。

#include <stdio.h>
#include <dirent.h>
#include <sys/types.h>
int ScanDir (char *dir_name) {
DIR *dir_ptr;
struct dirent *ent;
if ((dir_ptr = opendir(dir_name)) == NULL) {
return(1);
}
while((ent = readdir(dir_ptr)) != NULL) {
printf("%s\n",(ent->d_name)-2);
}
closedir(dir_ptr);
return(0);
}
void main () {
ScanDir ("/usr");
}
□なせか、ディレクトリメンバーが2バイト短い値で返って くる。しかたなく-2 を入れたら正しく動くようになった。
ちなみにソラリスの最新のスタジオ10:Cコンパイラ。

この現象について、なぜ発生するのか説明をお願いします。
最近、憶測とかで回答する方が多いので
正解者のみ、ポイントを差し上げます。

※cc sample.c -I../inc -xCC -o sample

●質問者: goldman
●カテゴリ:コンピュータ インターネット
✍キーワード:CC Char Dir ent void
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● kazu1107
●35ポイント

SolarisのFAQページで以下のようなものを見つけました。

原文:http://gd.tuwien.ac.at/sun/solaris/sol2faq/Q6.19.html

訳文:http://sdc.sun.co.jp/solaris/solaris2-faq/Q6.19.html

英語には疎いのでミスリードかもしれませんけど、要するに"#include <dirent.h>"ではなく"#include <sys/dir.h>"を使えということではないでしょうか?(訳文ではsys/dir.hが見事に抜け落ちてます・・・。)

"/opt/SUNWspro/bin/cc"の方もためしてみてはいかがでしょうか?

◎質問者からの返答

なるほど、man opendir で調べてdirent.hを使ったのですが、マニュアルに誤りがある可能性があるということですね。

サンスタジオを入れるまでは、ccコマンドが使えなかったので、たぶん"/opt/SUNWspro/bin/cc"だと思うのですが

確認は必要かもしれませんね。明日試してみます。


2 ● POPO
●35ポイント

マニュアルが間違ってるわけでは無いです。

SolarisはSVR4互換ですが、BSD互換ライブラリというものも入っています。(libucb.a,libucb.so)

BSD互換ライブラリはその名のとおりBSD版UNIX用に作られたソフトをコンパイルして動かすために存在しています。

SVR4互換の標準libcにもBSD互換ライブラリにも両方に同じreaddir()という関数が入っていますが、使用するdirent構造体の定義は異なっているのです。

正しく動かない理由はリンクされたreaddirはBSD互換ライブラリのバイナリなのに、構造体定義は標準libcのモノになっていて噛みあわないためでしょう。

sys/dir.hはBSD互換ライブラリ用です。

dirent.hはSVR4互換(というかPOSIX標準というべきか)

まずは環境変数PATHを調べて/usr/ucbが入っていたら外すか、サンスタジオの標準コンパイラのパスより後ろにもって行くかする必要があります。

基本的にはdirent.hで正しく動く環境を作るべきで、BSD互換ライブラリは使わないのが正解です。(後々他のOSにプログラムを移植したりするのに苦労します)

◎質問者からの返答

なるほど。dirent.h はそのままで正しいということですね。

BSD版は使わないようにします。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ