まずはじめに申しますが大変手間をとる回答になるのでそれでも協力してくれる方がいればの質問です・・・。
このプログラムを実行すると、Hdx3no2が宣言なしで使われているとエラーが出るのですが理由がわかりません。どこがおかしいのか教えてもらえると助かります。あまりにも長いので(コンパクトにできていないので)3回の質問に分けてしまいます・・・。そして非常に見にくくて済みません。
#include<stdio.h>
#include<math.h>
int main(void)
{
int L,M,N,A,B,C;
double U1,U2,x,y,z,X,Y,Z,r,ux1,uy1,uz1,ux2,uy2,uz2,Hdx,Hdy,Hdz;
double Hdx1,Hdy1,Hdz1,Hdx2,Hdy2,Hdz2,Hdip1,Hdip2,uB,fai,sita,RAD,a,b,c;
double Hdx3,Hdy3,Hdz3,Hdx3no1,Hdy3no1,Hdz3no1,Hdx3no2,Hdy3no2,Hdz3no2;
double Hdx4,Hdy4,Hdz4,Hdx4no1,Hdy4no1,Hdz4no1,Hdx4no2,Hdy4no2,Hdz4no2;
double Px1,Py1,Pz1,Px2,Py2,Pz2,THDX11,THDY11,THDZ11;
double THDX12,THDY12,THDZ12,THDX21,THDY21,THDZ21;
double THDX22,THDY22,THDZ22,R,gamma,Beta,CPA,CPB,CPC,upper,lower;
uB=9.274;
U1=3.41*uB; U2=-U1;
RAD=3.14159265358979/180;
a=7.256; b=8.575; c=3.544;
Beta=7.55*RAD;
CPA=0.0604; CPB=0.3; CPC=0.156;
//プロトンの位置
Px1=CPA*a*cos(Beta); Py1=CPB*b; Pz1=CPC*c-CPA*a*sin(Beta);
Px2=-Px1; Py2=Py1; Pz2=-Pz1;
sita=90*RAD;
fai=90*RAD;
THDX11=0; THDY11=0; THDZ11=0; THDX12=0; THDY12=0; THDZ12=0;
THDX21=0; THDY21=0; THDZ21=0; THDX22=0; THDY22=0; THDZ22=0;
R=6;
gamma=4.25775;
A=(R/a)+1; B=(R/b)+1; C=(R/c)+1;
ux1=U1*sin(sita)*cos(fai);
uy1=U1*sin(sita)*sin(fai);
uz1=U1*cos(sita);
ux2=U2*sin(sita)*cos(fai);
uy2=U2*sin(sita)*sin(fai);
uz2=U2*cos(sita);
//upper
//U1のとき
for(L=-A;L<=A;L++)
{
for(M=-B;M<=B;M++)
{
for(N=-C;N<=C;N++)
{
x=L*a*cos(Beta); y=M*b; z=N*c-L*a*sin(Beta);
X=x-Px1; Y=y-Py1; Z=z-Pz1;
r=sqrt((X*X)+(Y*Y)+(Z*Z));
if(r<R&&L!=0&&M!=0&&N!=-1||L!=0&&M!=0&&N!=0||L!=0&&M!=0&&N!=1){
Hdx=((-ux1/pow(r,3))+3*X*(ux1*X+uy1*Y+uz1*Z)/pow(r,5));
Hdy=((-uy1/pow(r,3))+3*Y*(ux1*X+uy1*Y+uz1*Z)/pow(r,5));
Hdz=((-uz1/pow(r,3))+3*Z*(ux1*X+uy1*Y+uz1*Z)/pow(r,5));
THDX11=THDX11+Hdx;
THDY11=THDY11+Hdy;
THDZ11=THDZ11+Hdz;
printf("L=%d M=%d N=%d R=%lf\nAAA\n",L,M,N,r);
}
else if(L==0&&M==0&&N==-1||L==0&&M==0&&N==0||L==0&&M==0&&N==1){
Hdx3no1=((-ux1/pow(r,3))+3*X*(ux1*X+uy1*Y+uz1*Z)/pow(r,5));
Hdy3no1=((-uy1/pow(r,3))+3*Y*(ux1*X+uy1*Y+uz1*Z)/pow(r,5));
Hdz3no1=((-uz1/pow(r,3))+3*Z*(ux1*X+uy1*Y+uz1*Z)/pow(r,5));
}
else{
continue;
}
}
}
}
//U2のとき
for(L=-A;L<=A;L++)
{
for(M=-B;M<=B;M++)
{
for(N=-C;N<=C;N++)
{
x=(2*L+1)*a*cos(Beta)/2; y=M*b+b/2; z=N*c-((2*L+1)*a*sin(Beta))/2;
X=x-Px1; Y=y-Py1; Z=z-Pz1;
r=sqrt((X*X)+(Y*Y)+(Z*Z));
if(r<R&&L!=-1&&M!=0&&N!=-1||L!=-1&&M!=0&&N!=0||L!=-1&&M!=0&&N!=1){
if(L!=0&&M!=0&&N!=-1||L!=0&&M!=0&&N!=0||L!=0&&M!=0&&N!=1){
Hdx=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2+Z)/pow(r,5));
Hdy=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2+Z)/pow(r,5));
Hdz=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2+Z)/pow(r,5));
THDX12=THDX12+Hdx;
THDY12=THDY12+Hdy;
THDZ12=THDZ12+Hdz;
printf("L=%d M=%d N=%d R=%lf\nBBB\n",L,M,N,r);
}
}
else if(L==-1&&M==0&&N==-1||L==-1&&M==0&&N==0||L==-1&&M==0&&N==1){
if(L==0&&M==0&&N==-1||L==0&&M==0&&N==0||L==0&&M==0&&N==1){
Hdx3no2=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5));
Hdy3no2=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5));
Hdz3no2=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5));
}
}
else{
continue;
}
}
}
}
これをNo.1として続きのプログラムをNo.2に挙げます。
No.5ベストアンサー
- 回答日時:
あと、そこが解決すれば終り、では無いと思われます。
期待通りかどうか、ちゃんと確認しましょう。
計算結果が出ていることと、それが正しいかどうかは、無関係です。
Hdx3no2=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5));
や、同様の箇所ですが、例えば
if(L==0&&M==0&&N==-1||L==0&&M==0&&N==0||L==0&&M==0&&N==1)
だと、ループ中
L==0, M==0, N==-1
L==0, M==0, N==0
L==0, M==0, N==1
の3回実行されます。
その最後の結果だけが記録され、他は上書きされています。
よって
Hdx3=Hdx3no1+Hdx3no2;
で使われるのは、最後の値だけです。
それって、正しいのでしょうか?
回答有難うございます!正に指摘された通りの間違いでした!更に計算結果の間違いの指摘も大助かりでした!
おかげで正しい結果を出せる実行ができました!
後コピー等の事は原因ではありませんでしたが過去にその事でミスがあったりしたので、今回はそれがなかっただけですけど、以後気を付けようと、肝に命じようと思います・・・。
他の方々も有難うございました!
気持ちよく全て解決しました!
No.4
- 回答日時:
Hdx3no2に値を代入しているのは
Hdx3no2=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5));
この一箇所だけですが、実際には、この行は実行されていません。
ここにブレークポイントを置いてデバッグ実行すれば、素通りしているのがわかるはずです。
よって、変数Hdx3no2には何が入っているか不定です。
本来のCでは、そういう「不定」の状態でも関係無く動作します。おそらく、正しい結果は得られません。
GCCを使った方々が「実行」できているのは、そういう理由からです。
Visual Studioのデバッグモードでは、そういう初期化されていない変数を使おうとすると、エラーか警告になったと記憶しています。
ここに来るのは
if(L==-1&&M==0&&N==-1||L==-1&&M==0&&N==0||L==-1&&M==0&&N==1){
if(L==0&&M==0&&N==-1||L==0&&M==0&&N==0||L==0&&M==0&&N==1){
という2つのifがともに真のときだけです。
ですが、前者はL==-1である必要があり、後者はL==0である必要があるので、矛盾するので、常に偽です。
よって、実行されない、ということです。
コンパイラでエラーと判断できるのは、文法間違い等の表面的なものだけです。
内容のチェックはできません。
コンパイルエラーが無いことと、プログラムが正しいこととは、別次元だと考えてください。
プログラムを正しく作るコツは
「コピペしない」
「面倒くさいことはしない」
「楽するための努力は惜しまない」
です。
おそらく、U1のときのものをコピーして使ったのではないか、と思われますが、そのとき余計な「if(L==0....」まで一緒にしてしまったとかではないでしょうか?
コピペは便利なのですが、つい「自分は正しく修正した」と思いこんでしまって、間違いに気付きにくいものです。
コピペ禁止にすれば、全部手で入力することになります。
そうすると「同じものばっかり入力して面倒くさい」と思えてくるでしょう。
それが正しい反応です。
そういう時に、マジメにこなすのではなく、「楽する方法」を考えます。
例えば
if(L==-1&&M==0&&N==-1||L==-1&&M==0&&N==0||L==-1&&M==0&&N==1){
ですが、論理式の法則を使って
if( (L==-1)&&(M==0) &&((N==-1)||(N==0)||(N==1)) ){
と書けます。さらに、Nが整数であることを使えば
if( (L==-1)&&(M==0) &&(abs(N)<=1) ){
となります。同様に
if(L==0&&M==0&&N==-1||L==0&&M==0&&N==0||L==0&&M==0&&N==1){
は
if( (L==0)&&(M==0) &&(abs(N)<=1) ){
となります。
これだけでも、大分入力が楽になりました。
さらに。
前のifが成立しているのなら、 (M==0) &&(abs(N)<=1) が成立していることは明白です。よって、
if(L==0){
だけでよくなります。
続けると
if( (L==-1)&&(M==0) &&(abs(N)<=1) ){
if(L==0){
となります。
これだと、入力が1/3以下になってるし、ちょっと見ただけで「おかしいぞ」と気付くのでは?
Hdx=((-ux1/pow(r,3))+3*X*(ux1*X+uy1*Y+uz1*Z)/pow(r,5));
Hdy=((-uy1/pow(r,3))+3*Y*(ux1*X+uy1*Y+uz1*Z)/pow(r,5));
Hdz=((-uz1/pow(r,3))+3*Z*(ux1*X+uy1*Y+uz1*Z)/pow(r,5));
THDX11=THDX11+Hdx;
THDY11=THDY11+Hdy;
THDZ11=THDZ11+Hdz;
も、構造体と関数とを使って
keisan(&Hd, r, u1, xyz);
addVector(&THD11,Hd);
などとすれば、例えば
THDY11=THDY11+Hdx; // Hdyへの変更忘れ
等の間違いを防ぐことができます。
こうやっていけば、このプログラムは1/4くらいになります。
そうすれば、今回みたいに分割しないでも済みます。
No.3
- 回答日時:
releaseでデバッグしようとしているとかではないですか。
No.2
- 回答日時:
わたしも正常に動作しました。
(Windows MinGW gcc 4.7.2)
以下、実行時の内容です。ファイル名はgoo1.cです。
C:\goo>gcc --version
gcc (GCC) 4.7.2
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
C:\goo>gcc goo1.c
コンパイルエラーなし。
実行結果
-----------------------------------
C:\goo>goo1.exe
L=-1 M=-1 N=-2 R=15.046662
AAA
L=-1 M=-1 N=-1 R=13.855295
AAA
L=-1 M=-1 N=0 R=13.515038
AAA
L=-1 M=-1 N=1 R=14.087695
AAA
L=-1 M=-1 N=2 R=15.472232
AAA
L=-1 M=1 N=-2 R=11.754373
AAA
L=-1 M=1 N=-1 R=10.184913
AAA
L=-1 M=1 N=0 R=9.716969
AAA
L=-1 M=1 N=1 R=10.498877
AAA
L=-1 M=1 N=2 R=12.294438
AAA
L=1 M=-1 N=-2 R=15.582694
AAA
L=1 M=-1 N=-1 R=13.959673
AAA
L=1 M=-1 N=0 R=13.116572
AAA
L=1 M=-1 N=1 R=13.203648
AAA
L=1 M=-1 N=2 R=14.203805
AAA
L=1 M=1 N=-2 R=12.433165
AAA
L=1 M=1 N=-1 R=10.326457
AAA
L=1 M=1 N=0 R=9.154655
AAA
L=1 M=1 N=1 R=9.278986
AAA
L=1 M=1 N=2 R=10.654169
AAA
L=1 M=-1 N=-2 R=15.346977
BBB
L=1 M=-1 N=-1 R=13.572143
BBB
L=1 M=-1 N=0 R=12.569657
BBB
L=1 M=-1 N=1 R=12.526348
BBB
L=1 M=-1 N=2 R=13.451482
BBB
L=1 M=1 N=-2 R=17.156754
BBB
L=1 M=1 N=-1 R=15.589341
BBB
L=1 M=1 N=0 R=14.724836
BBB
L=1 M=1 N=1 R=14.687882
BBB
L=1 M=1 N=2 R=15.484407
BBB
L=-1 M=-1 N=-2 R=14.203805
CCC
L=-1 M=-1 N=-1 R=13.203648
CCC
L=-1 M=-1 N=0 R=13.116572
CCC
L=-1 M=-1 N=1 R=13.959673
CCC
L=-1 M=-1 N=2 R=15.582694
CCC
L=-1 M=1 N=-2 R=10.654169
CCC
L=-1 M=1 N=-1 R=9.278986
CCC
L=-1 M=1 N=0 R=9.154655
CCC
L=-1 M=1 N=1 R=10.326457
CCC
L=-1 M=1 N=2 R=12.433165
CCC
L=1 M=-1 N=-2 R=15.472232
CCC
L=1 M=-1 N=-1 R=14.087695
CCC
L=1 M=-1 N=0 R=13.515038
CCC
L=1 M=-1 N=1 R=13.855295
CCC
L=1 M=-1 N=2 R=15.046662
CCC
L=1 M=1 N=-2 R=12.294438
CCC
L=1 M=1 N=-1 R=10.498877
CCC
L=1 M=1 N=0 R=9.716969
CCC
L=1 M=1 N=1 R=10.184913
CCC
L=1 M=1 N=2 R=11.754373
CCC
L=1 M=-1 N=-2 R=15.407958
DDD
L=1 M=-1 N=-1 R=13.896029
DDD
L=1 M=-1 N=0 R=13.187644
DDD
L=1 M=-1 N=1 R=13.410747
DDD
L=1 M=-1 N=2 R=14.522473
DDD
L=1 M=1 N=-2 R=17.211324
DDD
L=1 M=1 N=-1 R=15.872118
DDD
L=1 M=1 N=0 R=15.255768
DDD
L=1 M=1 N=1 R=15.449034
DDD
L=1 M=1 N=2 R=16.423359
DDD
THDX11は2.886494e-002です。
THDY11は1.145482e-001です。
THDZ11は-3.674307e-003です
THDX12は2.208966e-002です。
THDY12は-2.489449e-003です
THDZ12は-5.727889e-006です
THDX21は-2.886494e-002です
THDY21は1.145482e-001です。
THDZ21は3.674307e-003です。
THDX22は1.595915e-002です。
THDY22は5.632938e-003です。
THDZ22は-3.403878e-004です
Hdx1は5.095460e-002です。
Hdy1は1.120588e-001です。
Hdz1は-3.680034e-003です。
Hdx2は-1.290579e-002です。
Hdy2は1.201812e-001です。
Hdz2は3.333919e-003です。
Hdip1は1.231547e-001です。
Hdip2は1.209181e-001です。
upperは5.243620e-001です。
lowerは5.148391e-001です。
upperは3.158141e+000です。
lowerは1.#INF00e+000です。
--------------------------------
以上。
まさに出したかった結果です!・・・なぜかこちらは、コンパイルでは正常に終了するのにデバッグするとHdx3no2が宣言なしで使われていると言われ正常に実行できないです・・・ともあれ回答有難うございます。
(最後のインフィニはプログラムとしてミスですけど)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
difftime()について
-
1円、2円、3円・・・と貯金...
-
c言語で、繰り返し文の中で、0....
-
浮動小数点の比較について
-
C言語を実行すると-infが出てき...
-
至急です! マクロ定義で #defi...
-
doubleの変数にintとintの割り...
-
math.h等について
-
複素数代入解(C言語)
-
C#のプログラミングについて(...
-
C言語(プログラミング)関連の質...
-
浮動小数点の定数
-
c言語のコンパイルエラー canno...
-
C言語のプログラムで#include<m...
-
C言語の型による処理速度の違い
-
C言語のpow関数の不具合
-
int とdoubleの比較
-
P値(統計学)を求めるプログラム
-
関数の積分を求めるプログラム...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
c言語で、繰り返し文の中で、0....
-
C 開放してるのにエラー(doubl...
-
C言語を実行すると-infが出てき...
-
float型とdouble型の変数の違い...
-
至急です! マクロ定義で #defi...
-
C言語の型による処理速度の違い
-
関数におけるif文とreturn文に...
-
C言語 関数プロトタイプ宣言の...
-
浮動小数点の定数
-
int とdoubleの比較
-
doubleは常に%lfとするべきなのか
-
difftime()について
-
C言語でdouble型の小数点の引き...
-
たくさんの数の平均を求める方...
-
斜辺と角度て底辺と高さを出したい
-
C言語で台形公式を使った二重積...
-
float?数字の後にLがつくもの
-
listに構造体を格納
おすすめ情報