C++ 0x009f1559/访问冲突写入位置0x00110ee4处的未处理异常

C++ 0x009f1559/访问冲突写入位置0x00110ee4处的未处理异常,c++,visual-c++,C++,Visual C++,我得到以下错误: 隐含Vol.exe中0x009f1559处的未处理异常:0xC0000005:访问冲突写入位置0x00110ee4 #include "EurCall.h" #Include <cmath> double N(double x){ double gamma=0.2316419; double a1=0.319381530; double a2=-0.356563782; double a3=1.781477937; doub

我得到以下错误:

隐含Vol.exe中0x009f1559处的未处理异常:0xC0000005:访问冲突写入位置0x00110ee4

#include "EurCall.h"
#Include <cmath>

double N(double x){
    double gamma=0.2316419;
    double a1=0.319381530;
    double a2=-0.356563782;
    double a3=1.781477937;
    double a4=-1.821255978;
    double a5=1.330274429;
    double pi=4.0*atan(1.0);
    double k =1.0/(1.0+gamma*x);
    if (x>=0.0){
        return 1.0-((((a5*k+a4)*k+a3)*k+a2)*k+a1)*k*exp(-x*x/2.0)/sqrt(2.0*pi);
    }
    else return 1.0-N(-x);
}

double EurCall::d_plus(double S0, double sigma, double r){
    return (log(S0/K)+(r+0.5*pow(sigma,2.0))*T)/(sigma*sqrt(T));
}

double EurCall::d_minus(double S0, double sigma, double r){
    return d_plus(S0,sigma,r)-sigma*sqrt(T);
}

double EurCall::PriceByBSFormula(double S0, double sigma, double r){
    return S0*N(d_plus(S0,sigma,r))-K*exp(-r*T)*N(d_minus(S0,sigma,r));
}

double EurCall::VegaByBSFormula(double S0,double sigma, double r){
    double pi=4.0*atan(1.0);
    return S0*exp(-d_plus(S0,sigma,r)*d_plus(S0,sigma,r)/2)*sqrt(T)/sqrt(2.0*pi);
}
在调试器中,错误似乎发生在代码试图在第一个花括号中输入函数N时

好的,这是呼叫代码:

#include "Solver03.h"
#include "EurCall.h"
#include <iostream>
using namespace std;

class Intermediary: public EurCall
{
private:
    double S0,r;
public:
    Intermediary(double S0_, double r_, double T_, double K_):EurCall(T_,K_){S0=S0; r=r_;}
    double Value(double sigma)
    {
        return PriceByBSFormula(S0,sigma,r);
    }
    double Deriv(double sigma)
    {
        return VegaByBSFormula(S0,sigma,r);
    }
};

int main()
{
double S0=100.0;
double r=0.1;
double T=1.0;
double K=100.0;
Intermediary Call(S0,r,T,K);

double Acc=0.001;
double LEnd=0.01, REnd=1.0;
double Tgt=12.56;
cout << "Implied vol by bisect: "
     << SolveByBisect(&Call,Tgt,LEnd,REnd,Acc)
     << endl;
double Guess=0.23;
cout << "Implied vol by Newton-Raphson: "
     << SolveByNR(&Call,Tgt,Guess,Acc)
     << endl;
return 0;
}
这是堆栈中的最后一个条目

隐含的Vol.exe!Ndouble x=-1.IND000000000000行5+0x9字节C++


尽管需要多少个条目,但仍有大量条目?

您可能是在一个伪造的EurCall指针上调用这些函数。堆栈跟踪会有所帮助。是的!如何创建EurCall对象?函数N是如何调用的?您应该将函数N中的所有双变量声明为常量,因为它们不会改变。这将允许编译器执行更多优化,并允许它在编译时标记对变量的任何写入。因为N函数是递归的,所以您也应该将这些常量声明为静态的。