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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
C言語32bitから64bitの移行について
C言語・C++・C#
-
アプリを32bitから64bit移行
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
MFCのCStringについて
-
HEAP に関すること
-
DLLのマルチスレッドの動作につ...
-
stringの最大サイズ
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
OpenCV cvLoadImageについて
-
DLLで同じメモリ領域を参照する...
-
128ビット変数の符合表現について
-
newしないオブジェクトについて
-
メモリ解放が必要な場合
-
アセンブラでのメモリの動的確...
-
bool と BOOL の違い(構造体)
-
構造体を使ったファイルの読み込み
-
malloc呼び出し時のセグメンテ...
-
C言語 配列の長さの上限
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
c言語
-
配列を使わずに、変数名を動的...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
allocってなんですか?
-
newしないオブジェクトについて
-
c言語のポインタへの文字列入力...
-
ヒープメモリの解放について
-
配列の添え字の最大数とは?
-
stringの最大サイズ
-
C++で、メンバもヒープに確保さ...
-
プログラムが途中で強制終了し...
-
void*型のデータサイズ
-
malloc呼び出し時のセグメンテ...
-
スタック破壊の上手な見つけ方...
-
ビットをローテートするプログ...
-
構造体でchar name[]と*nameの...
-
mallocについて
-
GDI+におけるメモリの開放について
-
ポインタのポインタの初期化法
-
構造体を使ったファイルの読み込み
-
C言語 mallocとfreeについて
-
HEAP に関すること
-
VBからMFC-DLL呼び出し
おすすめ情報