• ベストアンサー

わかりにくい質問かもしれませんが。

分割コンパイルを行っているのですが、うまくいかず、解決法も見出せないので、質問させてもらいます。 ファイル1 #include <stdio.h> #include "ファイル2.c" FILE *f1,*f2; int main(void){ if((f1==fopen("file1.txt"..... ..... } if((f2==........ ..... } for(i=0;i<3;i++){ file2he(); } fclose(f1); fclose(f2); fopen(stdout,"終了しました。"); return 0; } ファイル2 #include <stdio.h> extern FILE *f1,*2; void file2he(void){ ............... } ってやって、コンパイルすると、code in header プリコンパイルヘッダーが作成できない。と警告がでてきます。  ヘルプをみると、解決法みたいのが書かれているのですが、まったくわかりません。 まず、1.プリコンパイルヘッダーってなんですか?    2.code in headerって?    3.非インライン関数?    4.どうすれば、この警告は消えるのでしょうか(プログラム的に正しくした     い?)  リンクすると、ほとんど同じプログラムなのに、動く奴と、動かない奴があります。わかる範囲でいいです。教えてください。よろしくお願いします。

  • Nickee
  • お礼率79% (107/134)

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

  • ベストアンサー
  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.3

「プリコンパイルヘッダー」とは、コンパイルを高速化するために基本的に変更されないヘッダーファイルを予め途中までコンパイルした形にしたものです。 stdio.hなどシステムが提供するヘッダーファイルはプリコンパイルヘッダーとして指定しておくと少しコンパイルが早くなります。 今回の場合は、とりたててプリコンパイルヘッダーを指定する必要は無いと思いますので、コンパイラや統合ソフトの環境でプリコンパイルヘッダーを使用しない設定にした方がよいかもしれませんね。

Nickee
質問者

お礼

 プリコンパイルヘッダーの意味はわかりました。 ありがとうございました。

その他の回答 (2)

  • itohh
  • ベストアンサー率45% (210/459)
回答No.2

こんにちは。itohhといいます。 >#include "ファイル2.c" この意味は、ここに「ファイル2.c」展開しなさい。ということです。 分割コンパイルにはなっていません。 (この行は、削除してください。) 分割コンパイルとは、.cファイルを別々にコンパイルし、別々のobjファイルを作成することです。 そのあと、objファイルとlibファイルを結合して実行形式ファイル(exeファイルなど) を作ることをリンクするといいます。(この処理までを含めて分割コンパイルということもあります。)

Nickee
質問者

お礼

 もう少し勉強します。 ありがとう、ございました。

  • natural
  • ベストアンサー率37% (419/1115)
回答No.1

1~4の前に・・・。 >if((f1==fopen("file1.txt"..... f2の方もそうですが、「==」ではなく「=」にしないとファイルポインターが保存されませんよ。(^_^; 不思議に思うかもしれませんが、ここは代入でよいのです。 if文等の条件式は真か偽かを判定します。 つまり0(偽)かそれ以外(真)かです。 ここではファイルをオープンした結果としてファイルポインターが代入されます。 そして代入された値(f1等)が最終的にこの式の結果として判定されます。 オープンに失敗すればNULL(値としては0)が入りますので偽として判定され、成功した場合0以外の値が入りますので真となるのです。 また、ご質問にある様なファイル分割したプログラムはincludeで読み込むよりも分割コンパイル、リンクにより作成すべきです。 ご使用の環境が判りませんが、お使いのコンパイラーでも出来るはずですのでまずは調べてみて下さい。

Nickee
質問者

お礼

>「==」ではなく「=」 あっ、間違っていました。 >割コンパイル、リンクにより作成すべきです ちょっと、調べてみます。 ありがとう、ございました。

関連するQ&A

  • ファイルが読み込めない

    testのなかみを test,  22.2,  33.3,  として、 Visual C++ 2005でこれをコンパイルすると、わけのわからない数字がでてきます。 初心者なのでどこが間違ってるのかわかりません。 よろしくお願いします。 #include <stdio.h> int main(void) { char str[20]; double i,j; FILE *file; file = fopen("d:\\test\\test","r"); fscanf(file,"%s, %lf, %lf,",str,&i,&j); fclose(file); printf("i = %f : j = %f\n",i,j); return 0; }

  • 2バイト読飛ばして、スペースに置き換えたいです

    Cで、改行がないテキストファイルを800バイト毎に改行を入れることは無事できたのですが、254バイト目と255バイト目に化けている文字があり、それを半角スペース2つに置換したいのですがどうすればよいでしょうか? #include <stdio.h> int main() { FILE *f1,*f2; int i=0; char c; f1 = fopen("afile.txt", "r"); f2 = fopen("bfile.txt", "w"); if (f1 && f2) { while(!feof(f1)) { fscanf(f1, "%c", &c); fprintf(f2, "%c", c); i ++; if (i == 800){ i=0; fprintf(f2, "\n"); } } fclose(f2); fclose(f1); } }

  • c言語での wavファイルの編集(音楽編集・フェード)

    プログラミング初心者です。 現在Cでwavファイルの編集を行っています。 wavファイルにフェードをかけようと思うのですが、8bitの場合はうまくいったのですが、16ビットの場合がうまくいきません。 2バイト分読み込むだけでいいと思って、8ビットのときのf***(&data,1,***);のところの1を2にしただけです。 以下のようにプログラムを作成したのですがだめでした。 ヘッダの情報は決めうちでそのまま書き込むようにしてあります。 どのようにしたらうまくいきますか?? アドバイスよろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<math.h> #define HEADER 44 // HEADER SIZE #define F_LEVEL 0.9999999 // FADE LEVEL double FADE(double f); main(int argc, char *argv[]) { FILE *f_in,*f_out; unsigned char header[HEADER]; unsigned char data2[2]; int data; double work,mul=1.0; if((f_in = fopen(argv[1],"rb")) == NULL) exit(0); if((f_out = fopen(argv[2],"wb")) == NULL) exit(0); fread(header,1,HEADER,f_in); // HEADER READ fwrite(header,1,HEADER,f_out); // HEADER WRITE while(fread(data2,2,1,f_in) == 1)<-ここのwhile内の部分 {                   をどうにかすればいいと思うのですが・・・ work = data2[0]+256U*data2[1]; mul = FADE(mul); work = work * mul; data = (int)(work); fwrite(&data,2,1,f_out); } data = 0; fwrite(&data,2,1,f_out); data = 0; fwrite(&data,2,1,f_out); fclose(f_in); fclose(f_out); } double FADE(double f)// FADE { f = f * F_LEVEL; return (f); } よろしくお願いします。 参考URL:http://www.kk.iij4u.or.jp/~kondo/wave/

  • fpus:ファイル操作

    Cを勉強している初心者です。 このソースはコンパイルは通るのですが、 エラーがでてしまいます。 いろいろと調べてみたりもしたのですが わかりませんでした。 なぜなのでしょうか? #include <stdio.h> #include <string.h> struct student{ char name[20]; }; int main(void) { struct student s[1]; int i; int j = 1; FILE *fp; strcpy(s[0].name,"taro"); strcpy(s[1].name,"jiro"); if((fp = fopen("test.txt","w+")) == NULL) { printf("ファイルを開けませんでした\n"); return (-1); } for(i=0;i<=j;i++) { fputs(s[i].name,fp); } fclose(fp); return (0); }

  • fputs:ファイル操作

    Cを勉強している初心者です。 このソースはコンパイルは通るのですが、 エラーがでてしまいます。 いろいろと調べてみたりもしたのですが わかりませんでした。 なぜなのでしょうか? #include <stdio.h> #include <string.h> struct student{ char name[20]; }; int main(void) { struct student s[1]; int i; int j = 1; FILE *fp; strcpy(s[0].name,"taro"); strcpy(s[1].name,"jiro"); if((fp = fopen("test.txt","w+")) == NULL) { printf("ファイルを開けませんでした\n"); return (-1); } for(i=0;i<=j;i++) { fputs(s[i].name,fp); } fclose(fp); return (0); }

  • CGIコンパイルエラーについての質問

    CGIコンパイルエラーについての質問 gcc ppp.c -o pppとコンパイルしたらerrorが出てしまいます io.h そのようなファイルやディレクトリは存在しませんとでます CentOS Vware Playerを使っています #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <io.h> #include <time.h> void showimg(char []); int main(void) { int no; char *imgfile[] = {"img1.jpg","img2.jpg","img3.jpg"}; srand((unsigned int)time(NULL)); no = rand() % 3; printf("Content-type: image/jpeg\n\n"); showimg(imgfile[no]); return 0; } void showimg(char imgfile[]) { FILE *fp; char buf[1024]; int i, size; fp = fopen(imgfile, "rb"); if(fp != NULL) { _setmode(_fileno(stdout), _O_BINARY); while((size = fread( buf, sizeof(unsigned char), 1024, fp )) != 0) { for(i = 0 ; i < size ; i++) { printf("%c", buf[i]); } } fclose(fp); fflush(stdout); _setmode(_fileno(stdout), _O_TEXT); } } このプログラムを正しくコンパイルできて画像をランダムに表示できるようにしたいです どなたかお教えください

    • ベストアンサー
    • CGI
  • fopenとfcloseの繰り返しでpanic (FREEBSD)

    以下のプログラムをコンパイルして実行すると panicが発生して強制リブートしてしまいました。 これは何が原因なのでしょうか? 頻繁にfopenとfcloseを繰り返したら駄目なのでしょうか・・。 #include <stdio.h> main(){ FILE *fp; while(1){ fp=fopen("test.txt","wt"); fprintf(fp,"aaaaaaaaaa\n"); fclose(fp); } }

  • C言語でCSVファイルのオープン・クローズができな

    C言語でCSVファイルのオープン・クローズができない。 下記のプログラムですが、CSVファイルが読み込めません。 どのようにすれば読み込めるのでしょうか。よろしくお願いいたします。 #include <stdio.h> int main(void) { FILE *fp; fp = fopen("aaa.csv","r"); if (fp == NULL) printf("ファイルを開けません。"); else { fclose(fp); } return(0); }

  • バイナリファイル(画像)のよみこみ

    レポートで1024×1024ピクセルの画像を、間引いて256×256の画像にしろというのが出されました。画像はrawファイルです。 それで、とりあえず画像を読み込んで、出力するプログラムを書いてみたんですが、コンパイルは出来るのに実行すると不正な処理とけいこくがでてきてしまいます。 ソースは #include<stdio.h> main() { unsigned char in[1024][1024],out[1024][1024]; FILE *fp; int i,j; fp=fopen("aaa.raw","rb"); fread(in,sizeof(unsigned char),1024*1024,fp); fclose(fp); for(i=0;i<1024;i++){ for(j=0;j<1024;j++) out[i][j]=in[i][j]; } fp=fopen("bbb.raw","wb"); fwrite(out,sizeof(unsigned char),1024*1024,fp); fclose(fp); } です。 どこがいけないのかアドバイスいただきたいです。よろしくお願いします。

  • ファイルの読み込み(プラグラムに関する質問)

    下記のプログラムを書きました。そのプラグラムについて質問させてください。 添付画像のCSVファイルを読み込んでも数値が正しく表示できていません。(添付画像のコマンドプロンプト参照) どうすれば正しく表記されるのでしょうか? また、2列以上にデータが存在するCSVファイルがある場合はどのような処理をすれば良いのですか? わかる方がいましたら教えていただけないでしょうか? よろしくお願いします。 #include <stdio.h> #include <conio.h> int main(void) { FILE *fp; double x; int n; fp = fopen("1.csv", "r"); if(fp == NULL) return 0; while( fscanf(fp, "%f\n", &x) != EOF ){ printf("%f\n", x); getch(); } fclose(fp); return 0; }