如何处理定义函数的指针?定义一个 returns 数组的函数的问题
How to deal with pointers to define a function? And problem to define a function which returns an array
假设我需要一个生成数组 r[3] = {x, y, z} 的函数,其中 x[1000]、y[1000]、z[1000] 每个都是一个数组并有 1000 个双浮点数。
我做了一个函数,它 returns r 形式的位置,我们需要通过解包内存位置来访问 x、y、z。我有这样的代码:
double cylinder(double radius, double height)
{
double x[1000], y[1000], z[1000];
double theta = 0, dtheta = M_PI / 500, dz = height / 1000;
z[0] = 0;
y[0] = 0;
x[0] = radius;
for (int i = 1; i < 1000; i++)
{
z[i] = z[i - 1] + dz;
theta = theta + dtheta;
x[i] = radius * cos(theta);
y[i] = radius * sin(theta);
}
double * r[3] = {x,y,z};
return **r;
}
现在如果我使用
data = cylinder(5, 10);
cout<<data<<endl;
它应该 return 一个位置,但为什么它 returns 5.
我需要有 'data' 的位置,从那里我会得到另外 3 个内存位置,其中 3 个在每个位置上都有所有 1000 个点。
如果能得到解决方案,我将不胜感激。
这可以通过结合使用标准库 std::vector
和 std::tuple
轻松解决,这就像一个真正轻量级的固定长度数组:
#include <vector>
#include <tuple>
std::vector<std::tuple<double,double,double>> cylinder(double radius, double height)
{
std::vector<std::tuple<double,double,double>> result;
double theta = 0;
double dtheta = M_PI / 500;
double dz = height / 1000;
// No need for an array or back-references here
double x = radius;
double y = 0;
double z = 0;
// Add the 0th entry
result.push_back({ x, y, z });
for (int i = 1; i < 1000; i++)
{
z += dz;
theta = theta + dtheta;
x = radius * cos(theta);
y = radius * sin(theta);
// Add subsequent entries
result.push_back({ x, y, z });
}
return result;
}
现在内存管理问题已通过使用容器解决。
如果 x
、y
和 z
在语义上很重要,您甚至可能想用这些属性制作一个小 struct
,而不是为其提供更多上下文。
假设我需要一个生成数组 r[3] = {x, y, z} 的函数,其中 x[1000]、y[1000]、z[1000] 每个都是一个数组并有 1000 个双浮点数。 我做了一个函数,它 returns r 形式的位置,我们需要通过解包内存位置来访问 x、y、z。我有这样的代码:
double cylinder(double radius, double height)
{
double x[1000], y[1000], z[1000];
double theta = 0, dtheta = M_PI / 500, dz = height / 1000;
z[0] = 0;
y[0] = 0;
x[0] = radius;
for (int i = 1; i < 1000; i++)
{
z[i] = z[i - 1] + dz;
theta = theta + dtheta;
x[i] = radius * cos(theta);
y[i] = radius * sin(theta);
}
double * r[3] = {x,y,z};
return **r;
}
现在如果我使用
data = cylinder(5, 10);
cout<<data<<endl;
它应该 return 一个位置,但为什么它 returns 5. 我需要有 'data' 的位置,从那里我会得到另外 3 个内存位置,其中 3 个在每个位置上都有所有 1000 个点。 如果能得到解决方案,我将不胜感激。
这可以通过结合使用标准库 std::vector
和 std::tuple
轻松解决,这就像一个真正轻量级的固定长度数组:
#include <vector>
#include <tuple>
std::vector<std::tuple<double,double,double>> cylinder(double radius, double height)
{
std::vector<std::tuple<double,double,double>> result;
double theta = 0;
double dtheta = M_PI / 500;
double dz = height / 1000;
// No need for an array or back-references here
double x = radius;
double y = 0;
double z = 0;
// Add the 0th entry
result.push_back({ x, y, z });
for (int i = 1; i < 1000; i++)
{
z += dz;
theta = theta + dtheta;
x = radius * cos(theta);
y = radius * sin(theta);
// Add subsequent entries
result.push_back({ x, y, z });
}
return result;
}
现在内存管理问题已通过使用容器解决。
如果 x
、y
和 z
在语义上很重要,您甚至可能想用这些属性制作一个小 struct
,而不是为其提供更多上下文。