Borlandで宣言が正しく終了していないエラーが発生する原因と解決方法

このQ&Aのポイント
  • Borlandでコンパイルしようとすると「宣言が正しく終了していない」というエラーが発生します。解決方法を教えてください。
  • 学校の課題でBorlandでコンパイルしたいのですが、どうすればいいのか分かりません。ソースコードを載せています。
  • 質問者はBorlandとVisual C++の両方を使用していて、Visual C++ではコンパイルと実行ができるが、Borlandでは宣言が正しく終了していないエラーが出ます。Borlandでコンパイルする方法を教えてください。
回答を見る
  • ベストアンサー

visual C++だとコンパイルできるのに、borlandだとできません。

borlandと、VisualC++の両方使っているのですが、VisualC++だとコンパイルでき、実行できます。 しかし、Borlandでコンパイルしようとすると、「宣言が正しく終了していない」とエラーが出てしまいます。 学校の課題で、Borlandでコンパイルしたいのですが、どうすればいいのか分かりません。 ソースを載せるので、どこがいけないのか、教えてください。 sin(x)の値を入力して、x度を求めるプログラミングです。 #include<stdio.h> #include<math.h> int main(void) { double x_mid, x0=0, x1=90, y_mid, y0, y1, M_PI=3.14159265358979; float y_ans; printf("sin(x)はいくつ?\n"); scanf("%f", &y_ans); for( ; ;) { x_mid=0.5*(x0+x1); y0=sqrt(1-cos(M_PI*x0/180)*cos(M_PI*x0/180)); y1=sqrt(1-cos(M_PI*x1/180)*cos(M_PI*x1/180)); y_mid=sqrt(1-cos(M_PI*x_mid/180)*cos(M_PI*x_mid/180)); if(y0-y_ans>0 || y1-y_ans<0) { printf("答えが出ません。もう一度sin(x)は?\n"); scanf("%f", &y_ans); continue; } if(fabs(y0-(double)y_ans) <= 0.000000001) break; else if((double)y_ans < y_mid) { x1=x_mid; } else { x0=x_mid; } } printf("sin(x)=%fのとき、xは%f度\n",y_ans, x0); return 0; }

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

BorlandC++の場合Math.hのなかで無条件で M_PIをdefineしてるのでご質問のような現象になると思われます #include <Math.h> のつぎに #ifdef M_PI #undef M_PI #endif の3行を追加してみましょう これは M_PIがマクロ定義(#defineによる定義)がされているなら その定義を解除するという記述です Borlandの場合 double x_mid, x0=0, x1=90, y_mid, y0, y1, M_PI=3.14159265358979; の記述が プリプロセス(マクロの置換など)により double x_mid, x0=0, x1=90, y_mid, y0, y1, 3.14159265358979323846=3.14159265358979; といった 定数項に定数項の初期値を代入するといった宣言文になってしまうためにご質問のようなエラーになります VC++の場合 6.0以前は M_PIマクロの定義がないようです 2003以降は math.hで定義されていますが『_USE_MATH_DEFINES』をマクロ定義に追加しないと有効になりません

4arrow8
質問者

お礼

無事、コンパイルできました! ありがとうございます。 なるほど。borlandとVC++で、そんな違いがあったんですね。 何か違いがあるんだろうとは思っていたのですが、自分で調べても、全く分からなかったので、とても助かりました!!

その他の回答 (1)

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

>学校の課題で、Borlandでコンパイルしたいのですが、どうすればいいのか分かりません。 コンパイラに怒られた箇所を修正するだけです。 そして定数 M_PI は math.h に定義されているはず。

関連するQ&A

  • C言語で質問です。

    C言語で質問です。 F1=2*((4*sqrt(2)*cos(y)/sin(x+y))-4) F2=1*((4*sqrt(2)*cos(x)/sin(x+y))-4) という式を、 double f1(double x,double y) {return F1*sin(x)-F2*sin(y);} という部分のF1,F2に代入したいのですが、何を使えばいいのでしょうか。 いろいろ試したのですがエラーが出てしまいます。教えてください。

  • C言語のプログラミングがうまくいきません!

    とりあえず、自分でプログラムしましたが、どこか間違っているようです。僕のプログラムを載せますので、どこが間違っているのか教えて下さい。あと、正しいプログラムを書いていただければ幸いです。 3つの辺の長さをx、y、zに代入して三角形が成立すれば、その形状と面積をヘロンの公式を使って求める。 #include <stdio.h> #include <math.h> { double x ,y, z ,error ,menseki ,ans; printf("x ?") scanf("%f" , &x); printf("y ?") scanf("%f" , &y); printf("z ?") scanf("%f" , &z); ans=(x+y+z)/2; menseki=sqrt(ans*(ans-x)*(ans-y)*(ans-z)); if (x === y || y == z || x == z) { printf ("正三角形です"); printf("面積は%dです" , menseki); } else if (x == y || y == z || z == x) { printf("二等辺三角形です"); printf("面積は%dです" , menseki); } else { printf("三角形です"); printf("面積は%dです , menseki); if(x<y+z || y<x+z || z<x+y) { printf("error"); } }

  • Cのソースコード について

    使用言語はCです。 #include<stdio.h> #include<math.h> int main(void) { double x = 0, y = 0; while (1) { double arg2 = M_PI / 90; int arg1 = 90; int Arg = 0, Len = 0; scanf_s("%d,%d", &Len, &Arg); if (Len == 0 && Arg == 0) { break; } else { arg1 -= Arg; arg2 += (arg1 % 360)*M_PI / 180; x += cos(arg2)*Len; y += sin(arg2)*Len; } } printf("%d\n%d\n", (int)x, (int)y); while (1) {} return 0; } このコードをvisual studio でコンパイルしようとすると、 M_PIは定義されていない とエラーになってしまいます。 M_PIはmath.hに含まれているということでつかったのですが・・・・

  • C言語のプログラミングがうまくいきません!

    先日のプログラムを作り直しました。アドバイスのおかげでエラーは減りましたが、まだ完ぺきではないようです。恐らく、elseのところがいけないと思うのですが、どうしたらいいか分かりません。 ご指摘お願いします。 #include <stdio.h> #include <math.h> void main(void) { double x ,y ,z ,error ,menseki ; double ans; printf("x ?"); scanf("%lf", &x); printf("y ?"); scanf("%lf", &y); printf("z ?"); scanf("%lf", &z); if(x<y+z || y<x+z || z<x+y) { ans=(x+y+z)/2; menseki=sqrt(ans*(ans-x)*(ans-y)*(ans-z)); } if(x==y && y==z && z==x) { printf("正三角形です"); printf("面積は%lfです" , menseki); } else if(x==y || y==z || z==x) { printf("二等辺三角形です"); printf("面積は%lfです" , menseki); } else { printf("三角形です"); printf("面積は%lfです" , menseki); } else { printf("error"); } }

  • C言語を実行すると-infが出てきて困っています。

    C言語を実行すると-infが出てきて困っています。 コンパイラはgccを使っています。 よろしくお願いします。 #include <stdio.h> #include <math.h> #include <stdlib.h> #define data 100//計算回数 double seiki(void)//正規乱数 { double n; double i; double y; double x1,x2; double sigma; double mean; double Pi = 2*asin(1); sigma = 1; mean = 0; { x1 = (double)rand()/(RAND_MAX); x2 = (double)rand()/(RAND_MAX); y = sigma*sqrt(-2*log(x1))*sin(2*Pi*x2) + mean; //printf("%f\n",y); } return (y); } int main(void) { double* price; int i, j, k; double a, b, c; //メモリ確保 price=(double*)malloc(sizeof(double)*data+10); for(i = 0;i<data;i++) { price[i+1] = price[i]+seiki(); printf("%lf\n",price[i+1]); } return 0; }

  • c言語

    c言語で写真の課題を出されたのですが自分のプログラムでは上手くいきません。どこが間違っているのか教えて欲しいです。 自分のプログラム #include<stdio.h> #include<math.h> int main(){ int i,j; double c,d,x,y,z; for(i=0;i<=360;i++){ c=10*cos(i*M_PI/180); d=10*sin(i*M_PI/180); if(c>=0 && d>=0){ for(j=0;j<=1000;j++){ x=0.001*j; y =x*d/c; z=1-x*x-(sqrt(x)+y)*(sqrt(x)+y); if(z<=0.0){break;} } } if(c<=0 && d>=0){ for(j=0;j<=1000;j++){ x=-0.001*j; y=x*d/c; z=1-x*x-(sqrt(-x)+y)*(sqrt(-x)+y); if(z<=0.0){break;} } } if(c<=0 && d<=0){ for(j=0;j<=1000;j++){ x=-0.001*j; y=x*d/c; z=1-x*x-(sqrt(-x)+y)*(sqrt(-x)+y); if(z<=0.0){break;} } } if(c>=0 && d<=0){ for(j=0;j<=1000;j++){ x=0.001*j; y=x*d/c; z=1-x*x-(sqrt(x)+y)*(sqrt(x)+y); if(z<=0.0){break;} } } printf("x=%lf y=%lf z=%lf\n",x,y,z); } return(0); }

  • 任意の標準偏差で正規分布の乱数を発生させたい

    2次元の正規分布の乱数を発生させたいんですが、 調べたところ、 平均0、分散1の正規分布の乱数の発生方法アルゴリズムが以下のものになることがわかりました。 「Box-Maller法:区間(0,1)の2個の一様乱数x1,x2と2個の量y1,y2との間の変換 y1=sqrt(-2*ln(x1))*cos(2*Pi*x2) y2=sqrt(-2*ln(x1))*sin(2*Pi*x2)」 ここで、平均0、分散0.2の正規分布の乱数を発生させたいのですが、どうすればよいでしょうか? 単純にy1,y2に0.2を掛けるだけでもできますが、これは数学的に正しいのでしょうか?

  • C言語でのfunctionを使い方を教えてください

    http://codepad.org/vyQ5fYTk web上のコンパイラを使ってベッセル関数の計算を行いたいのですが、 以下は、書籍からそのままコピーしてきたベッセル関数の計算です。 #include <math.h> float bessj0(float x) { float ax,z; double xx,y,ans,ans1,ans2; if ((ax=fabs(x)) < 8.0) { y=x*x; ans1=57568490574.0+y*(-13362590354.0+y*(651619640.7 +y*(-11214424.18+y*(77392.33017+y*(-184.9052456))))); ans2=57568490411.0+y*(1029532985.0+y*(9494680.718 +y*(59272.64853+y*(267.8532712+y*1.0)))); ans=ans1/ans2; } else { z=8.0/ax; y=z*z; xx=ax-0.785398164; ans1=1.0+y*(-0.1098628627e-2+y*(0.2734510407e-4 +y*(-0.2073370639e-5+y*0.2093887211e-6))); ans2 = -0.1562499995e-1+y*(0.1430488765e-3 +y*(-0.6911147651e-5+y*(0.7621095161e-6 -y*0.934945152e-7))); ans=sqrt(0.636619772/ax)*(cos(xx)*ans1-z*sin(xx)*ans2); } return ans; } printf(bessj0(5)) 最後にprintfを使って値を出力したいのですが、 どうしてもここで Line 28: error: expected constructor, destructor, or type conversion before '(' token compilation terminated due to -Wfatal-errors. というエラーが出てしまいます。 LanguageはC++に指定しましたが、うまくいかないのですが、 どのようにすれば良いでしょうか?

  • はさみうち法のプログラム(C言語)について

    調べたりしながら私なりに書いてみたのですが上手くいきません。 「ans=1.048404」とならなければいけないのに 「nan」で返ってきてしまうのです。 どこをどの様に変えたら良いのでしょうか・・・? ※課題の締め切りが近いので,早急にご回答宜しくお願い致します! 以下、はさみうちのプログラム↓ #include<stdio.h> #include<math.h> /*初期値x0,*/ /*f(x)を定義*/ double f(double x){ return sqrt(x*x+10.0) - 10.0*exp(-x*x); } /*はさみうち法の関数*/ double hasamiuchi(double x0,double x1,double eps,double imax){ double x2; /*x軸との交点*/ int i; /*繰り返しの回数*/ if(f(x0)*f(x1)>0){/*x0とx1が同符号の場合x1をx0とする*/ x0=x1; } for(i=0;i<imax;i++){ x2=(x1*f(x0)-x0*f(x1))/(f(x0)-f(x1)); /*x0とx1で出来る直線とx軸の交点x2を求める*/ x1=x2; /*x2の値を次のループにおけるx1とする*/ } if(fabs(x1-x0)<eps) return x2; /*収束したら解x2を返す*/ return 0.0/0.0; /*収束しなかったらnanを返す*/ } int main(void){ printf("ans = %f\n", hasamiuchi(2.0,1.0,1e-6,20));/*値を代入してはさみうちの実行*/ return 0; }

  • 2次方程式の解 Cプログラミング

    C言語でのプログラムの添削をお願いします。 2次方程式の解を求めるものなのですが。 #include<stdio.h> #include<math.h> main(){ double a,b,c,d; double x1=0; double x2=0; scanf("%lf %lf %lf" ,&a,&b,&c); printf("a=%f b=%f c=%f\n" ,a,b,c); d=b*b-4*a*c; if(d>0){ x1=(-b+sqrt(d))/2*a; x2=(-b-sqrt(d))/2*a; printf("x=%f,%f\n" ,x1,x2); }else if(d<0){ x1=-b/2*a; x2=sqrt(-d)/2*a; printf("x=%f+%fi,%f-%fi\n" ,x1,x2,x1,x2); }else{ printf("x=%f\n" ,x1); } return 0; } このとき、 a=-7,b=2,c=-1 を与えると x=7.000000+-17.146428i,7.000000--17.146428i という値が返ってきます。 他にも、虚数解のときに間違った値が返ってきてしまう気がするのですが、いかがでしょうか? 実数解のときは正しいようです。 回答よろしくお願いします。

専門家に質問してみよう