我正在尝试将数组传递给函数(* 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;
}
答案 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::vector
或std::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>
。