如何在满足 constnt 表达式的同时将整数传递给指针,传递给 std::array<double, integer>?
How does one pass an integer, to a pointer, to an std::array<double, integer>, while satisfying a constnt expression?
我有一个函数 noise.cpp 目前的形式是,
double* noise(int* steps, ...)
//some code
std::array<double, *steps> NoiseOut;
//rest of code
正在被 cppnoise.cpp、
测试和访问
#include <random>
#include <cmath>
#include<stdio.h>
#include <iostream>
#include "noise.h"
main(){
double* out;
int steps = 8;
int* ptr = &steps;
out = noise(ptr, 1, 1000, 0.1, 1, 3);
printf("TEST \n");
std::cout << out[0];
}
有头文件,
extern double* noise(int*, double, double, double, double, double);
之前我通过 Python 访问了 noise.cpp 函数,其中 NoiseOut 数组最初是 double* NoiseOut = new double[steps];
并获得了理想的结果,但是这种方法导致了内存泄漏。
最初我尝试删除分配的内存。但是函数 returns NoiseOut,所以我不确定这是否可能?因此,我发现现代方法是使用 std::array,因为它带有某种形式的垃圾收集。如果我尝试这样做,
double* noise(int steps, ...)
std::array<double, steps> NoiseOut;
有人告诉我 steps 不是常量表达式。我尝试了 constexpr
、const
和 static
的所有方法,但都没有成功。通常有相同的错误error: ‘steps’ is not a constant expression
。另外,我将指针从 cppnoise.cpp 传递到 noise.cpp 的原因是因为我在某处读到该指针更容易使用,稍后在编译时?这样也许我可以将它转换为常量表达式?大概是发烧的梦吧。
那么,我如何在程序中声明一个整数值,我将其传递给一个函数,该函数可在 std::array 中使用而不会导致该错误?
注意:我是 c++ 的新手,主要使用 SQL、Python、R 和 SageMath。
std::array
不适合这个,因为在代码 运行 之前你不知道你需要什么尺寸。 std::array
编译时需要知道大小
使用 new
在 运行 时给出动态数组大小,这就是您之前可以使用它的原因。
如果您担心内存泄漏(或者实际上,一般而言),那么我建议改用 std::vector
:
#include <vector>
//...
std::vector<double> NoiseOut;
NoiseOut.reserve(*steps);
std::vector
应该允许您做大多数 std::array
或 C 数组允许您这样做的事情,尽管我建议阅读它的文档(上面链接)。请注意,std::vector
也以与 std::array
相同的方式提供了自己的各种垃圾收集。
我有一个函数 noise.cpp 目前的形式是,
double* noise(int* steps, ...)
//some code
std::array<double, *steps> NoiseOut;
//rest of code
正在被 cppnoise.cpp、
测试和访问#include <random>
#include <cmath>
#include<stdio.h>
#include <iostream>
#include "noise.h"
main(){
double* out;
int steps = 8;
int* ptr = &steps;
out = noise(ptr, 1, 1000, 0.1, 1, 3);
printf("TEST \n");
std::cout << out[0];
}
有头文件,
extern double* noise(int*, double, double, double, double, double);
之前我通过 Python 访问了 noise.cpp 函数,其中 NoiseOut 数组最初是 double* NoiseOut = new double[steps];
并获得了理想的结果,但是这种方法导致了内存泄漏。
最初我尝试删除分配的内存。但是函数 returns NoiseOut,所以我不确定这是否可能?因此,我发现现代方法是使用 std::array,因为它带有某种形式的垃圾收集。如果我尝试这样做,
double* noise(int steps, ...)
std::array<double, steps> NoiseOut;
有人告诉我 steps 不是常量表达式。我尝试了 constexpr
、const
和 static
的所有方法,但都没有成功。通常有相同的错误error: ‘steps’ is not a constant expression
。另外,我将指针从 cppnoise.cpp 传递到 noise.cpp 的原因是因为我在某处读到该指针更容易使用,稍后在编译时?这样也许我可以将它转换为常量表达式?大概是发烧的梦吧。
那么,我如何在程序中声明一个整数值,我将其传递给一个函数,该函数可在 std::array 中使用而不会导致该错误?
注意:我是 c++ 的新手,主要使用 SQL、Python、R 和 SageMath。
std::array
不适合这个,因为在代码 运行 之前你不知道你需要什么尺寸。 std::array
编译时需要知道大小
使用 new
在 运行 时给出动态数组大小,这就是您之前可以使用它的原因。
如果您担心内存泄漏(或者实际上,一般而言),那么我建议改用 std::vector
:
#include <vector>
//...
std::vector<double> NoiseOut;
NoiseOut.reserve(*steps);
std::vector
应该允许您做大多数 std::array
或 C 数组允许您这样做的事情,尽管我建议阅读它的文档(上面链接)。请注意,std::vector
也以与 std::array
相同的方式提供了自己的各种垃圾收集。