Как передать целое число указателю в массив std ::, удовлетворяя при этом выражение constnt? - PullRequest
1 голос
/ 29 октября 2019

У меня есть функция 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); 

Ранее я обращался к функции noise.cpp через Python, где изначально находился массив NoiseOut, double* NoiseOut = new double[steps]; с желаемыми результатами, но этот метод привел к утечке памяти.

Изначально япопытался удалить выделенную память. Но функция возвращает NoiseOut, поэтому я не уверен, возможно ли это? Вместо этого я обнаружил, что современный способ заключается в использовании std :: array, так как он поставляется с какой-то формой сборки мусора. Если бы я попытался сделать,

double* noise(int steps, ...)

std::array<double, steps> NoiseOut;

Мне сказали, что шаги не являются постоянным выражением. Я пробовал все возможные варианты constexpr, const и static, но безуспешно. Обычно с такой же ошибкой error: ‘steps’ is not a constant expression. Кроме того, причина, по которой я передаю указатель из cppnoise.cpp в noise.cpp, заключается в том, что я где-то читал, что с указателем легче работать, позже во время компиляции? Так что, может быть, я мог бы преобразовать его в постоянное выражение? Вероятно, лихорадочная мечта.

Итак, как я могу объявить целочисленное значение в программе, которое я передаю в функцию, которую можно использовать в массиве std ::, не вызывая этой ошибки?

ПРИМЕЧАНИЕ. Я очень плохо знаком с c ++ и работаю в основном с SQL, Python, R и SageMath.

1 Ответ

0 голосов
/ 29 октября 2019

std::array плохо подходит для этого, потому что вы не знаете, какой размер вам нужен, пока не выполнится код. std::array необходимо знать размер при компиляции.

Использование new дает динамический размер массива во время выполнения, поэтому вы можете использовать его раньше.

Если выЧто касается утечек памяти (или вообще вообще), то я предлагаю вместо этого использовать std::vector:

#include <vector>
//...
std::vector<double> NoiseOut;
NoiseOut.reserve(*steps);

* std::vector должно позволить вам делать практически все, что угодно std::array или C Array позволят вам сделать это, хотя я предлагаю ознакомиться с его документацией (ссылка выше). Обратите внимание, что std::vector также поставляется со своей собственной сборкой мусора таким же образом, что и std::array.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...