こんにちは、何度もお世話になっております。
学校の課題である行列計算を行うプログラムの提示を求められたため、以下に添付したプロジェクトを作ったのですが、GaussEliminationSet.cpp
の50行目で double *w に malloc() でメモリを確保するのが上手くいかないらしく、同ファイルの52行目でアクセス違反が起きてしまいます。
一体何故 double *w へのメモリの確保が上手くいかないのでしょうか?どなたかよろしくお願いします。
malloc()でのメモリ確保が上手くいかない
malloc()でのメモリ確保が上手くいかない
- 添付ファイル
-
- 数値解析課題.zip
- (820.61 KiB) ダウンロード数: 135 回
Re: malloc()でのメモリ確保が上手くいかない
CPals.Plane
の値が正しくない、とか…。
ところで、どうでもいい話ですが、
roop
って何でしょうか。
loop
の間違い?
の値が正しくない、とか…。
ところで、どうでもいい話ですが、
roop
って何でしょうか。
loop
の間違い?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: malloc()でのメモリ確保が上手くいかない
自分の環境(GCC 4.8.1)で実行した所、
main関数の62行目で呼び出しているStrReg関数において、NewStrに0が渡されており、19行目のstrlenでアクセス違反が起きてしまいました。
GaussEliminationSet.cppのComparePivotYN関数において、SinResultを更新する処理が無く、
102行目でSinResult.buff=NULL;と初期化したものがそのまま渡っていると思います。
StrReg関数の引数CalStrは値渡しではなく、参照渡しにすることを想定しているのではないでしょうか?
見るプログラムが間違っていたらすみません。
【編集】17:50 プロジェクトファイルが入っていなかったのでファイルを差し替えました
という現象は再現できず、wasawasa さんが書きました:GaussEliminationSet.cpp
の50行目で double *w に malloc() でメモリを確保するのが上手くいかないらしく、同ファイルの52行目でアクセス違反が起きてしまいます。
main関数の62行目で呼び出しているStrReg関数において、NewStrに0が渡されており、19行目のstrlenでアクセス違反が起きてしまいました。
GaussEliminationSet.cppのComparePivotYN関数において、SinResultを更新する処理が無く、
102行目でSinResult.buff=NULL;と初期化したものがそのまま渡っていると思います。
StrReg関数の引数CalStrは値渡しではなく、参照渡しにすることを想定しているのではないでしょうか?
見るプログラムが間違っていたらすみません。
【編集】17:50 プロジェクトファイルが入っていなかったのでファイルを差し替えました
- 添付ファイル
-
- yakobihou.zip
- ビルドしたプログラムとバイナリ
- (134.72 KiB) ダウンロード数: 118 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: malloc()でのメモリ確保が上手くいかない
みけCATさんのご指摘を受けて添付ファイルを確認してみたところ、ファイルを整理する過程でおかしな事になってたみたいです。
添付したファイルにわざわざ手を加えて貰っておいて難ですが、修正したファイルを貼り直しておきます。
お手数をおかけして申し訳ございませんが改めてよろしくお願いします。
添付したファイルにわざわざ手を加えて貰っておいて難ですが、修正したファイルを貼り直しておきます。
お手数をおかけして申し訳ございませんが改めてよろしくお願いします。
- 添付ファイル
-
- 数値解析課題_修正.zip
- (974.39 KiB) ダウンロード数: 120 回
Re: malloc()でのメモリ確保が上手くいかない
同じ場所でアクセス違反が発生しました。
タイムスタンプの目視、及びdiffを用いて調べてみましたが、ソースコードに最初のファイルとの違いは発見できませんでした。
タイムスタンプの目視、及びdiffを用いて調べてみましたが、ソースコードに最初のファイルとの違いは発見できませんでした。
- 添付ファイル
-
diff.txt
- diffの出力(パスのShift_JISと中身のUTF-8が混ざっているので文字化けしています)
- (3.06 KiB) ダウンロード数: 122 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: malloc()でのメモリ確保が上手くいかない
修正版を試したところ、私の環境でも再現できました
mallocをnewにしても破壊されたので、どっかでメモリぶっ壊してるのではと探ってみたのですが
GaussEliminationSet.cpp:ComparePivotYN()内にて
102行目でSinResultの中身が初期化された状態のまま
118行目で呼び出しているStrReg()に引き渡し、その先でメモリぶっ壊しているようです。
118行目をコメントアウトしたら通りました。
同じ結果になるとは限りませんが、参考に。
mallocをnewにしても破壊されたので、どっかでメモリぶっ壊してるのではと探ってみたのですが
GaussEliminationSet.cpp:ComparePivotYN()内にて
102行目でSinResultの中身が初期化された状態のまま
118行目で呼び出しているStrReg()に引き渡し、その先でメモリぶっ壊しているようです。
118行目をコメントアウトしたら通りました。
同じ結果になるとは限りませんが、参考に。
Re: malloc()でのメモリ確保が上手くいかない
お返事が遅くなりましたが、お陰様でメモリを確保できなくなる問題を解決した上で提出できました。
修正内容としてはStrReg()の構造に問題があったため、そちらを書き直して解決できました。
ありがとうございます。
修正内容としてはStrReg()の構造に問題があったため、そちらを書き直して解決できました。
ありがとうございます。
- 添付ファイル
-
- 数値解析課題1.zip
- (1.03 MiB) ダウンロード数: 132 回