パラメータ '__format' の定義と関数 main の不一致

このQ&Aのポイント
  • C言語のプログラムで、パラメータ '__format' が const signed char * 型として定義されているにもかかわらず、int 型の値を渡しているため、不一致のエラーが発生しています。
  • このエラーは、関数 main 内のファイルを読み込む処理に関連しています。
  • プログラムの実行に影響を与える可能性があるため、エラーを修正する必要があります。
回答を見る
  • ベストアンサー

44行目: パラメータ '__format' は const signed char * 型として定義されているので int は渡せない(関数 main )

☆--------------ソース--------------☆ #include <stdio.h> struct seiseki { int no; char fname[20]; char lname[20]; int val[3]; }seito; int main(void) { int i,total; FILE *fp; FILE *file; struct seiseki seito[20]; char buf[1024]; fp = fopen("in.txt", "r"); i=0; while( fgets(buf, sizeof(buf), fp) ){ struct seiseki tmp; sscanf(buf,"%d %s %s %d %d %d",&tmp.no,tmp.lname,tmp.fname,&tmp.val[0],&tmp.val[1],&tmp.val[2]); seito[i++] = tmp; } printf("ID / NAME / 数(1) / 数(2) / 数(3) \n"); for(i = 0; i < 3; i++) { printf("%d / %s %s / %d / %d / %d\n", seito[i].no,seito[i].lname,seito[i].fname, seito[i].val[0], seito[i].val[1], seito[i].val[2]); } file = fopen("output.html","w"); fprintf(file ,"<HTML><HEAD></HEAD><BODY><table border=1 bodercolor=black cellspacing=0 width=700>\n"); fprintf(file ,"<tr bgcolor=#FF7575><td>ID</td><td>氏名</td><td>数(1)</td><td>数(2)</td><td>数(3)</td><td>合計点</td><td>平均点</td><td>偏差値</td><td>順位</td></tr>\n"); for(i = 0; i < 3; i++) { fprintf(file ,seito[i].lname); fprintf(file ,seito[i].fname); ☆省略☆ fprintf(file ,seito[i].val[0]); ☆省略☆ } fprintf(file ,"\n</table></BODY></HTML>\n"); return 0; }

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

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

fprintf(file ,seito[i].val[0]);を fprintf(file ,"%d",seito[i].val[0]); にしてみて下さい。

cluewm
質問者

お礼

早速のご返答、ありがとうございます。 教えていただいたとおりで、うまくいきました。 今後ともよろしくお願いいたします。

関連するQ&A

  • 44行目: パラメータ '__format' は const signed char * 型として定義されているので int は渡せない(関数 main )

    たびたび、Cについてご質問させて頂いていますが件名のようなエラーで行き詰まっています。 内容は、textファイルを読み込み、htmlファイルを生成するといったものです。成績管理みたいなことをしたいと考えています。とりあえず、44行目に fprintf(file ,seito[i].val[0]); で数(1)の点数をHTMLに書き込みたいのですが、 件名のエラーが表示されうまくコンパイルができない状態です。お助けくださいませ。よろしくお願いいたします。

  • C言語 構造体

    以前にも構造体について質問させていただきましたが、より自由度の高い処理が必要となりご質問させていただきます。 よろしくお願いいたします。 以前のものは入力する項目数(列),行数(行)が前提にあるものでした。 テキストファイルを読み込んで、 構造体としてデータを読み込みたいのですが、 今回は項目数が不定のものです。 a.txt ------------------------- あああ,いいい,ううう ------------------------- とあれば あああ いいい ううう とカンマ抜きで得たい。(3項目) 次回読み込んだとき、 a.txt ------------------------- abc,def,g,h,i,jk ------------------------- とあれば、 abc def g h i jk とカンマ抜きで得たい。(6項目) 以前のものは下記のような感じです。 FILE *fp; FILE *file; struct seiseki seito[20]; char buf[1024]; fp = fopen("aaa.txt", "r"); i=0; while( fgets(buf, sizeof(buf), fp) ){ struct seiseki tmp; sscanf(buf,"%d %s %s %d %d %d",&tmp.no,tmp.lname,tmp.fname,&tmp.val[0],&tmp.val[1],&tmp.val[2]); seito[i++] = tmp; } for(i = 0; i < 3; i++) { printf("%d / %s %s / %d / %d / %d / %d\n", seito[i].no,seito[i].lname,seito[i].fname, seito[i].val[0], seito[i].val[1], seito[i].val[2], seito[i].val[0] + seito[i].val[1] + seito[i].val[2]); }

  • 'const char *' 型は 'char *' 型に変換できない ??

    Case 1 Text9.Text = "AB"; Text10.Text = "A"; // 1文字目 Text11.Text = "B"; // 2文字目 case 2; Text9.Text = "Ab"; Text10.Text = "A"; Text11.Text = "b"; case 3; Text9.Text = "aB"; Text10.Text = "a"; Text11.Text = "B"; case 4; Text9.Text = "ab"; Text10.Text = "a"; Text11.Text = "b"; 上記のようなCase 文を C を使って作成したいのですが, A~J の大文字とa~jまでの小文字をつかって,2文字の文字列をつくるとき, 1文字目と2文字目が,形態も名称も異なる文字列(例 AB , Ab aB, ab, AC, Ac aC ac, ...)のcase文をつくりたいのですが, 'const char *' 型は 'char *' 型に変換できないというエラーメッセージがでてしまいます.下記プログラムをどう直せばいいかおしえてください. #include <stdio.h> #define MAX_NAME 256 int main(void) { const char *NAME12 = "Text9"; const char *NAME1 = "Text10"; const char *NAME2 = "Text11"; const char *ALPH = "ABCDEFGHIJabcdefghij"; FILE *fp = NULL; char f_name[MAX_NAME]; int count = 0; char *p = ALPH; char *q = ALPH; printf("ファイル名:"); scanf("%s", f_name); fp = fopen(f_name, "w"); if (fp == NULL) { printf("'%s':ファイルが見つかりません\n", f_name); } else { for (p = ALPH; *p != '\0'; p++) { for (q = ALPH; *q != '\0'; q++) { if (*p != *q) { count++; fprintf(fp, "Case %d\n", count); fprintf(fp, "%s.Text = \"%c%c\"\n", NAME12, *p, *q); fprintf(fp, "%s.Text = \"%c%c\"\n", NAME1, *p, *q); fprintf(fp, "%s.Text = \"%c%c\"\n", NAME2, *p, *q); } } } fclose(fp); } return 0; }

  • 構造体のリスト

    ご質問させていただきます。 下記は拾ったソースをちょっとアレンジしたものなのですがエラーはなく動きます。 struct seiseki { int no; /* 学生番号 */ char name[20]; /* 氏名 */ double average; /* 平均値 */ }; int main(void) { int i; struct seiseki seito[20] = { { 1, "SAKURAI", 78.6 }, { 2, "NAGANO", 57.3 }, { 3, "TAKESHITA", 66.4 }, }; for(i = 0; i < 3; i++) { printf("%d %s %5.1f\n", seito[i].no, seito[i].name, seito[i].average); } return 0; } これを、もうちょっと応用を利かせ、 固定されているデータ部分 { 1, "SAKURAI", 78.6 }, { 2, "NAGANO", 57.3 }, { 3, "TAKESHITA", 66.4 }, をテキストファイルなどからfgetと組み合わせてデータを取りたいのです。 どうやればよいのかネット上を探してみたのですが、 なかなか似たようなものがありませんでした。 どうやればよいのでしょうか。 また、これは可能なのでしょうか。 教えてください。 また、参考になる書籍、URLなどもあれば併せて教えていただければ幸いです。

  • C言語 構造体(2)

    ご質問です。 構造体で、あらかじめメンバ数を固定したものではなく、 テキストファイルを読み込んだときにメンバ数を変えて読み込みたいのです。 (カンマできりたい) aaa.txt ------------------------ あああ,いいい ------------------------ となっているときは、 tmp.nm[0]=あああ tmp.nm[1]=いいい となり、 kamoku.nm[0] kamoku.nm[1] をprintf。 aaa.txt --------------------------- あああ,いいい,ううう,えええ --------------------------- の場合は tmp.nm[0]=あああ tmp.nm[1]=いいい tmp.nm[2]=ううう tmp.nm[3]=えええ kamoku.nm[0] kamoku.nm[1] kamoku.nm[2] kamoku.nm[3] をprintf。 下記は動きません。。 よろしくお願いいたします。 #include <stdio.h> struct kamokumei { char nm[10]; }kamoku; int main(void) { int i,P,t; FILE *fp; struct kamokumei kamoku[20]; char buf[1024]; fp = fopen("aaa.txt", "r"); P=3; t=0; while( fgets(buf, sizeof(buf), fp) ){ struct kamokumei tmp; sscanf(buf, "%s", tmp.nm[t]); nm[t++] = tmp; } for(i = 0; i < P; i++) { printf("%s\n", kamoku.nm[i]); } return 0; }

  • 複数テキストファイルを読み込み、複数テキストファイルの出力

    質問は100個のテキストファイル(それぞれ10個のデータを含む)を読み込み、それぞれのテキストファイルから5個ずつデータを抽出し、200個のテキストファイルとして出力するというプログラムについての質問です。 以下が僕の作ったファイル出力部分のプログラムです。 /************/ void ecg_rr(fp,data_max) FILE *fp; { int b,i=0; int c=1; char fname[64]; data[0][i]=trend_data[0][i]; for(i=0;i<100;i++) sprintf(fname,"ss[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][0]); fprintf(fp,"%8.8f\n",data[0][2]); fprintf(fp,"%8.8f\n",data[0][4]); fprintf(fp,"%8.8f\n",data[0][6]); fclose(fp); sprintf(fname,"sk[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][1]); fprintf(fp,"%8.8f\n",data[0][3]); fprintf(fp,"%8.8f\n",data[0][5]); fprintf(fp,"%8.8f\n",data[0][9]); fclose(fp); } 複数ファイルの読み込み方がわからず、自分のプログラムだと1つのテキストファイルしか読み込めないので、16_4.batを作り、その中身を 16_4 読み込むテキストファイル名1.txt ss[1] 16_4 読み込むテキストファイル名1.txt sk[1] 16_4 読み込むテキストファイル名2.txt ss[2] 16_4 読み込むテキストファイル名2.txt sk[2] ・・・ とやったのですが、うまくいきませんでした。 どうすればよいのでしょうか。

  • 式を変更して画像を作りたいです

    以下のプログラムはカラー画像を作成し、MAX_REPEAT回コピーした後、PPMファイルとして出力するものです。 画像作成部分の式を変更し、画像を作ろうと思いますが、アイディアがあれば参考にしたいので教えてください。 簡単でけっこうですから是非お願いします。 gcc -Wall -O2 -DCIP ファイル名でコンパイルします。 PPMファイルはdisplay tmp.ppmで表示します。 convert tmp.ppm tmp.jpgでjpg形式に変換できます。 #include <stdio.h> #include <stdlib.h> #include <math.h> //mathライブラリを利用する場合はコンパイル時に -lm #define MAX_REPEAT 1 //コピー繰り返し回数 #define SIZE 500 //画像サイズ(行=列) #ifdef CSQ #define DIM1 3 #define DIM2 SIZE #define DIM3 SIZE #endif #ifdef CIP #define DIM1 SIZE #define DIM2 SIZE #define DIM3 3 #endif typedef unsigned char UCHAR; void write_ppm_csq(UCHAR [][DIM2][DIM3],char *,int ,int); void write_ppm_cip(UCHAR [][DIM2][DIM3],char *,int ,int); void error1(char *); /* 画像のコピー */ void copy3dimg(UCHAR res[][DIM2][DIM3],UCHAR org[][DIM2][DIM3],int dim1,int dim2,int dim3) { int i,j,k; for(i=0;i<dim1;i++) for(j=0;j<dim2;j++) for(k=0;k<dim3;k++) res[i][j][k]=org[i][j][k]; } int main(void) { int repeat; UCHAR org[DIM1][DIM2][DIM3]; /* 作成画像 */ UCHAR res[DIM1][DIM2][DIM3]; /* コピー先画像 */ /* 画像の作成 */ { int i,j,k; for(i=0;i<DIM1;i++) for(j=0;j<DIM2;j++) for(k=0;k<DIM3;k++) org[i][j][k]=(UCHAR)((i*j+10*j+k*k)%256); } /* 画像のコピー */ for(repeat=0;repeat<MAX_REPEAT;repeat++) copy3dimg(res,org,DIM1,DIM2,DIM3); /* ファイルへの出力 */ #ifdef CSQ write_ppm_csq(res,"./tmp.ppm",DIM3,DIM2); #endif #ifdef CIP write_ppm_cip(res,"./tmp.ppm",DIM2,DIM1); #endif return 0; } /* ファイルへの出力(CSQ) */ void write_ppm_csq(UCHAR data_buf[][DIM2][DIM3],char *fname,int width,int height) { FILE *fp; int m, n; if((fp = fopen(fname, "wb")) == NULL) { fprintf(stderr, "file(%s) can't open\n", fname) ; exit(1) ; } fprintf(fp, "P6\n") ; /* カラー画像かつバイナリーデータの記号 */ fprintf(fp, "%d %d\n", width, height) ; /* 画像の幅(列数)と高さ(行数) */ fprintf(fp, "255\n") ; /* 最大値 */ for(m=0;m<height;m++) for(n=0;n<width;n++) { fwrite(&data_buf[0][m][n], sizeof(UCHAR), 1, fp); fwrite(&data_buf[1][m][n], sizeof(UCHAR), 1, fp); fwrite(&data_buf[2][m][n], sizeof(UCHAR), 1, fp); } fclose(fp) ; } /* ファイルへの出力(CIP) */ void write_ppm_cip(UCHAR data_buf[][DIM2][DIM3],char *fname,int width,int height) { FILE *fp; if((fp = fopen(fname, "wb")) == NULL) { fprintf(stderr, "file(%s) can't open\n", fname) ; exit(1) ; } fprintf(fp, "P6\n") ; /* カラー画像かつバイナリーデータの記号 */ fprintf(fp, "%d %d\n", width, height) ; /* 画像の幅(列数)と高さ(行数) */ fprintf(fp, "255\n") ; /* 最大値 */ fwrite(&data_buf[0][0][0], sizeof(UCHAR), width*height*3, fp); fclose(fp) ; } /* エラー処理 */ void error1(char *message) { printf("%s\n",message); exit(1); }

  • fprint()とfscanf()を用いたプログラムについて

    テキストファイルへの出力はきちんとできているのですが、 得点・合計得点出力のところでつまづいてしまいます。 どうすればいいでしょうか? #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct{ char name[20]; int ten[3]; }RECORD; void csv(char *); void display_csv_file(char *); FILE *fpcsv; void main(int argc, char **argv) { csv(argv[1]); /* キーボード ⇒ CSV(テキスト)ファイル */ display_csv_file(argv[1]); /* CSV(テキスト)ファイル ⇒ ディスプレィ */ } void csv(char *filename) { RECORD seiseki; int i; fpcsv = fopen(filename,"w+"); while(printf("name(Ctrl + Z終了) >"),gets(seiseki.name) != NULL){ if(seiseki.name != NULL){ for(i = 0; i < 3;i++){ printf("得点%d >", i + 1); scanf("%d", &seiseki.ten[i]); } fprintf(fpcsv,"%s, %d, %d, %d, ", seiseki.name, seiseki.ten[0],seiseki.ten[1],seiseki.ten[2]); } rewind(stdin); } fclose(fpcsv); } void display_csv_file(char *filename) { char buf[255]; int i, sum, tokkuten[3]; fpcsv = fopen(filename,"r+"); while(fscanf(fpcsv,"%s%d%d%d", buf, tokkuten[0],tokkuten[1],tokkuten[2]) != EOF){ /*名前表示*/ strtok(buf,","); printf("name:%s ",buf); /*得点表示&合計計算*/ printf("得点1:%d 得点2:%d 得点3:%d", tokkuten[0],tokkuten[1],tokkuten[2]); sum = tokkuten[0] + tokkuten[1] + tokkuten[2]; /*合計表示*/ printf(" 合計得点: %d\n", sum); } fclose(fpcsv); }

  • 関数で算出した値を他の関数で使いたい。

    こんにちは。「平均点を出す関数」と「数学の点数のベスト3を出す関数」を使って、「1.平均点」と「2.数学の点数のベスト3の名前とその点数と、各々の点数と平均点との差」を求めるプログラムを作っています。平均点とベスト3の名前とその点数は出せるのですが、「平均点を出す関数」で求めた値をもって来れず、「平均点との差」がうまく表示できません。ソースは下記のようになっております。簡単な修正で直せる方法を教えていただきたいのですが。宜しくお願い致します。 #define STUDENT 4 #include <stdio.h> struct SEISEKI_T {  char name[20]; /* 生徒名を格納する配列。40バイト格納化。 */ int math; /* 数学の点数 */}; typedef struct SEISEKI_T SEISEKI; int average(SEISEKI *sp, int num, int *p); int rank_math(SEISEKI *sp, int num, int *p); int main( ) { SEISEKI seito[STUDENT] = { /* 生徒名と数学の点数のデータ */ { "佐藤", 63},{ "鈴木", 68},{ "高橋", 61},{ "田中", 40}, }; SEISEKI *sp; sp = seito; static int avg[0] = {0}; average(seito, SUBJECT, avg); rank_math(seito, SUBJECT, avg); printf("\n"); return 0; } int average(SEISEKI *sp, int num, int *p) { int i; /* ループ変数 */ static int avg[0] ={0}; for (i = 0; i < 4 ; i++) { avg[0] += (sp + i)->math; } avg[0] = avg[0] / 4 ; printf( "数学 = %3d \n", avg[0]); printf("\n\n"); } int rank_math(SEISEKI *sp, int num, int *p) { int i; /* ループ変数1 */ int j; /* ループ変数2 */ int sa_m = 0; /* 数学の上位成績者の点数と平均点との差。*/ SEISEKI dumy; /* struct SEISEKI_T 型の構造体 dumy */ for ( i = 0 ; i < STUDENT - 1 ; i++ ) { for ( j = 0 ; j < STUDENT - i - 1 ; j++ ) { if( ((sp + j)->math) < ((sp + j + 1)->math) ) { dumy = *(sp + j); *(sp + j) = *(sp + j + 1); *(sp + j + 1) = dumy; } } } printf( "■数学上位成績者\n" ); printf( "----------------------------------\n" ); printf( "順位 名前 点数 平均+\n" ); printf( "----------------------------------\n" ); for ( j = 0 ; j < 3 ; j++ ) { sa_m = (sp + j)->math - *p; printf( " %d %6s %3d %2d\n" , j + 1 , (sp + j)->name , (sp + j)->math , sa_m); } return 0; }

  • プログラムがわかりません

    C言語の本を読んでいるんですが、詰まってしまいました。プログラム自体は単純なのですが #include<stdio.h> void hello(void) { fprintf(stderr,"hello!\n"); } void func(void) { void *buf[10]; static int i; for(i=0;i<10;i++) { buf[i] = hello; } } int main(void) { int buf[100]; func(); return 0; } のスタックオーバーフローのプログラムです。 1. 要素100のint型配列を宣言 2. 関数funcの呼び出し 3. void *buf[10]; まずここでがわかりません。なぜポインタが   でてきたのか?またbufの要素数は100では? 4. buf[i] = hello; のループ    これもわかりません。配列に関数を代入しているのでしょうか?     5.  fprintf(stderr,"hello!\n"); これもまたわかりません。    fprintfの最初の引数は出力先ですが、なぜ標準エラー出力なの   でしょうか? 時間のあるかた解説お願いします。