電子書籍の厳選無料作品が豊富!

まずはじめに申しますが大変手間をとる回答になるのでそれでも協力してくれる方がいればの質問です・・・。

このプログラムを実行すると、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に挙げます。

A 回答 (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;
で使われるのは、最後の値だけです。

それって、正しいのでしょうか?
    • good
    • 0
この回答へのお礼

回答有難うございます!正に指摘された通りの間違いでした!更に計算結果の間違いの指摘も大助かりでした!
おかげで正しい結果を出せる実行ができました!
後コピー等の事は原因ではありませんでしたが過去にその事でミスがあったりしたので、今回はそれがなかっただけですけど、以後気を付けようと、肝に命じようと思います・・・。

他の方々も有難うございました!

気持ちよく全て解決しました!

お礼日時:2014/11/07 11:14

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くらいになります。
そうすれば、今回みたいに分割しないでも済みます。
    • good
    • 0

releaseでデバッグしようとしているとかではないですか。

    • good
    • 0
この回答へのお礼

回答有難うございます!解決しました!

お礼日時:2014/11/07 11:09

わたしも正常に動作しました。


(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です。
--------------------------------
以上。
    • good
    • 0
この回答へのお礼

まさに出したかった結果です!・・・なぜかこちらは、コンパイルでは正常に終了するのにデバッグするとHdx3no2が宣言なしで使われていると言われ正常に実行できないです・・・ともあれ回答有難うございます。
(最後のインフィニはプログラムとしてミスですけど)

お礼日時:2014/11/07 02:52

gcc 4.8.2 でコンパイルしてみたけどエラーはなく動くみたいだよ。

    • good
    • 0
この回答へのお礼

回答有難うございます。エラー・・・出ませんでしたか。Visual Studio 2010でコンパイルした結果正常終了はするのですがその後デバッグするとHdx3no2が宣言なしで使われていると言ってくるのですが・・・
そもそもそんなエラーが出るはずはないですし・・・ちょっとエラーの正体が不明ですね・・・

お礼日時:2014/11/07 02:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!