• ベストアンサー

誤った型の組み合わせとは?

C言語初心者です。「FILEとintは誤った型の組み合わせです」と出てしまうのですが、その原因として考えられることにはどんなことがありますか?

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

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.6

#3のzwiですが、intの事は忘れましょう。 openでのファイル操作を参考にfopenを使ってしまったのが、今の状態で参考にしたものが間違ってますから一旦忘れて覚えなおしてください。 fopenの正しい使い方の一例は、下記にありますので参考に。 http://www9.plala.or.jp/sgwr-t/c/sec17.html

charmin
質問者

お礼

何度もありがとうございます。参考のURLを見させていただきました。 エラーがなくなったので実行してみたところ「読み取り専用ではないファイル(?)」が開かれ、本当は値を入力して計算をしたいのですが、できません。 fcloseというのが抜けているからでしょうか?それともファイルをオープンした時点でエラーが発生し、終了したということなのでしょうか?すいません、よろしくお願いいたします。

その他の回答 (7)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.8

読み取のプログラムを書いてると思いますので、極論を言ってしまえばfcloseしなくても単純なプログラムなら動きます。 ですので、実行時にエラー?を起こしている部分と関連する宣言を全て見せてください。それと正確なエラーメッセージですね。

charmin
質問者

お礼

さきほど”警告”を無視して実行すると、うまくいきました。 何度も質問してお騒がせし、すいませんでした。ありがとうございました。

  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.7

>>FILE *fp1; >>と宣言されていました。この場合ですと >>fp1の宣言は、 >>int fp1; >>FILE *fp1;  同じ、変数を2度宣言してはいけません。変数の宣言は基本的には一回です。グロバール変数などには例外はありますが、それにしても、すべての宣言は同一でなくてはいけません。  というわけで、今回のfp1の正しい宣言は、 FILE *fp1;  です。  間違った宣言は削除しましょう。  先の回答の補足は、コード断片のどこかエラーか正確に記述がなかったので、書いてあると思われるコードを類推しただけです。推測が外れていればそれはそれでよしということで。

charmin
質問者

お礼

ありがとうございます。おかげ様でエラーがなくなりました。 しかし、実行すると「読み取り専用ではないファイル(?)」が開かれ、本当は値を入力して計算をしたいのですが、できません。 fcloseというのが抜けているからでしょうか?それともそもそもそのようなプログラミングになっていないということでしょうか?すいません、よろしくお願いいたします。

  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.5

 No4の補足です。  引用された断片のずーと前で、fp1の宣言も当然してあるはずですね。  もし、エラー行が、 fp1=fopen("ffile1.txt","r");  の行だとすれば、fp1の宣言は、  int fp1;  となっていると思われます。  No4の通り、fopenの戻り値は、FILE構造体へのポインターですから、  FILE *fp1;  と宣言しておかなくてはいけません。

charmin
質問者

お礼

丁寧な解説をありがとうございます。NO.4の解説とともにお礼申し上げます。 if(fp1==NULL) { に訂正してみたいと思います。 FILE *fp1; と宣言されていました。この場合ですと fp1の宣言は、 int fp1; FILE *fp1; というようにしなくても構わないということでしょうか?(int の部分はいらないということでしょうか?) たびたびすいません。

  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.4

 No.1の補足の断片だと、おかしいような気がしますね。  fopenの構文は、そのコンパイラーが標準通りのインプリメントだとすると次の通りのはずです。 FILE *fopen(const char *filename, const char *mode);  この関数は、FILE構造体へのポインターを返します。エラーの場合には、NULLを返します。  返ってくる値は、intではないので、  if(fp1<=0){  の部分は、当然コンパイルエラーとなります。(0以下という条件は、当然ですが、数値に対してしか実行できません。ポインターは数値ではありませんから。)  正しくは、  if(fp1==NULL) {  か、簡略表示では、  if(!fp1) {  のどちらかでないとおかしいです。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.3

残念ながらFujitsuCの詳細は存じません。 しかしながら、やはりopenとfopenを混同していると思います。 openはint型のファイル・ディスクリプタを返します。 fopenはFILE*というFILE型のポインタを返します。 もう一度、参考書や資料を読み直して書き方を調べてみてください。 open http://www.linux.or.jp/JM/html/LDP_man-pages/man2/open.2.html fopen http://www.linux.or.jp/JM/html/LDP_man-pages/man3/fopen.3.html

charmin
質問者

お礼

勉強不足のままで質問してしまい失礼しました。回答ありがとうございました。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

fopenまたはfreopenを使うつもりでつづりを間違ったとか。 あるいは非標準関数_wfopenを使おうとしたとか。

charmin
質問者

お礼

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

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

OSやコンパイラが不明でエラーメッセージもあやふやですので、断言は出来ませんが、想像で答えると。 openとfopenを同じに扱ってしまっていませんか?

charmin
質問者

お礼

早速の回答をありがとうございます。 コンパイラはFujitsuCとかいうものだと思います。 M:\>fcc CAE_ensyu_NB_FEM.c "CAE_ensyu_NB_FEM.c", line 46: エラー: `FILE' と `int' は、誤った型の組合わせで す。: `<='演算子 このようなエラーがでてしまいます。 46行目あたりは data=dat; fp1=fopen("ffile1.txt","r"); if(fp1<=0){ printf("File cannot open !\n"); } こうなっているのですが。C言語を始めてまだ3週間なもので・・・

関連するQ&A