• ベストアンサー

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

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

  • 【C言語】 型のサイズについて

    C言語の学習をしております初心者です。 型のサイズについてですが、int型のサイズは処理系に依存する、 ということをよく聞きますが、この「処理系」というのは そのアプリケーションを動作させるマシンに搭載されている"CPU"を 指しているのでしょうか? それとも"OS"を指しているのでしょうか?

  • C言語の変数の型がわかりません

    C言語の変数の型がわかりません [int]は4バイトを使って整数(-2147483648~2147483648)を格納できる. [long int]は4バイトを使って整数(-2147483648~2147483648)を格納できる. のようなことが書いてあります. [int]と[long int]の違いは何ですか?

  • C言語で整数を文字列へ型変換

    C言語で整数を文字列へ型変換 int result[11]; const char *tmp; resultの中の11個の数字を 1,2,3,4,5,6,7,8,9,10,11 のような文字列にして、tmpへ代入したんですが、やり方が分かりません。 Cの初心者ですので、教えていただきたいです。

  • 型について

    Cの型の中にint と long int がありますけどこの違いは何なのでしょうか?本にはどちらも4ビットの整数(long intは長整数となっていますが)-2147486648~2147483647となっていますが・・。 同様にdouble と long double は何が違うのでしょうか? 初歩的なところですがよろしくおねがいします。

  • 定数の型について

    独習Cという本に「デフォルトでは、Cコンパイラは数値定数を互換性のあるデータ型のうちその数が収まる最小の型であると見なします。intを16ビットと仮定すると、10はデフォルトでintとなり、100003はlongになります。」と書いてあるのですが、なぜ10はshortではなくintになるのですか? 回答お願い致します。

  • 関数ポインタの型をtypedefしたとき

    C言語において、関数ポインタの型をtypedefで作ると、 typedef int (*MyFunc)(int*,int*); と宣言でき、関数ポインタの変数は、 int FuncA(int* a, int* b) { ~ } void main_loop() { MyFunc pf = FuncA; ~ (*pf)(pa,pb); } というように使うと思います。 ここで疑問なのですが、この実際に呼び出される関数、FuncAの定義に、typedef(ここではMyFunc)を使えないものでしょうか? 同じことを2回やっているようで、無駄に思えてしまいます。

  • C/C++の型について

    Windows2000で、VC++6で型のサイズを調べると、以下のとおりでした。 int 4バイト long 4バイト long int 4バイト 環境はWindows2000, CPUはCeleron1200Mhzです。 環境やコンパイラによって型のサイズや呼び方も変わるのでしょうか? VisualBasic6用のDLLをVCで作成した記憶があるのですが、そのときは VB6のInteger型が2バイトだったので C(Ver7.0?????)側も2バイトだったと思います。 今VB6のInteger型にあわせる場合はC側ではshortでないとおかしくなるのでしょうか? 私はブランクがあり、そのあたりの事情がよくわかっていません。 あるサイトのページを見ると intが2バイトで、 long intは同じ4バイトで long long intという型もありました。VC6++では long long intは無いようです。 http://seclan.dll.jp/c99d/c99d05.htm VC2005++やGCCでは8バイトの型はあるのでしょうか?

  • 関数ポインタを返す関数の型をtypedefする方法

    C言語について質問します。 ある関数を定義するとします。 その関数は引数としてintを一つ取り、返値としてその関数と同じ型の関数へのポインタを返すようにしたいのですが、どのように書けばよいのでしょうか? そして、その関数の型をtypedefで定義したいです。 例えば、FNをtypedefしたいその関数の型だとすると、 typedef FN (*FN)(int); のようなFNを定義したいのですが、上のように書いても当然コンパイラ(VC9)に怒られます。 最悪、 typedef void* (*FN)(int); とvoidポインタを返すように定義しておいて、そのポインタを返値として受け取った側でFNにキャストし直す方法で対処できなくもないですが、ちょっと強引過ぎる気がします。 何かいい方法はあるのでしょうか? boost::functionあたりを使えばできそうな、そうでもないような気がしますが、できれば純粋なCでの解決法を望みます。 よろしくお願いします。

  • HRESULTの代替となる型

    C#初心者です。 C++にはHRESULTという型がありましたが、 C#ではこれに相当する型があるのでしょうか? どなたか教えてください。

  • 組み合わせ プログラミング

    c言語についてです os linux コンパイラはgccです long fact2(int n,int m)を作成してfact2(n,m)を使って組み合わせを計算するプログラムを作れという問題で下記のように作りましたが コンパイルできません. エラーメッセージは 2-1.c:14: error: 関数 `fact2' への引数が少なすぎます 2-1.c:14: error: 関数 `fact2' への引数が少なすぎます 2-1.c:14: error: 関数 `fact2' への引数が少なすぎます です 関数のとこが違うと思うですが どうしたらいいのかわかりません それともなにか他のとこが違うのでしょうか? #include <stdio.h> long fact2(int,int); main() { int n, m; long c; printf(" nCm (n>m) \n"); printf("input n m ="); scanf("%d %d",&n, &m); c =fact2(n) / (fact2(m) * fact2(n-m)); printf("%dC%d = %ld\n",n,m,c); } long fact2(int n,int m) { int i; long c=1; for(i=1; i<=n; i++) c*=i; return(c); }

このQ&Aのポイント
  • 中学3年生の化学のイオンの問題で、アルミニウム原子と酸素分子の電子受け渡しについて分かりません。
  • 解説によると、酸素分子は4個の電子を受け取り、アルミニウム原子は3個の電子を放出します。
  • したがって、アルミニウム原子4個が必要なのは、12個の電子を放出するためです。
回答を見る

専門家に質問してみよう