• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:■ 移植性のないポインタ変換について ■)

移植性のないポインタ変換について

このQ&Aのポイント
  • プログラムは、指定したファイル名の存在を確認し、存在しなければ変数「flg」に「0」を代入します。
  • bcc32コンパイル時に「移植性のないポインタ変換(関数 AB )」と出てしまいます。コンパイラの引数「-w-rpt」を使った回避以外に解決方法はありますか?
  • プログラムはファイルを開くための関数を呼び出していますが、関数の戻り値の型と変数の型が一致していないために発生しているエラーです。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.5

> 手持ちのテキストには、fopenの戻り値は「NULL」とありましたので、「0」と同じかと思っていました。 同じかどうかは、環境によって違います。すくなくとも、0だと決めつけず、「NULLが0である」ことを確認できた環境だけで使うようにします。そうでないと警告通り「移植性に問題あり」です。 > 他のWebサイトには戻り値はvoid型と書いてありましたので、戻り値をint型にして返しても問題ないと解釈していました。 本当にそうなら、戻り値voidは何も戻さない、ということになります。 そこに書いてあったのは、NULLがvoid *型(voidのポインタ)とかではないですか? すくなくとも、fopenはvoid型関数ではありません。 > ファイルが存在しても0が返ることがあるそうですので、質問のプログラムを用いて、どのようにfopenでファイルの存在をチェックすれば良いでしょうか? たとえば、そのファイルにロックがかかっていて、読み込みオープンすらできなかったら、fopenが返すのは何だと思いますか? 「読み込みモードでfopenできた⇒ファイルが存在する」は成り立ちますが、「読み込みモードでfopenが失敗した⇒ファイルが存在しない」とは一概に言えません。 すでに出ているように、fopenでファイル存在チェックはできません。 あと、このままでは、ファイルが開きっぱなしになります。オープンできる数の限界になる、とか、チェックしたファイルに実際に読み書きしようとしたらできない、とかの問題が発生することになります。 > 手持ちの入門テキストには、そのような関数は見当たりませんでした。 入門テキストでなんでも作れるようになるわけではありません。むしろ、載っていないことの方が多いはずです。 リファレンスマニュアルを読みましょう。

noname#261434
質問者

お礼

確認したところ確かにNULLはvoid *型でした。 すみませんでした。 fopenでファイル存在チェックはできないことが分かりましたので、別の方法を模索したいと思います。 ご回答ありがとうございました。

その他の回答 (4)

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

>手持ちのテキストには、fopenの戻り値は「NULL」とありました いつもNULLが返る、と思っていらっしゃいますか? >他のWebサイトには戻り値はvoid型と書いてありました fopen()の戻り値が、ですか?

noname#261434
質問者

お礼

ご回答ありがとうございます。

noname#261434
質問者

補足

>いつもNULLが返る、と思っていらっしゃいますか? はい、いつもNULLが返ると思っていました。 fopenが失敗した時はNULLが返るとしかテキストには載っておりませんでした。 >fopen()の戻り値が、ですか? 「ANo.5」のご回答内容に「NULLはvoid *型」とご指摘されていました通り、こちらの勘違いでした。 申し訳ありません。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.3

ポインタ変換がどうの以前にfopen()で調べようとすることが不適切です。 ファイルの存在を調べるならaccess()やstat()じゃないかな。

noname#261434
質問者

お礼

ご回答ありがとうございます。

noname#261434
質問者

補足

申し訳ありません。 手持ちの入門テキストには、そのような関数は見当たりませんでした。 テキストの問題集の一つにモジュールで分割させたファイルの存在チェックを作り、それを利用するものになります。 問題の答えになるサンプルプログラムが載っておりませんでしたので、こちらに質問させていただきました。 テキストの内容から、ファイルの存在を確認できるものとしてfopenくらいしか見当たりませんでしたので、質問にはfopenを用いてプログラムを書きました。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

訂正します > > 指定したファイル名の存在を確認し、存在しなければ変数「flg」に「0」を代入するものです > という仕様になっていない可能性もあります。 → という仕様になっていません。 ファイルが存在しても0が返ることがあります。

noname#261434
質問者

お礼

ご回答ありがとうございます。

noname#261434
質問者

補足

手持ちのテキストには、fopenの戻り値は「NULL」とありましたので、「0」と同じかと思っていました。 他のWebサイトには戻り値はvoid型と書いてありましたので、戻り値をint型にして返しても問題ないと解釈していました。 ファイルが存在しても0が返ることがあるそうですので、質問のプログラムを用いて、どのようにfopenでファイルの存在をチェックすれば良いでしょうか?

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

fopenの戻り値と関数ABの戻り値を比べましょう > 指定したファイル名の存在を確認し、存在しなければ変数「flg」に「0」を代入するものです という仕様になっていない可能性もあります。

noname#261434
質問者

お礼

ご回答ありがとうございます。

関連するQ&A

専門家に質問してみよう