現在、Visual C++ 2013 Expressを使っているのですが、そちらではエラーが出るのに、MacbookのXcodeで走らせたらエラーも出ずに正常に実行することができます。
いったい何が原因でエラーが起こっているのでしょうか?
エラーメッセージは"XXXXX.exe has triggered a breakpoint."で"malloc.c"のタブがVC++上に開きます。以下がそのコードになるのですが、アドバイス宜しくお願い致します。
#define _USE_MATH_DEFINES
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <complex>
#include <stdlib.h>
using namespace std;
typedef complex<double> dcmplx;
complex<double> M_i = dcmplx(0, 1);
//---------------------------------------------------------------
// Characteristic Function
dcmplx* CharFunc(double alpha, double* nu, double s0, double r, double q, double sigma, double t, int N)
{
dcmplx* out = (dcmplx*)malloc(sizeof(dcmplx) * N);
dcmplx* u = (dcmplx*)malloc(sizeof(dcmplx) * N);
for (int j = 0; j < N; ++j){ // j = 1,...,N
u[j] = nu[j] - (alpha + 1) * M_i;
out[j] = exp(M_i*(log(s0) + (r - q - sigma*sigma / 2.0)*t)*u[j] - sigma*sigma * u[j] * u[j] * t / 2.0);
}
return out;
}
// Characteristic Function for C
dcmplx CharFuncC(double u, double s0, double K, double r, double q, double sigma, double t, int N)
{
return exp(M_i*((log(s0) - log(K)) + (r - q - sigma*sigma / 2.0)*t)*u - sigma*sigma * u*u * t / 2.0);
}
//---------------------------------------------------------------
// Main
int main(int, char**) {
double alpha[] = { -1.2, -1.5, -5.0, -10.0 };
double eta;
double s0;
double r;
double q;
double sigma;
double t;
double K;
int pow2;
int N;
int m_atm = 0;
FILE *fp;
if (!(fp = fopen("inputa.txt", "r"))){
printf("File \'inputa\' could not be opened!");
exit(-1);
}
fscanf(fp, "%lg%lg%lg%lg%lg%lg%d", &eta, &s0, &r, &q, &sigma, &t, &pow2);
double a;
double b;
double v;
double abs_ab[] = { 2.0, 5.0, 10.0, 20.0 };
double sum =0;
for (pow2 = 7; pow2 <= 10; ++pow2){
N = (int)pow(2.0, pow2);
double *nu = (double*)malloc(sizeof(double)* N);// nu * (b - a) / M_PI;
double *Vp = (double*)malloc(sizeof(double)* N);
double *chi = (double*)malloc(sizeof(double)* N);
double *phi = (double*)malloc(sizeof(double)* N);
dcmplx *Phi = (dcmplx*)malloc(sizeof(double)* N);
for (int i = 0; i < 4; ++i){
b = abs_ab[i];
a = -b;
cout << "N:" << N << ", (a, b): (" << a << ", " << b << ")" << endl;
for (K = 1600; K <= 1900; K += 100){
for (int k = 0; k < N; ++k){
nu[k] = k * M_PI / (b - a);
// chi for Put with (c,d) = (a,0)
chi[k] = 1.0 / (1.0 + nu[k] * nu[k]) * (cos(nu[k] * (-a)) - exp(a) + nu[k] * sin(nu[k] * (-a)));
// phi for Put with (c,d) = (a,0)
phi[k] = sin(nu[k] * (-a)) * (1.0 / nu[k]);
phi[0] = -a;
// COS expasion coeff V for Put
Vp[k] = (2.0 / (b - a)) * K * (-chi[k] + phi[k]);
// Characteristic Function for C, (just different argument inputs)
nu[k] = k * M_PI / (b - a);
Phi[k] = CharFuncC(nu[k], s0, K, r, q, sigma, t, N);
sum += real(Phi[k] * exp(-M_i*(k*M_PI) * a / (b - a)))*Vp[k];
if (k == 0) sum /= 2.0;
}
v = exp(-r*t)*sum;
cout << "strike=" << K << ", price=" << v << endl;
sum = 0.0;
}
}
}
system("Pause");
return 0;
}
No.5
- 回答日時:
追記の追記。
mallocされたメモリが開放されないまま、次々に新しいメモリが確保されていき、使い終わったメモリが誰にも開放されないままプログラムが終了している(メモリリークしている)が、Nの最大値は1024くらいなので、ほぼ実害は無い。
doubleの値が数千個分メモリリークした所で今のOSは屁でもないので、ユーザーメモリがちょっと減ってオシマイになるだけ。
このプログラムを何千万回も動かすとか、ずっと常駐させて繰り返し動かすとかすれば、実害が出るだろうけど。
No.4
- 回答日時:
追記。
scanf系関数について
http://www.isc.meiji.ac.jp/~re00030/jse/scanf.html
scanf系は
浮動小数点(次の3つは同じである)
f 入力を浮動小数(float型)と解釈
e,E 入力を浮動小数(float型)と解釈
g,G 入力を浮動小数(float型)と解釈
オプション
l long型の整数またはdouble型の浮動小数点を意味する(小文字のエル)
って事になっている。
なので、%gって書いたら、floatのポインタが指定されているとして実行するんで、正しく代入されない。
doubleのポインタを指定する場合は、%lf、%le、%lE、%lg、%lGのどれかを指定すること。
「%gで良い」と言う回答は無視すること。
ありがとうございます!分かって書いたつもりなのに指摘されるとそうなのかな?と思ってしまいました。
他の回答も順次チェックしてコメントしていきます。
No.3ベストアンサー
- 回答日時:
>XXXXX.exe has triggered a breakpoint.
意味は「XXXXX.exeはブレークポイントで停止した」です。
malloc.cの所で出るとしたら「ヒープ領域を破壊している」と思います。
Visual C++ 2013の場合、ヒープ領域を破壊すると、mallocの内部で「ブレークポイントで例外停止」するようになっています。
んで
dcmplx *Phi = (dcmplx*)malloc(sizeof(double)* N);
は、明らかにおかしいです。
dcmplx型をN個分確保したいのに、double型をN個分しか確保してません。
正しくは
dcmplx *Phi = (dcmplx*)malloc(sizeof(dcmplx)* N);
じゃないかと思います。
あと、MacのXcodeでは、ヒープを破壊すると
APPNAME_XXX(????,0x????????) malloc: *** error for object 0x????????: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
と言うエラーが出る筈だけど、Visual C++ 2013とは実装が異なるので、偶然「使ってないヒープ領域を壊しただけ」の場合は、エラーも出ないし、何も起きず、普通に「ちゃんと実行したフリ」をする筈です。
ヒープ領域は、壊し方によっては、Visual C++ 2013でも「エラーも出ないし、何も起きず、普通にちゃんと実行したフリをする」で終わるので、なかなかバグが見付からない場合もあります。
おお、何という単純なミス(ただ、仕組みについては複雑?)だったんでしょう!
メモリサイズを確保するために同じようにそれ以外の変数同様に行っていたため、コピーペーストで最後の部分だけ書き換え忘れたようです!
修正したら、正しく実行できました!ありがとうございます!
No.2
- 回答日時:
とりあえず……malloc()して、そのあとどこで解放していますかね?
>for (pow2 = 7; pow2 <= 10; ++pow2){
のループでそれぞれNはいくつになりますかね?
malloc()と同じループの中に、
free(nu);
free(Vp);
free(chi);
free(phi);
free(Phi);
を入れてみましたが、dcmplx *Phi = (dcmplx*)malloc(sizeof(double)* N)の部分をdoubleのままにしていたら今まで同様のエラーが出ました。dcmplxにしたら、freeをいれても実行できました。
この場合、このfreeは必要なんでしょうか?癖をつけておいた方がいいとか。また、書き方としてはこれで問題ないですよね?
No.1
- 回答日時:
よく見る気はないけど,とりあえず
fscanf(fp, "%lg%lg%lg%lg%lg%lg%d", &eta, &s0, &r, &q, &sigma, &t, &pow2);
これの%lgはC89やC++ではエラーじゃないのかなあ。C99では無視されるようだけど。
普通に%gにすればいいのに。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- C言語・C++・C# C言語のマクローリン展開ローラン展開のコードについて 3 2022/12/15 14:45
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C 開放してるのにエラー(doubl...
-
C言語 関数プロトタイプ宣言の...
-
数値を指数部と仮数部に分離したい
-
学校の課題で2次方程式のプログ...
-
関数におけるif文とreturn文に...
-
C言語を実行すると-infが出てき...
-
float型とdouble型の変数の違い...
-
C言語で表記についの質問です
-
指数の表示
-
2分法で方程式の複数の解を自...
-
doubleは常に%lfとするべきなのか
-
物体が往復する動きを作りたい
-
C言語で内積、、、わかりません。
-
c言語のコンパイルエラー canno...
-
C言語のpow関数の不具合
-
処理時間計測
-
float?数字の後にLがつくもの
-
「割り算」 と 「分数の掛け算」
-
C++標準ライブラリィーのcomple...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
float型とdouble型の変数の違い...
-
doubleの変数にintとintの割り...
-
C言語を実行すると-infが出てき...
-
C 開放してるのにエラー(doubl...
-
至急です! マクロ定義で #defi...
-
c言語で、繰り返し文の中で、0....
-
関数におけるif文とreturn文に...
-
C言語 関数プロトタイプ宣言の...
-
C言語初心者 構造体 課題について
-
C言語の型による処理速度の違い
-
Cで3乗根を求める方法
-
C言語で-23乗を取り扱うには
-
2分法で方程式の複数の解を自...
-
doubleは常に%lfとするべきなのか
-
c言語のコンパイルエラー canno...
-
C言語で直角三角形の斜辺を求め...
-
C言語のプログラムで#include<m...
-
int とdoubleの比較
-
C++で外積
おすすめ情報