プログラムが動きません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

プログラムが動きません

#1

投稿記事 by » 14年前

このようなプログラムを作りました。でもエラーがでてしまい、どのように直せばよいかわかりません

コード:

 #include<stdio.h>
#include<math.h>
#define MAX 1000

void main(void){
int i;
double x[MAX],y[MAX];
double t,dt;
double v0x,v0y,v0,g,e1,e2,x0;


scanf("%lf",&v0x);
scanf("%lf",&v0y);
scanf("%lf",&v0);
scanf("%lf",&g);
scanf("%lf",&e1);
scanf("%lf",&e2);


FILE *fp;
dt=0.01;
fp=fopen("kekka.csv","w");

x0=0;
y0=0;
for(i=0;i<x0/v0*dt;i++){
	t=i*dt;
	x=v0x*t+x0;
}
x0=e1*v0x;
y0=0;
for(i=0;i<sqrt[2vo/g];i++){
	x=e1*v0x*t;
	y=y0-1/2*g*t*t;
}


x0=0;
while(v0y>0.1){
		for(i=0;i<2*v0y/g/dt;i++){
			t=i*dt;
			x[i]=x0+v0x*t;
			y[i]=v0y*t-g*t*t/2;
			fprintf(fp,"%f,%f\n",x[i],y[i]);
		}
		x0=x0+2*v0x*v0y/g;
		v0y=e1*v0y;
	}


fclose(fp);
}
このようなメッセージが出ます。
1>------ ビルド開始: プロジェクト: 最終課題, 構成: Debug Win32 ------
1>コンパイルしています...
1>物体の運動.cpp
1>c:\users\eri\documents\visual studio 2005\projects\最終課題\最終課題\物体の運動.cpp(12) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 8\vc\include\stdio.h(295) : 'scanf' の宣言を確認してください。
1>c:\users\eri\documents\visual studio 2005\projects\最終課題\最終課題\物体の運動.cpp(13) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 8\vc\include\stdio.h(295) : 'scanf' の宣言を確認してください。
1>c:\users\eri\documents\visual studio 2005\projects\最終課題\最終課題\物体の運動.cpp(14) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 8\vc\include\stdio.h(295) : 'scanf' の宣言を確認してください。
1>c:\users\eri\documents\visual studio 2005\projects\最終課題\最終課題\物体の運動.cpp(15) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 8\vc\include\stdio.h(295) : 'scanf' の宣言を確認してください。
1>c:\users\eri\documents\visual studio 2005\projects\最終課題\最終課題\物体の運動.cpp(16) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 8\vc\include\stdio.h(295) : 'scanf' の宣言を確認してください。
1>c:\users\eri\documents\visual studio 2005\projects\最終課題\最終課題\物体の運動.cpp(17) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 8\vc\include\stdio.h(295) : 'scanf' の宣言を確認してください。
1>c:\users\eri\documents\visual studio 2005\projects\最終課題\最終課題\物体の運動.cpp(22) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 8\vc\include\stdio.h(234) : 'fopen' の宣言を確認してください。
1>c:\users\eri\documents\visual studio 2005\projects\最終課題\最終課題\物体の運動.cpp(25) : error C2659: '=' : 関数が演算子の左辺にあります
1>c:\users\eri\documents\visual studio 2005\projects\最終課題\最終課題\物体の運動.cpp(28) : error C2440: '=' : 'double' から 'double [1000]' に変換できません。
1> 配列型への変換はありませんが、参照またはポインタから配列への変換があります。
1>c:\users\eri\documents\visual studio 2005\projects\最終課題\最終課題\物体の運動.cpp(31) : error C2659: '=' : 関数が演算子の左辺にあります
1>c:\users\eri\documents\visual studio 2005\projects\最終課題\最終課題\物体の運動.cpp(32) : error C2059: 構文エラー : 'サフィックスが無効です。'
1>c:\users\eri\documents\visual studio 2005\projects\最終課題\最終課題\物体の運動.cpp(32) : error C2146: 構文エラー : ']' が、識別子 'vo' の前に必要です。
1>c:\users\eri\documents\visual studio 2005\projects\最終課題\最終課題\物体の運動.cpp(32) : error C2563: 仮パラメータ リストまたは関数へのポインタが、適合していません。
1>c:\users\eri\documents\visual studio 2005\projects\最終課題\最終課題\物体の運動.cpp(32) : error C2059: 構文エラー : ')'
1>c:\users\eri\documents\visual studio 2005\projects\最終課題\最終課題\物体の運動.cpp(32) : error C2143: 構文エラー : ';' が '{' の前にありません。
1>c:\users\eri\documents\visual studio 2005\projects\最終課題\最終課題\物体の運動.cpp(33) : error C2440: '=' : 'double' から 'double [1000]' に変換できません。
1> 配列型への変換はありませんが、参照またはポインタから配列への変換があります。
1>c:\users\eri\documents\visual studio 2005\projects\最終課題\最終課題\物体の運動.cpp(34) : error C2296: '-' : 無効です。左オペランドには型 'double (__cdecl *)(double)' が指定されています。
1>ビルドログは "file://c:\Users\eri\Documents\Visual Studio 2005\Projects\最終課題\最終課題\Debug\BuildLog.htm" に保存されました。
1>最終課題 - エラー 10、警告 7
========== ビルド: 0 正常終了、1 失敗、0 更新、0 スキップ ==========

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: プログラムが動きません

#2

投稿記事 by h2so5 » 14年前

ざっと見た限りですと、

コード:

 #include<stdio.h>
#include<math.h>
#define MAX 1000
 
void main(void){
	int i;
	double x[MAX],y[MAX];
	double t,dt;
	double v0x,v0y,v0,g,e1,e2,x0;
	 
	 
	scanf("%lf",&v0x);
	scanf("%lf",&v0y);
	scanf("%lf",&v0);
	scanf("%lf",&g);
	scanf("%lf",&e1);
	scanf("%lf",&e2);
	 
	 
	FILE *fp;
	dt=0.01;
	fp=fopen("kekka.csv","w");
	 
	x0=0;
	y0=0;					//y0の宣言がない
	for(i=0;i<x0/v0*dt;i++){
	    t=i*dt;
	    x=v0x*t+x0;
	}
	x0=e1*v0x;
	y0=0;					
	for(i=0;i<sqrt[2vo/g];i++){	//sqrtという配列は宣言されていない
	    x=e1*v0x*t;				//x,yは配列なので数値は代入できない
	    y=y0-1/2*g*t*t;		   //y0の宣言がない
	}
	 
	 
	x0=0;
	while(v0y>0.1){
	        for(i=0;i<2*v0y/g/dt;i++){
	            t=i*dt;
	            x[i]=x0+v0x*t;
	            y[i]=v0y*t-g*t*t/2;
	            fprintf(fp,"%f,%f\n",x[i],y[i]);
	        }
	        x0=x0+2*v0x*v0y/g;
	        v0y=e1*v0y;
	    }
	 
	 
	fclose(fp);
}

Re: プログラムが動きません

#3

投稿記事 by » 14年前

ありがとうございます。
x,yは配列なので数値は代入できない。とのことですが、どのように改善すればよいですか?
これは、壁にボールを投げ跳ね返り床をバウンドするというものなんです。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: プログラムが動きません

#4

投稿記事 by h2so5 » 14年前

ヒント:whileの中でどうやってx,yに代入しているかよく見てください。

Re: プログラムが動きません

#5

投稿記事 by » 14年前

ありがとうございます!
あと、scanfの宣言を確認してください。とでます。なぜですか?

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: プログラムが動きません

#6

投稿記事 by bitter_fox » 14年前

光 さんが書きました: あと、scanfの宣言を確認してください。とでます。なぜですか?
これは、警告ですので、あんまり気にする必要はないですが、なぜかというと、
scanfには、バッファオーバーフロの危険性があるため、マイクロソフトは、「scanfではなくよりセキュアなscanf_sを使ってくださいね~」と警告を出してるわけです。

MSDN(scanf): http://msdn.microsoft.com/ja-jp/library ... 80%29.aspx

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: プログラムが動きません

#7

投稿記事 by h2so5 » 14年前

scanfが安全ではないという警告ですが、今回のような場合は無視して構いません。

プログラムの先頭に
#define _CRT_SECURE_NO_WARNINGS
と書くと、警告が出なくなります。

Re: プログラムが動きません

#8

投稿記事 by » 14年前

ありがとうございます。

コード:

 #include<stdio.h>
#include<math.h>
#define MAX 1000
#define _CRT_SECURE_NO_WARNINGS
 
void main(void){
    int i;
    double x[MAX],y[MAX];
    double t,dt;
    double v0x,v0y,v0,g,e1,e2,x0,y0,sqrt;
     
     
    scanf("%lf",&v0x);
    scanf("%lf",&v0y);
    scanf("%lf",&v0);
    scanf("%lf",&g);
	scanf("%lf",&x0);
	scanf("%lf",&y0);
    scanf("%lf",&e1);
    scanf("%lf",&e2);
     
     
    FILE *fp;
    dt=0.01;
    fp=fopen("kekka.csv","w");
     
    x0=0;
    y0=0;                   
    for(i=0;i<x0/v0*dt;i++){
        t=i*dt;
        x[i]=v0x*t+x0;
		fprintf(fp,"%f\n",x[i]);
    }
    x0=e1*v0x;
    y0=0;                   
    for(i=0;i<sqrt(2v0/g);i++){ 
        x[i]=e1*v0x*t;             
        y[i]=y0-1/2*g*t*t;  
        fprintf(fp,"%f,%f\n",x[i],y[i]);
    }
     
     
    x0=0;
    while(v0y>0.1){
            for(i=0;i<2*v0y/g/dt;i++){
                t=i*dt;
                x[i]=x0+v0x*t;
                y[i]=v0y*t-g*t*t/2;
                fprintf(fp,"%f,%f\n",x[i],y[i]);
            }
            x0=x0+2*v0x*v0y/g;
            v0y=e1*v0y;
        }
     
     
    fclose(fp);
} 
 
としましたが、まだ動きません。直す部分はありますか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: プログラムが動きません

#9

投稿記事 by h2so5 » 14年前

どのように動かないのか、エラーメッセージなどを教えてください。

Re: プログラムが動きません

#10

投稿記事 by » 14年前

1>c:\users\eri\documents\visual studio 2005\projects\最終課題\最終課題\物体の運動.cpp(31) : error C2440: '=' : 'double' から 'double [1000]' に変換できません。
1> 配列型への変換はありませんが、参照またはポインタから配列への変換があります。
1>c:\users\eri\documents\visual studio 2005\projects\最終課題\最終課題\物体の運動.cpp(36) : error C2059: 構文エラー : 'サフィックスが無効です。'
1>c:\users\eri\documents\visual studio 2005\projects\最終課題\最終課題\物体の運動.cpp(36) : error C2146: 構文エラー : ')' が、識別子 'v0' の前に必要です。
1>c:\users\eri\documents\visual studio 2005\projects\最終課題\最終課題\物体の運動.cpp(36) : error C2064: 1 引数を取り込む関数には評価されません。
1>c:\users\eri\documents\visual studio 2005\projects\最終課題\最終課題\物体の運動.cpp(36) : error C2059: 構文エラー : ')'
1>c:\users\eri\documents\visual studio 2005\projects\最終課題\最終課題\物体の運動.cpp(36) : error C2143: 構文エラー : ';' が '{' の前にありません。
とでました。

box
記事: 2002
登録日時: 14年前

Re: プログラムが動きません

#11

投稿記事 by box » 14年前

> double v0x,v0y,v0,g,e1,e2,x0,y0,sqrt;

sqrtっていう変数の定義は、いりません。
平方根を求める「関数の」名前で、プロトタイプがmath.hで宣言してあります。

> for(i=0;i<sqrt(2v0/g);i++){

2v0っていう、先頭が数字で始まる変数は認められていないはずです。

> y=y0-1/2*g*t*t;

1/2
の結果は、ゼロとなります(整数同士の割り算だから)。その結果、yに入る値は、たぶん正しくないでしょう。


他にも、正しくない箇所があるかもしれませんが、プログラムの中身がわからないので、
私が論評できるのはここまでです。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Re: プログラムが動きません

#12

投稿記事 by » 14年前

ありがとうございます。このプログラムは、ボールを壁に投げ跳ね返り床をバウンドするものです。

作り直した結果、このようなエラーがでました。
1>c:\users\eri\documents\visual studio 2005\projects\最終課題\最終課題\物体の運動.cpp(31) : error C2440: '=' : 'double' から 'double [1000]' に変換できません。
1> 配列型への変換はありませんが、参照またはポインタから配列への変換があります。

コード:

#include<stdio.h>
#include<math.h>
#define MAX 1000
#define _CRT_SECURE_NO_WARNINGS
 
void main(void){
    int i;
    double x[MAX],y[MAX];
    double t,dt;
    double v0x,v0y,v0,g,e1,e2,x0,y0;
     
     
    scanf("%lf",&v0x);
    scanf("%lf",&v0y);
    scanf("%lf",&v0);
    scanf("%lf",&g);
	scanf("%lf",&x0);
	scanf("%lf",&y0);
    scanf("%lf",&e1);
    scanf("%lf",&e2);
     
     
    FILE *fp;
    dt=0.01;
    fp=fopen("kekka.csv","w");
     
    x0=0;
    y0=0;                   
    for(i=0;i<x0/v0*dt;i++){
        t=i*dt;
        x=v0x*t+x0;
		
    }
    x0=e1*v0x;
    y0=0;                   
    for(i=0;i<sqrt(v0/g);i++){ 
        x[i]=e1*v0x*t;             
        y[i]=y0-g*t*t/2;  
        fprintf(fp,"%f,%f\n",x[i],y[i]);
    }
     
     
    x0=0;
    while(v0y>0.1){
            for(i=0;i<2*v0y/g/dt;i++){
                t=i*dt;
                x[i]=x0+v0x*t;
                y[i]=v0y*t-g*t*t/2;
                fprintf(fp,"%f,%f\n",x[i],y[i]);
            }
            x0=x0+2*v0x*v0y/g;
            v0y=e1*v0y;
        }
     
     
    fclose(fp);
} 

box
記事: 2002
登録日時: 14年前

Re: プログラムが動きません

#13

投稿記事 by box » 14年前

> scanf("%lf",&x0);
> scanf("%lf",&y0);

ここでせっかく入力したx0とy0を、

> x0=0;
> y0=0;

上書きしてしまっています。ホントにいいんですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 14年前

Re: プログラムが動きません

#14

投稿記事 by box » 14年前

> x=v0x*t+x0;

先に指摘を受けて、いったん直してあったのに、元に戻ってしまってますよ。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: プログラムが動きません

#15

投稿記事 by bitter_fox » 14年前

コード:

        double x[MAX];
        x=v0x*t+x0;
xはdouble型の配列ですので、
x = 値;
といった代入は、できません。

Re: プログラムが動きません

#16

投稿記事 by » 14年前

ありがとうございました。
動きました。
しかし、excelで軌跡が描けません。
何が問題なのでしょうか?
ボールを壁に向け投げて、壁にあたり跳ね返り床をバウンドするものなのですが。

コード:

  #define MAX 1000
#define _CRT_SECURE_NO_WARNINGS
 
void main(void){
    int i;
    double x[MAX],y[MAX];
    double t,dt;
    double v0x,v0y,v0,g,e1,e2,x0,y0;
     
     
    scanf("%lf",&v0x);
    scanf("%lf",&v0y);
    scanf("%lf",&v0);
    scanf("%lf",&g);
	scanf("%lf",&x0);
	scanf("%lf",&y0);
    scanf("%lf",&e1);
    scanf("%lf",&e2);
     
     
    FILE *fp;
    dt=0.01;
    fp=fopen("kekka.csv","w");
     
   
                     
    for(i=0;i<x0/v0*dt;i++){
        t=i*dt;
        x[i]=v0x*t+x0;
        fprintf(fp,"%ff\n",x[i]);
		
    }
    x0=e1*v0x;
                      
    for(i=0;i<sqrt(v0/g);i++){ 
        x[i]=e1*v0x*t;             
        y[i]=y0-g*t*t/2;  
        fprintf(fp,"%f,%f\n",x[i],y[i]);
    }
     
     
    x0=0;
    while(v0y>0.1){
            for(i=0;i<2*v0y/g/dt;i++){
                t=i*dt;
                x[i]=x0+v0x*t;
                y[i]=v0y*t-g*t*t/2;
                fprintf(fp,"%f,%f\n",x[i],y[i]);
            }
            x0=x0+2*v0x*v0y/g;
            v0y=e1*v0y;
        }
     
     
    fclose(fp);
} 

box
記事: 2002
登録日時: 14年前

Re: プログラムが動きません

#17

投稿記事 by box » 14年前

>しかし、excelで軌跡が描けません。
>何が問題なのでしょうか?

どんな初期値を与えた結果、どんな"kekka.csv"ができて、
それを使ってExcelでどんな操作をしたかが全くわかりませんので、
何も答えることができません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

Re: プログラムが動きません

#18

投稿記事 by » 14年前

ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る