• ベストアンサー

初歩的なことかもしれないのですが

最近Cの勉強を始めました。 [visual C++ 2008]を使用しています。 文字列の勉強をしていて参考書の例題を打ちました。 下のが打ち込んだプログラムの一部です。 #include<math.h> #include<stdio.h> #include<string.h> void wait(int tm) {  int i, j;  for(i = 1; i < tm; i++)  for(j = 1; j < tm; j++){   double x = sin(i)*cos(j);  } } ビルドを行った際に error C2668: 'sin' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照) error C2668: 'cos' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照) 例題と何度も見比べたのですが、写し間違いはなく何度打ちなおしても同様のエラーが出てしまいます。 解決法を教えていただけないでしょうか。

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

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.2

「オーバロード関数」は似て非なる言語C++の機能で、Cにはありません。 C言語ではなくC++としてコンパイルしてるような気もします。 プロジェクトのプロパティ詳細「コンパイル言語の選択」は どうなっていますか。 「C++として…」を「Cとして…」にしたらどうなりますか。

syamusuke
質問者

お礼

回答ありがとうございます。 ご指摘通りやったらコンパイルできました。 ありがとうございました。

その他の回答 (3)

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

C++のままで問題を解決するのであれば、 double x = sin(static_cast<double>(i))*cos(static_cast<double>(j)); のようにdouble(またはfloatまたはlong double)でキャストしてください。 C++のsinやcosは、float版、double版、long double版が多重定義(オーバーロード)されていますので、int型の実引数を与えるとどれを選べばよいのかコンパイラが分からなくなります。

syamusuke
質問者

お礼

回答ありがとうございます。 無事コンパイルできました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

#2 の通りです. C++ としてコンパイルされてます.

syamusuke
質問者

お礼

回答ありがとうございます。 無事コンパイルできました。

  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.1

math.h で定義されている sin() 関数のプロトタイプ宣言を確認すれば解決すると思います。

syamusuke
質問者

お礼

回答ありがとうございます。 無事コンパイルできました。

関連するQ&A

  • 「関数ポインタとして評価されない式」?(sin波)

    知っている(ある程度のプログラミング知識がある)方にはばかばかしい内容かもしれませんが・・・。 sin波とcos波を描くものをC++でプログラミングしている途中です。 いざ実行!と思ってコンパイルすると、「関数ポインタとして評価されない式を使って、関数を呼び出そうとしました。」と出たのですが、何が原因かわかりません。 プログラム内容↓ #include <stdio.h> #include <math.h> #define PAI 3.14 (中略・ペン設定など) double j=0.0, sinwave[400]; int x0=50, y0=50, i=0; while(i<400){   for(j=0.0; j<=PAI; j=j+0.1){ sinwave[i]=sin(j); ●ここが原因らしい   }   i++; } (後略・ペンdeleteなど) math.hもあるし、特に変なところはないと思います。 また、そのあとにMoveTo,LineToでsin波を描きたいのですが、 for文で繰り返し MoveTo(x0+sin[i],?) LineTo(x0+sin[i+1],?) の、はてなの部分に何を入れればよいかわかりません。(x0:勝手にきめた原点)x0+sin[i]も、これで良いのか「?」です・・・。 お願いします。

  • SetPixel関数のmath.h

    WindowsXPのノートでVisualC++2008ExpressEditionを使っています。 SetPixel関数で円を描くプログラムで、math.hの問題だと思われる4つのエラーでコンパイルできません。 宣言は #include<windows.h> #include<math.h> ウィンドウプロシージャ内で switch (msg) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); for (i = a - r;i <= a + r; i++) { x = i; y = (int)sqrt(pow(r, 2) - pow(x - a, 2)) + b;←96行目 SetPixel(hdc, x, y, RGB(0, 0, 0)); y = (int)-sqrt(pow(r, 2) - pow(x - a, 2)) + b;←98行目 1>c:\documents and settings\REI\my documents\visual studio 2008\projects\setpixel01\setpixel01\setpixel01.cpp(96) : error C2668: 'pow' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照) 1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(575): 'long double pow(long double,int)' の可能性があります。 1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(527): または 'float pow(float,int)' 1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(489): または 'double pow(double,int)' 1> 引数リスト '(int, int)' を一致させようとしているとき 同じ内容のエラーが96行目なのが2回、98行目なのが2回出ます。math.hを編集すればいいんでしょうか?gccならコマンドラインから-lmでいいかもしれないんですが。自分の入力ミスはないと思います。 どなたかお分かりになる方、教えていただけないでしょうかm(_ _)m

  • うまく出力されない

    #include <stdio.h> #include <math.h> int main(void) { int j=0; double t,i[500]; for(t=0;t<=20*pow(10,-3);t=t+(0.04*pow(10,-3)) ){ i[j]=(3.9*pow(10,-12)*5*pow(10,3)*(sin(314*(t+(0.04*pow(10,-3))))-sin(314*t)))/(0.04*pow(10,-3)); printf("%3d %1.10f\n",j,i[j]); j++; } } これを出力させたところ、202番以降からしか表示されませんでした。 これはなぜなのでしょうか? 分かる方がいたら、ぜひ、解決法を教えてもらえませんか? 宜しくお願いします。

  • 二重ループのあるプログラム(C言語)

    #include <stdio.h> int main(void) { int i, j, c, c2; c = 0; for(i = 100; i < 1000; i++) { c2 = 0; for(j = 1; j <= i; j++) { if (i % j == 0) c2++; } if (c2 % 2 == 1) c++; } printf("%d個です。\n", c); return 0; } というプログラムがあるのですが、2重ループ部分のそれぞれのループに対応して、 2つの関数として独立させるとどのようになりますか? また、2つの関数のいずれにおいても、ループを用いずに再帰呼び出しを用いるとどうなりますか?

  • Cプログラミングの質問です。

    方程式2.0*pow(10,-15)*pow(38.6,x)-2.73-0.909x=0の解xを二分法により求め、それを”atai=××”と表示させるプログラムを書こうと思っているのですが、エラーがでてしまい、さらにどこを直していいかわかりません。 詳しい方がおられましたら、アドバイスをいただけたらと思います。よろしくお願いいたします。 <エラー内容> 「コンパイルしています... tom.cpp .\tom.cpp(34) : error C2668: 'pow' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照) C:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(575): 'long double pow(long double,int)' の可能性があります。 C:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(527): または 'float pow(float,int)' C:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(489): または 'double pow(double,int)' 引数リスト '(int, int)' を一致させようとしているとき .\tom.cpp(34) : error C2059: 構文エラー : 'サフィックスが無効です。' .\tom.cpp(34) : error C2146: 構文エラー : ';' が、識別子 'x' の前に必要です。 ビルドログは "file://c:\Documents and Settings\satoutakaaki\デスクトップ\file\tom\tom\Debug\BuildLog.htm" に保存されました。 tom - エラー 3、警告 0」 <プログラム> #include "stdafx.h" #include <stdio.h> #include <math.h> double fx(double x); int main (void){ double x1=-1000; double x2=1000; double xn; double y; int i=0; for(i=1;i<100;i++) { xn=0.5*(x1+x2); y=fx(xn); if(y>0) {x1=x1/2+x2/2;} if(y<0) {x2=x1/2+x2/2;} i=i+1; } printf("atai=%f",xn); return 0; } double fx(double x) { double z; z=2.0*pow(10,-15)*pow(38.6,x)-2.73-0.909x; return z; }

  • C言語について教えてください。

    C言語について教えてください。 C言語ソフト「C言語をはじめよう」で、sin,cos,tanを求めたり、計算(sin=cos*tanや、sin^2(sinの二乗)+cos^2(cosの二乗)=1や、cos=sin/tan,tan=sin/cos)するプログラムを作りたくて、ネットを見たのですが、全然意味がわかりません。 また、√(平方根)の表示や、計算する(1/√3^2(√3分の1の二乗)*√3見たいな計算)プログラムを作りたいと思いますが、こちらも同様です。 #include<stdio.h> #include<math.h> int main(void) ここまではわかりますが、ここから先がわかりません。 どなたか。詳しくわかりやすく、入力例などをよろしくお願いします。 また、上記のプログラムや、書き方が違いましたら、こちらもご指摘お願いします。 なるべく早く、ご解答ください。

  • sprintf 初歩的な質問

    お世話になっております。 最近独学でC言語の勉強を始めたのですが型の違う値の代入に関して わからないことがあり質問します。 ■やりたいこと■ char型dataの値を2で割った余りを char型ansの[0]から順番に格納してく。 (2の補数を取るためにこのような処理を 考えています(10進を24ビット2進へ変換したい)) ■コード■ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<windows.h> int main(){ char data[256]="9"; int y; int i; char ans[25]; char* p_ans = ans; y=atoi(data); for(i=0;i<24;i++){ sprintf(ans[i], "%d",y%2); //←エラー y = y/2; } } ■質問■ 上記ソースの中のエラー部分をどのように記述していいのか わかりませんでした。初心者的な発想でポインタを使う方法はと思い sprintf(*(p_ans+i),"%d",y%2); というような記述も試してみましたが駄目でした。 この部分をどのように書いたらいいか詳しい方、教えていただけると 助かります。以上、よろしくお願いします。

  • C言語のqsortについて

    現在、qsortのコードに取り組んでいます。 if (strcmp(ad, "ASC") == 0) { qsort(sin, sizeof(cnt), sizeof(sin[0]), cmp_u); } else { qsort(sin, sizeof(cnt), sizeof(sin[0]), cmp_d); } 恐らくこちらのqsortでの第二引数が書き方を間違えていると思うのですが、修正の方法が分からず、どなたか教えて頂けないでしょうか? #include <stdio.h> #include <time.h> #include <string.h> #include <stdlib.h> static char ad[10]; int cmp_u(const void* a, const void* d) { return strcmp((char*)a, (char*)d); } int cmp_d(const void* a, const void* d) { return strcmp((char*)d, (char*)a); } int main() { int num1, num2; char op; float answer; int r,i; FILE* fp; char c[11]; char sin[1000][1000]; char ad[8]; fp = fopen("log.txt", "a+"); if (fp == NULL) { printf("ファイルオープン失敗\n"); return -1; } while (1) { r = scanf("%d%c%d", &num1, &op, &num2); if (r != 3) { puts("input error"); return 1; } if (op == '+') { answer = num1 + num2; } else if (op == '-') { answer = num1 - num2; } else if (op == '*') { answer = num1 * num2; } else if (op == '/') { answer = (float)num1 / num2; } time_t t = time(NULL); struct tm* tm = localtime(&t); printf("%d/%02d/%02d ", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday); printf("%02d:%02d:%02d ", tm->tm_hour, tm->tm_min, tm->tm_sec); printf("%d%c%d,%f\n", num1, op, num2, answer); fprintf(fp, "%d/%02d/%02d ", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday); fprintf(fp, "%02d:%02d:%02d ", tm->tm_hour, tm->tm_min, tm->tm_sec); fprintf(fp, "%d%c%d,%f\n", num1, op, num2, answer); printf("計算を続けますか?"); scanf("%s\n", &c); if (strcmp(c, "no") == 0) { break ; } } fclose(fp); fp = fopen("log.txt", "r"); int cnt = 0; for (i = 0;i < 1000;i = i + 1) { if (fgets(sin[i], sizeof(sin[0]), fp)) ++cnt; else break; } fclose(fp); printf("ASC or DESC: "); scanf("%s", ad); if (strcmp(ad, "ASC") == 0) { qsort(sin, sizeof(cnt), sizeof(sin[0]), cmp_u); } else { qsort(sin, sizeof(cnt), sizeof(sin[0]), cmp_d); } for (i = 0;i < cnt;i = i + 1) { printf("%s", sin[i]); } return 0; }

  • atan2 オーバーロード関数の呼び出しを解決することができません

    はじめまして。 超初心者のものです。 かなり古いMayaのプラグインのソースファイルをコンパイルすることになり、以下のようなエラーが出てどうにも解決することができません。 1>.\MayaMath.cpp(164) : error C2668: 'atan2' : オーバーロード関数の呼び出しを解決することができません。(新機能 ; ヘルプを参照) 1> C:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(547): 'long double atan2(long double,long double)' の可能性があります。 1> C:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(499): または 'float atan2(float,float)' 1> C:\Program Files\Microsoft Visual Studio 8\VC\include\math.h(110): または 'double atan2(double,double)' 大変申し訳ないのですが、こういった場合の回避の仕方 などご存じの方がいましたらよろしくお願いいたします。

  • C言語にてsin,cosは何?

    C言語でsin、cosを計算したところ、答えが違っていました。 netで探したところ<math.h>をincludeしていないせいだとわかったのですが、 <math.h>を指定しなかったら何を計算しているんでしょうか? Visual Studio 2013 win7 #include<stdio.h> #include <math.h> int main(void){ printf("結果=%f\n",sin(0.5)); }