アプリ版:「スタンプのみでお礼する」機能のリリースについて

当方C初心者です。シリアルポートからデータを取得するプログラムを模索中です

で、みつけたサンプルプログラムをMicrosoft Visual Studio .net 2003でコンパイルしたところ
c:\documents and settings\デスクトップ\source1.c(5): fatal error C1083: インクルード ファイルを開けません。'dir.h': No such file or directory

と出てきます。インクルードファイルdir.hはMicrosoft Visual Studio .net 2003にはないということなのでしょうか、どのように対処すればようのでしょうか、、


ご存知の方お教えください。よろしくお願いします

A 回答 (4件)

日本語を無視して英語のエラーメッセージを見れば一目瞭然!


'dir.h'というインクルードファイルが見つからないということです。

まず、デスクトップにソースファイルを作らないで、
C:\Project\sample\hoge.c
のように、スペースや日本語を含まないパス名にサンプルをコピーしてでコンパイルが通るか試してみる。

それでダメならば・・・

'dir.h'がユーザが定義したファイルでない(ソースパスに存在しない)
ならば、通常のWindowsでは使わない(関数のプロトタイプなどが定義してある)(あるいは、このバージョンから使わないことになった)ファイルだとおもわれます。

ということで・・・
もしユーザ定義ファイルなら
#include <dir.h>
となっていたら
#include "dir.h"
とか、して様子をみる。
あるいはソースパスからインクルードファイルを検索するように設定されているか確認してみる。

もしユーザ定義ファイル「ではない」なら
とりあえず、エラーメッセージをクリックしてソースコードを開いて・・・
/*
#include <dir.h>
*/
とかいうふうにコメントアウトして、どんなコンパイルエラーが増えるか様子をみてみるとか。
で、(プロトタイプがないとか、未定義の関数なんてかんじの)コンパイルエラーがあったら、何をする関数かしらべて、類似する関数があるかどうかなどを調べて移植の方針を決定すると。

この回答への補足

ありがとうございます、

/*
#include <dir.h>
*/
にしてみると、下記のようなエラーが出てきました。

c:\serial\Source1.c(38) : error C2079: 'first' が 未定義の struct 'ffblk' で使用しています。
c:\serial\Source1.c(79) : warning C4013: 関数 'outportb' は定義されていません。int 型の値を返す外部関数と見なします。
c:\serial\Source1.c(80) : warning C4013: 関数 'inportb' は定義されていません。int 型の値を返す外部関数と見なします。
c:\serial\Source1.c(86) : warning C4013: 関数 'inport' は定義されていません。int 型の値を返す外部関数と見なします。
c:\serial\Source1.c(90) : warning C4013: 関数 'findfirst' は定義されていません。int 型の値を返す外部関数と見なします。
c:\serial\Source1.c(94) : error C2224: '.ff_fsize' : 左側が構造体、共用体ではありません。
c:\serial\Source1.c(94) : warning C4047: '関数' : 間接参照のレベルが 'int' と 'unsigned char [8]' で異なっています。
c:\serial\Source1.c(94) : warning C4047: '関数' : 間接参照のレベルが 'char *' と 'int' で異なっています。
c:\serial\Source1.c(94) : error C2198: 'itoa' : 関数へのポインタを通して実行される呼び出しに対する引数が少なすぎます。
c:\serial\Source1.c(101) : error C2224: '.ff_fsize' : 左側が構造体、共用体ではありません。
c:\serial\Source1.c(114) : error C2224: '.ff_fsize' : 左側が構造体、共用体ではありません。
c:\serial\Source1.c(138) : warning C4047: '!=' : 間接参照のレベルが 'int' と 'void *' で異なっています。


関数 'outportb' は定義されていません というのは、dir.hがないせいでしょうか、なければ移植しないといけないのでしょうか?移植というのは、他の関数を適用するということでしょうか?また、移植というのはどのようにすればいいのでしょうか?


#include "dir.h"としても、エラーの表示内容は変わりませんでした。


初心者につき、初歩的なことを聞いてしまっているかもしれませんが、よろしくお願いします。

補足日時:2005/08/26 18:11
    • good
    • 0

移植という言葉は「機能しない個所を機能するモノに置き換える」ということです。

英語ではportingです。
よく新聞やテレビで臓器移植なんていうふうに移植という言葉を使っているでしょう。

さて、エラーメッセージで注目するのは「関数 'hogehoge' は定義されていません。int 型の値を返す外部関数と見なします。」のようになっているところです。
'hogehoge'という名前の関数がライブラリには存在していないと思われるので、代用できる関数を探すか、'hogehoge'を自力で用意するかのいずれかの作業がないかぎり、コンパイルすら出来ないということです。

ここでは、エラーメッセージより'outportb' 'inportb' 'inport' 'findfirst'という名前の関数がどんな働きをするはずだったかを調べるて、代替となる関数を作るということになります。

が・・・
こういった移植作業は初心者には難易度が高いです。

話を少し変えて、回答No.3で指摘されてるようにPOSIX規格の関数であるならばRedHut Cygwin環境 http://sources.redhat.com/cygwin/ と併用するのが移植する手段の一つにあります。
また、Microsoft Visual Studio .net 2003でディレクトリを扱う低水準関数はdirect.hというファイルにプロトタイプ宣言がありますが、POSIX規格とは名前も使いかたの雰囲気も異なります。
    • good
    • 0
この回答へのお礼

回答ありがとうございました

とにかくやってみようと思います

お礼日時:2005/08/30 19:43

はるか昔、SDKのPOSIXライブラリを利用していたころdir.hをVCで使ったことはありますが、、


今もあるかどうかは不明です。

現実的には、No.1,2 さんの方法で回避するのが手だと思いますが、

ちなみに、dir.h は、
opendir, closedir, seekdir といったディレクトリ操作関数のプロトタイプ宣言ですので、VCで書き直すとしたら、FindFirstFile 関数で置き換えていくしかないと思います。

すみません、お役にたてませんが、、、
    • good
    • 0
この回答へのお礼

ありがとうございます

参考にさせていただきます

お礼日時:2005/08/30 19:44

includeフォルダを観てみましたが dir.h は無いようです。



ボーランドC/C++ではdir.h はあります。
サンプルプログラムは、ボーランド用なのでしょうか?

dir.hで宣言されて使われている関数を洗い出してそれをMS用で置き換える必要があると思います。
とりあえず、dir.hの読み込み部分を削除してコンパイルしてみて、プロトタイプ宣言がないというようなエラーを起こす部分を調べてみると良いでしょう
    • good
    • 0
この回答へのお礼

ありがとうございます

参考にさせていただきます

お礼日時:2005/08/30 19:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!