• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:このプログラムのエラーの原因を教えて下さいNo.1)

プログラムのエラー原因教えてください

このQ&Aのポイント
  • このプログラムを実行すると、Hdx3no2が宣言なしで使われているとエラーが出るのですが理由がわかりません。
  • プログラムは非常に長く、コンパクトになっていないため、質問を3回に分けます。
  • また、プログラムの見やすさについてもお詫び申し上げます。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答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; で使われるのは、最後の値だけです。 それって、正しいのでしょうか?

scottish1246
質問者

お礼

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

その他の回答 (4)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答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くらいになります。 そうすれば、今回みたいに分割しないでも済みます。

  • honor
  • ベストアンサー率35% (25/71)
回答No.3

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

scottish1246
質問者

お礼

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

  • tatsu99
  • ベストアンサー率52% (391/751)
回答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です。 -------------------------------- 以上。

scottish1246
質問者

お礼

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

  • f272
  • ベストアンサー率46% (8467/18128)
回答No.1

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

scottish1246
質問者

お礼

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

関連するQ&A

専門家に質問してみよう