数组变量返回意外值

时间:2015-07-11 22:14:03

标签: c++ arrays dynamic-arrays

我正在尝试将数组传递给函数(* getcreditcurve)。我期待函数(* getcreditcurve)返回一个数组。主要功能是发送几个这样的数组到函数(* getcreditcurve),指针函数有望使用指针函数(* getcreditcurve)中给出的逻辑将数组返回给不同数组的main函数。我没有得到错误,但我没有得到正确的价值。我希望I + 1为3 * 0.0039 = 0.0117而I + 2为4 * 0.0060 = 0.0024但是我在excel输出中得到以下

'00D4F844   00D4F84C'

即使我将print语句更改为

'print << *(I1+1) << '\t' << *(I2+2) << endl;'

我得到以下excel out put

-9.26E+61   -9.26E+61

有人可以帮忙解决问题吗?对不起,我在本网站上浏览了其他帖子/问题,但无法通过最简单的方法解决此问题。我将使用这个逻辑来构建其他项目,以简化问题只是为了解决主要问题。

#include<iostream>
#include<cmath>
#include<fstream>
typedef double S1[5];
using namespace std;
double *getcreditcurve(double *);

int main()
{


S1 C1 = { 0.0029, 0.0039, 0.0046, 0.0052, 0.0057 };
S1 C2 = { 0.0020, 0.0050, 0.0060, 0.0070, 0.0080 };

typedef double *issuer;
issuer I1 = getcreditcurve(C1);
issuer I2 = getcreditcurve(C2);


ofstream print;
print.open("result1.xls");
    print << (I1+1) << '\t' << (I2+2) << endl;

    print.close();
    return 0;


}

double *getcreditcurve(S1 ptr)
{
const int cp = 5;
typedef double curve[cp];
curve h;

h[0] = 2 * ptr[0];
h[1] = 3 * ptr[1];
h[2] = 4 * ptr[2];
h[3] = 5 * ptr[3];
h[4] = 6 * ptr[4];

return h;
}

2 个答案:

答案 0 :(得分:1)

如果您希望getcreditcurve返回一个数组,请尝试以下方法:

const int cp = 5;
typedef double curve[cp];
curve getcreditcurve(S1 ptr) {

但是这会产生错误error: ‘foo’ declared as function returning an array。函数无法返回C数组。但好消息是,如果你完全接受C ++,你可以返回std::array

#include<array>
const int cp = 5;
typedef curve std::array<double,cp>;
curve getcreditcurve(S1 ptr) {

但实际上,std::vector可能会更好,因为你对这个尺寸有更大的灵活性。

#include<vector>

std::vector<double> getcreditcurve(std::vector<double> ptr)
{
    std::vector<double> h;
    h.push_back(2 * ptr.at(0));
    h.push_back(3 * ptr.at(1));
    h.push_back(4 * ptr.at(2));
    h.push_back(5 * ptr.at(3));
    h.push_back(6 * ptr.at(4));

    return h;
}

事实上,几乎所有C数组的问题都可以通过std::vector来解决。然后,在特殊情况下,您可以使用std::array。但是暂时关注std::vector

答案 1 :(得分:0)

无法从函数返回C数组。您还可以返回其他内容,例如std::vectorstd::array。您应该考虑围绕这两个应用程序重新设计应用程序。

但是如果你真的需要在C ++中使用C数组,我建议你不要试图从getcreditcurve返回一个数组,而是将一个额外的数组传递给getcreditcurve,它将用于存储结果。这称为输出参数。

void getcreditcurve(double*, double *);

这将解决&#34;范围&#34;问题。然后调用者(main)在调用getcreditcurve之前创建数组,然后将其传递给getcreditcurve。因此,getcreditcurve不必承担创建(或销毁)任何对象的责任。

double I1[5];
getcreditcurve(I1, C1); // will store its result on `I1`.

如果你真的需要尽快让它工作,这可能是最简单的选择。

如果您愿意进行进一步的更改,您可以制定更安全的计划。短期目标是取消*的所有用途(除了将其用于乘法)。

C数组不能按值传递,特别是它们不能返回。你可以做其他一些时髦的事情(传递特殊指针),但最好的做法就是通过引用传递它们。在C ++中,引用传递行为非常一致并且运行良好。

// http://stackoverflow.com/questions/31362360/unexpected-value-return-by-array-variable
#include<iostream>
#include<cmath>
#include<fstream>
typedef double S1[5];
using namespace std;

/* In the following declaration, the two parameters
 * are taken by reference (note the '&').
 * This is almost always the best way to pass arrays.
 *
 * Also, this is a template where N is automatically
 * set to the correct number of parameters. This nice
 * automatic behaviour is possible only because the
 * array is taken by reference.
 *
 * Finally, note that the second reference, for 'input',
 * has 'const'. This is to emphasize that 'input' is for input,
 * that getcreditcurve will not be allowed to modify the input argument.
 */
template<size_t N>
void getcreditcurve(double (&output)[N],const double (&input)[N]);

int main()
{


    /* S1 is the type - array of five doubles */
    /* Here declare and initialize C1 and C2 as two variables
     * of this type */
    S1 C1 = { 0.0029, 0.0039, 0.0046, 0.0052, 0.0057 };
    S1 C2 = { 0.0020, 0.0050, 0.0060, 0.0070, 0.0080 };

    // create the two output arrays first, within main
    S1 I1;
    S1 I2;
    // call getcreditcurve, passing in the output and input arrays
    getcreditcurve(I1,C1);
    getcreditcurve(I2,C2);


    ofstream print;

    /* you can't create Excel(.xls) files in C++ easily
     * Better to just create a .csv file instead
     * csv = comma-separated values
     */
    print.open("result1.csv");
    print << I1[0] << ',' << I2[3] << endl;

    print.close();
    return 0;

}

template<size_t N>
void getcreditcurve(double (&output)[N],const double (&input)[N])
{
    output[0] = 2 * input[0];
    output[1] = 3 * input[1];
    output[2] = 4 * input[2];
    output[3] = 5 * input[3];
    output[4] = 6 * input[4];
}

但严重的是,你真的应该完全放弃C阵列。这是C ++,而不是C.请改用std::vector<double>