個人事業主の方必見!確定申告のお悩み解決

現在、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;
}

このQ&Aに関連する最新のQ&A

A 回答 (5件)

>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でも「エラーも出ないし、何も起きず、普通にちゃんと実行したフリをする」で終わるので、なかなかバグが見付からない場合もあります。
    • good
    • 0
この回答へのお礼

おお、何という単純なミス(ただ、仕組みについては複雑?)だったんでしょう!
メモリサイズを確保するために同じようにそれ以外の変数同様に行っていたため、コピーペーストで最後の部分だけ書き換え忘れたようです!

修正したら、正しく実行できました!ありがとうございます!

お礼日時:2014/12/01 16:55

追記の追記。



mallocされたメモリが開放されないまま、次々に新しいメモリが確保されていき、使い終わったメモリが誰にも開放されないままプログラムが終了している(メモリリークしている)が、Nの最大値は1024くらいなので、ほぼ実害は無い。

doubleの値が数千個分メモリリークした所で今のOSは屁でもないので、ユーザーメモリがちょっと減ってオシマイになるだけ。

このプログラムを何千万回も動かすとか、ずっと常駐させて繰り返し動かすとかすれば、実害が出るだろうけど。
    • good
    • 0
この回答へのお礼

他の方への質問の回答までありがとうございます!これくらいでは問題ないとのことで。
ただ、できるだけ解放する癖をつけておきます!

お礼日時:2014/12/01 17:19

追記。



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で良い」と言う回答は無視すること。
    • good
    • 0
この回答へのお礼

ありがとうございます!分かって書いたつもりなのに指摘されるとそうなのかな?と思ってしまいました。
他の回答も順次チェックしてコメントしていきます。

お礼日時:2014/12/01 16:46

とりあえず……malloc()して、そのあとどこで解放していますかね?


>for (pow2 = 7; pow2 <= 10; ++pow2){
のループでそれぞれNはいくつになりますかね?
    • good
    • 0
この回答へのお礼

malloc()と同じループの中に、

free(nu);
free(Vp);
free(chi);
free(phi);
free(Phi);

を入れてみましたが、dcmplx *Phi = (dcmplx*)malloc(sizeof(double)* N)の部分をdoubleのままにしていたら今まで同様のエラーが出ました。dcmplxにしたら、freeをいれても実行できました。

この場合、このfreeは必要なんでしょうか?癖をつけておいた方がいいとか。また、書き方としてはこれで問題ないですよね?

お礼日時:2014/12/01 17:01

よく見る気はないけど,とりあえず


fscanf(fp, "%lg%lg%lg%lg%lg%lg%d", &eta, &s0, &r, &q, &sigma, &t, &pow2);
これの%lgはC89やC++ではエラーじゃないのかなあ。C99では無視されるようだけど。
普通に%gにすればいいのに。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

QMacターミナルで実行中のプログラムを中止するには?

Macのターミナルでプログラムを走らせているとき、
実行中のプログラムを一時停止したり中断・終了させるには
どうしたらいいでしょう?

Unixだと、Control+s とか Control +c とかでできますよね。
Macだと、それではできないみたいなんです。

基本的な質問ですみませんが、どなたか教えていただけないでしょうか。

Aベストアンサー

ごく普通にControl + Cで中断できますよ。

もしかしてControlキーをcommandやcapslockと押し間違えているとかいうことはありませんか?

Qバスエラーとは?

プログラミング(C言語)を始めたばかりの学生です。
コンパイルはできたのですが、実行すると、Buss errorとでてきて
しまいます。Buss errorとはどういうことなんでしょうか?
それから、こういうふうになった時はどこを修正したらいいなどあ
りますか?よろしくお願いします。

Aベストアンサー

例えば、偶数番地にしかアクセスできないプロセッサに奇数番地でアクセスして様な場合に、バスエラーが起こります。
無理やりなキャストや予期せぬメモリの侵食とかポインタの不正アドレスとかそういうのをチェックします。
よければ、ソースを補足してください

QC言語のプログラムが実行できません。

C言語のプログラムが実行できません。

コンパイルは出来るんですが、実行すると、「Segmentation fault」と表示されてしまいます。

これは何のエラーなんでしょうか?
基本的な事かもしれませんが、分かる方宜しくお願い致します。

Aベストアンサー

僕も何度も出したなぁ。

ひとくちにSegmentation faultといっても、それこそさまざまな要因があるので、
これだけで原因を突き止めるのは非常に難しいです。

コンパイルはあくまで文法としてみているだけであり、
処理の流れ、メモリ確保など、プログラムそのものを見ているわけではありません。
このエラーが出るのは文法などよりもっと上位の原因なのです。
たとえばですが。
長さ10の配列があったとして、11番目以降を参照したりすると、
そういうのが出たような気がします。

ですから、変数があれば、その内容をprintf文で逐一出していき、
変な値が入っていないとか、少しずつ直していくしかないと思います。

Qprintf で二進表示を行いたい。

すみません。教えていただきたいことがあります。
printf で普通のintの値をフォーマット指定子を使用して二進表示をしたかったのですが見当たりませんでした。
どうにかintの内容を二進で確認したいのですが、どのようにすれば良いですか?
宜しくお願いします。

Aベストアンサー

★2進整数を表示する関数を自作すればよい。
・作り方は簡単で、最上位ビットから順に『0』と『1』を調べていき、ビットが
 立っていれば『putchar('1');』にして、ビットが OFF なら『putchar('0');』
 にすれば良いでしょう。
・下にサンプルを載せますので使いやすいように改良して下さい。

サンプル:
unsigned int bit = (1 << (sizeof(int) * 8 - 1));
int value = 12345; ←これが表示したい int 型の整数値です。

printf( "value の 2進表記は " );

for ( ; bit != 0 ; bit >>= 1 ){
 if ( value & bit ){
  putchar('1');
 }
 else{
  putchar('0');
 }
}
printf( " です。\n" );

最後に:
・1バイトが 8 ビットの環境が前提です。→まぁ、普通は 8 ビットですが…。
・上記のサンプルを関数などにすれば使いやすくなります。→print_bin()など
・以上。おわり。

★2進整数を表示する関数を自作すればよい。
・作り方は簡単で、最上位ビットから順に『0』と『1』を調べていき、ビットが
 立っていれば『putchar('1');』にして、ビットが OFF なら『putchar('0');』
 にすれば良いでしょう。
・下にサンプルを載せますので使いやすいように改良して下さい。

サンプル:
unsigned int bit = (1 << (sizeof(int) * 8 - 1));
int value = 12345; ←これが表示したい int 型の整数値です。

printf( "value の 2進表記は " );

for ( ; bit != 0 ; bit >>= 1 ){
 if...続きを読む

Q戻り値で構造体を返すことは可能でしょうか?

perlでは以下のように2つの戻り値が可能ですが、C言語では
それができるのでしょうか?
my (ret1, ret2) = test1();

よくやるのは、引数にポインタを渡して、内容を書き換える手を使っていますが、戻り値を複数返せたら、直感的にわかりやすいかなと思いまして・・・

Aベストアンサー

C言語から遠く離れた者ですが、

>>> よくやるのは、引数にポインタを渡して、内容を書き換える手を使っています

これが常識でしょう。これが直感的に理解できるようにC言語を身に付ける必要があるのではないでしょうか。

QC言語 配列の長さの上限

C言語で配列Array[N]の長さNの上限っていくらなんでしょうか?
もし可能なのであれば上限を2147483647にしたいのですが、方法を教えてください。

Aベストアンサー

そもそもWindowsの32bit版はアプリが仮想メモリ空間を2GBしか使えません。2GBを超えるには64bit版が必要です。
たとえ64bit版OSだとしても添え字が2147483647って、単純なintの配列だとしても4x2147483647=8GB必要ですね。実メモリ16GBとかのPCを用意しますか?
そもそも配列で2147483647個必要なアルゴリズムに問題ありだと思います。

Qfgetsで拾われる改行文字を削除したい

お世話になります

 C言語初心者のものです。今課題でC言語を用いたプログラミングを
Fedora上でやっています。問題は、fgetsでテキストファイルから、取得
した文字列の中から改行文字を削除できないことです。文字変数のアド
レスはわかっているのですが、終端文字に置換しようとすると、セグメ
ントエラーになってしまいます。これは如何にして解決すべきでしょう
か。よろしくお願いします。

Aベストアンサー

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが最大文字数に達したり、ファイルの最後になったりで、strに改行文字が含まれない場合には、このループは止まりません(Segmentension Falutになって止まる)

・そのような状態になってないか、予めチェックする
・ループを終了させる仕組みを用意しておく
: forの終了条件を記述する、for中で if(*(str+i)=='\0') { break;} 等としておく、等
といった対策が必要です。


あと細かいところを言えば
・strを配列で用意したなら *(s+i)じゃなくてs[i]でいいんじゃないかな
・あるいは char *pみたいにしておいて、 iのループでなく pでループを組む( for(p=str;*p!='\0';p++) )とか。

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが...続きを読む

Qmsvcr120d.dllがないというエラー

VSC++でDLLのプラグインを作成しました。
このプラグインをモーションビルダーで使用します。

自分の開発していたPCでは問題なく起動し、動作しています。
しかし、VS環境のないPCで使用しようとしたところ次のようなエラーが出て読み込まれませんでした。

・msvcr120d.dllがない
・msvcp120d.dllがない

これに対応するにはどうしたら良いかわかりません。
プログラムのほうで何かをして対応できますか?
使用するPC側にインストール等が必要になりますか?

Aベストアンサー

まずは、Releaseモードに切り替えましょう。Debugとか論外でしょ。

あと、
http://kidd0320.hatenablog.com/entry/2014/06/06/142355
上記を参考に、「ランタイムライブラリ」を「DLL」の記載が無いものに切り替えましょう。


人気Q&Aランキング