question

Upvotes
Accepted
21 0 1 2

Should we allocate memory before calling ATS::RateInput::get[*]Column() functions?

Hi,

I'm working with ATS and studyiing the yieldcurve example.

According to the "ATS 1.5 – Operations Guide" manual (section 15.6.3: Creating Curve Methodology with C++ Add-In), the correct way to call ATS::RateInput functions in order to get columns is:

double* parRateList = NULL;
rateInput->getDoubleColumn(ID_PAR_RATE, parRateList);

Though, the example in Ext_yieldcurve.cpp does somthing like:

double* parRateList = NULL;
parRateList = new double[tenorNum];
rateInput->getDoubleColumn(ID_PAR_RATE, parRateList);

Note that getDoubleColumn() takes the pointer by non-const reference, that is:

bool getDoubleColumn (int paramId, double*& value);

Hence, technically speaking, both options are plausible.

By the way, there is no "delete" call for that pointer in the example...

Which one is right?

How can I know the exact semantics of the functions declared in ats/dev/include?

Thanks in advance. Best regards,

Martin

c++ATS
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Upvotes
Accepted
21 0 1 2

Thanks for the quick answer, @jirapongse.phuriphanvichai

If you allow me to make a suggestion, I believe you could improve the code:

I'm pretty sure that the example is leaking memory. There are a bunch of calls to new without the matching calls to delete. In my exercise I'm using std::unique_ptr<...[]> to handle this but, if you are not allowed to use C++11, a few calls to delete[] will do the job.

In addition, there is a loop checking the error of all the tenors. The 'if' inside the loop assigns true or false to the 'finish' variable. But, since both branches of the 'if' assign something to 'finish', the final value of 'finish' will reflect only the state of the last tenor checked. I suppose that the intent was to express "all errors < 1e-15" or something like that.

I hope it helps. Best regards and thanks again,

Martin

icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Upvotes
47.3k 111 44 60

The code in section 15.6.3: Creating Curve Methodology with C++ Add-In refers to the MyAddin::do_curveaddin() method in Ext_yeildcurve.cpp.

The code in that method is:

void* MyAddin::do_curveaddin()
{
...
double* parRateList = NULL;
...

if (parRateList == NULL) parRateList = new double[tenorNum];
...

rateInput->getDoubleColumn(ID_PAR_RATE, parRateList);

...
}

The code in the document is a snippet code, not the full code. Therefore, you need to allocate memory before calling getDoubleColumn().

icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.