No.7ベストアンサー
- 回答日時:
ごめ、ソースみてわかる世界じゃないや(笑
むしろ、書いた人すごいなぁ。
LinuxならGDBが動くはずなので
地道にトレースして値のおかしくなる場所を特定して
その結果から推測するしかないですね。
google検索したら日本語マニュアルあったのでぺたり
GDB マニュアル
http://flex.ee.uec.ac.jp/texi/gdb-j/gdb-j_toc.html
No.10
- 回答日時:
「doubleのフォーマットが32bit版と64bit版で違う」ってことは当然あってもいいけど, 今どき普通はハードウェアの都合に合わせるだろうから「同じハードウェアならたぶん同じだろう」とは推測できると思います>#9. もちろん「推測」であって「断定」ではありませんが.
以下余談:
物理量を直接書くことは当然知ってるけど (というより「観測値なら直接書くしかない」はずだ), 「8.54×10^-7」を「8.54*pow(10.0, -7,0)」って書くのはいかがなものだろう. 普通はしれっと「8,54e-7」ですますものじゃないかねぇ. そうすれば Spon_HH は「定数行列*T_0」となるし, この「定数行列」そのものは (少なくとも現状はで) static const な配列で書けるのでお得.
さらにいうと例えば z_HHplus を計算するところは関数として切り出せばいい (無駄な条件判断は消す) し,
if(n_H_micro != NULL){
free(n_H_micro);
n_H_micro=NULL;
}
も NULL かどうかの比較は無駄.
もちろん malloc を使ったところで「訳の分からないところで違う領域に上書きされる」現象が回避されるわけではないです.
No.9
- 回答日時:
こりゃ確かにすごい。
で、こういう場合の定石として、
「問題が発生する最小限のコードに絞り込む」
ってのを地味にやるしかないかと。
可能性として考えられるのは、int<->doubleの変換で、intが32bitか64bitかで違いが生じるので、そのからみとか。でも、すべての計算をきっちりdoubleでやっていれば、この問題は起こらない。
あと、doubleのフォーマットが32bit版と64bit版で違う・・ってことはある話なのかなぁ。
No.8
- 回答日時:
これを人間が書いたんだとしたら確かに「すごい」けど>#7, その努力は別のところに使うべきじゃなかったかなぁ....
ene_HA=(double *)malloc(sizeof(double)*6);
とか
Spon_HH[21][0]=8.54*pow(10.0,-7.0);
とか, 人間が書いたとは到底信じられない.
まずは「人間が読めるコード」に修正すべきなのかもしれんが, こんなの触りたくない. 持って来たら突っかえすよ, こんなの.
ま, 他人の協力が得られないことを前提に, #7 で挙げられている gdb を使って自力でなんとかしてください. gcc でコンパイルするときに -g オプションを付けてくださいね.
この回答への補足
確かに6個の配列をmallocで作るのはやり過ぎかもしれませんが、メモリを確保しないと訳の分からないところで違う領域に上書きされることがあったので怖いんです。Spon_HHについては物理量を実験値、理論値からダイレクトに代入することがあることを知って下さい。
補足日時:2009/05/13 00:58No.6
- 回答日時:
ごくごく普通に書けば、32ビットでも64ビットでも同じく動くはず。
結果が異なるというのは、やはり変な書き方をしていると思われるわけで、ソースを提示するのが一番です。
この回答への補足
ソースを置きましたのでURLをお報せします。
遅くなって澄みません。
http://bechi0226.web.fc2.com/yotsuba.html
No.5
- 回答日時:
#2 への 補足にあるけれどmallocのサイズ不正でNaNになるのかな?
0除算ならあるかもしれないけれど。。
まぁ、ソースコードと結果を見ないことには予想も立ちませんね。
結果が違うとだけいわれても、
32bitの時、おかしい
64bitの時、おかしい
両方、おかしい
と三通りのあるわけで、ソースコードもなしで、答えなんか出ません。
No.4
- 回答日時:
って~か, malloc を使うときに忘れずに stdlib.h をインクルードすればいいだけじゃないのかなぁ>#3.
普通, sizeof を使わずに malloc ってあんまりしないよね.
要するに「きちんと規格に従って書く」間は問題なし.
No.3
- 回答日時:
回答1に引き続き。
メモリ確保にmallocをお使いとのこと。
「malloc 64bit」で検索すると分かるとおり、64bit環境でのmallocの使い方で悩んでいるケースは結構あります。
mallocは型指定せずにメモリサイズを自分で指定しないといけないため、32bitのときと定義サイズの違うデータ型で使おうとすると正常に動作しません。
ここ↓の回答1が参考になります
http://okwave.jp/qa1683511.html
sizeof(データ型)で抽象的に指定してやればいいのですが、
いずれにしても、malloc ~ freeはプログラム初心者には難しい概念だと思われます。
gccをお使いでしたら、CではなくC++言語にして、new ~ deleteでデータ型を指定したメモリ確保をすれば、その部分では悩まずに済むはずです。
No.1
- 回答日時:
ポインタのサイズが違います。
32bit環境は、メモリのアドレスを指定できる数が、2の32乗≒43億。
つまり、理論上約4ギガバイトのメモリにアドレスを割り振ることができます。
32bitウィンドウズでのメモリ上限が4GBというのはこのためです。
メモリの「ここ」という情報を格納するポインタ変数において、それを表現するのに、32bit環境の場合、4バイトになります。
64ビットの場合、8バイト。
C/C++をgccでコンパイルした場合、各環境のCPUが直接読めるネイティヴコードが生成されるゆえ、32ビット用、64ビット用と明確に違うバイナリが出てきます。
>どちらのgccでも使える汎用性のあるファイルは書けないのでしょうか?
自分で書くソースは共通のもので大丈夫なはずです。
コンパイラ(gcc)が頑張ってそれぞれに合わせて翻訳するだけなので。
「どちらの環境でも使える汎用性のある実行ファイルはできないか?」
という意味の質問でしたら、
Windowsの場合に限ると、64bitのほうには32bitのプログラムを実行するエミュレーターが搭載されているので、32bitのほうでコンパイルすればどちらの環境でもOKになります。
その他のOSの場合、それぞれ違いますが、エミュレーターのような特別な仕組みが入っていない限り、基本的には不可です。
OSを問わず、環境を問わず実行できるものを目指すのでしたら、Javaのほうが良いと思います。
この回答への補足
詳しいご説明ありがとうございます。
違いがよく分かりました。
OSはUNIXの多分Redhatです(管理者ではないので過去の記憶です)。
重ねての質問になりますが、64ビット用に書き換えるにはどうしたら
良いのでしょうか?
あと、Javaは学術計算に使えますか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# exeファイルが作れない(windows10) 6 2022/08/13 08:47
- C言語・C++・C# C言語 ポインタ 配列 2 2022/06/02 17:29
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 入力待ちをして、受け取った正の整数が表す行数だけ既存 4 2022/07/05 10:12
- C言語・C++・C# (C言語)めちゃくちゃな値になってしまいます。 5 2022/08/13 11:55
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムが途中で強制終了し...
-
16進ダンプのプログラム
-
64ビットと32ビットの違い
-
free関数で動作が止まる
-
C言語 配列の長さの上限
-
C言語のポインタに直接アドレス...
-
C言語のintとcharの違いってな...
-
MAIN関数の引数について
-
【速いブラインドタッチ】手を...
-
配列を使わずに、変数名を動的...
-
差分法でのメッシュ分割
-
fstream型オブジェクトを関数の...
-
配列の要素数に変数を入れたい...
-
C# Listを使わずに2次元配列の...
-
プログラムによく出てくるst...
-
【VC++2005(CLR)】マルチスレッ...
-
VBAのプログラムで、DIAG = 1# ...
-
C言語の文字列?処理 strcpyやl...
-
1バイトデータの読み出しについて
-
文字列についていい方法はあり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
newしないオブジェクトについて
-
スタック破壊の上手な見つけ方...
-
C++で、メンバもヒープに確保さ...
-
プログラムが途中で強制終了し...
-
void*型のデータサイズ
-
構造体でchar name[]と*nameの...
-
C++のnewで確保したメモリーの...
-
stringの最大サイズ
-
DLLのマルチスレッドの動作につ...
-
malloc呼び出し時のセグメンテ...
-
行列内の行の交換,列の交換を...
-
画像を読み込む配列の確保。
-
new と malloc によるメモリの...
-
配列の添え字の最大数とは?
-
MSDNがgethostbynameではなくge...
-
Accessで、メモリを開放するタ...
-
ポインタのポインタの初期化法
-
ヒープメモリの解放について
おすすめ情報