У меня проблемы с функцией push_back()
в C++
. По причине, которую я не понимаю, функция push_back будет «не принимать» значение, которое я говорю, чтобы добавить его, но код работает отлично, пока я не попытаюсь отобразить значения, которые я хочу (конец кода). Я проверил тип значения, который является двойным, но он все равно не добавит его.
Значение, которое я пытаюсь вставить, исходит от функции, которая вычисляет среднее значение вектора, извлекая значения NaN
. Код работает отлично, но когда я пытаюсь отобразить нужные значения, я всегда получаю: Segmentation fault (core dumped)
. Эта функция mean
сначала выполняет итерацию по диапазону и создает вектор, в котором NaN
будет убран. Тогда будет рассчитано среднее значение. Я потратил довольно много времени, пытаясь выяснить, откуда может возникнуть ошибка, но не смог ничего выяснить, поэтому любая помощь будет высоко оценена. Следующая функция mean
:
double mean_func(double **arr, int iterations, int header, int start){
std::vector<double> vec;
for (int i=start-iterations; i < start; i++){
vec.push_back(arr[i][header]);
}
vec.erase(std::remove_if(std::begin(vec),
std::end(vec),
[](const auto& value) { return std::isnan(value); }),
std::end(vec));
double sum = std::accumulate(vec.begin(), vec.end(), 0.0);
double mean = sum / vec.size();
return mean;
}
Весь код, в котором transf_array_2_vec преобразует вектор в массив.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <omp.h>
#include <cmath>
#include <vector>
#include <algorithm>
#include <iostream>
#include <numeric>
#include <typeinfo>
double** transf_vec_2_array(std::vector<std::vector<double> > vals, int N, int M)
{
double** temp;
temp = new double*[N];
#pragma omp parallel for
for(int i=0; (i < N); i++)
{
temp[i] = new double[M];
for(int j=0; j < M; j++)
{
temp[i][j] = vals[i][j];
}
}
return temp;
}
double mean_func(double **arr, int iterations, int header, int start){
std::vector<double> vec;
for (int i=start-iterations; i < start; i++){
vec.push_back(arr[i][header]);
}
vec.erase(std::remove_if(std::begin(vec),
std::end(vec),
[](const auto& value) { return std::isnan(value); }),
std::end(vec));
double sum = std::accumulate(vec.begin(), vec.end(), 0.0);
double mean = sum / vec.size();
return mean;
}
double** cfun(double **indata, unsigned int rows, unsigned int cols, int max_inputs, int daily_inputs, int weekly_inputs, int inputs_short_term, const char **header_1, const char **header_2, unsigned int size_header_1, unsigned int size_header_2, double **outdata) {
std::vector< std::vector <double>> seq_collec;
std::vector<double>seq;
unsigned int i, j, k, l;
unsigned int temp= 5080;
int num = omp_get_thread_num();
omp_set_num_threads(num);
//#pragma omp parallel for //private(seq)
for(i = max_inputs + weekly_inputs; i < temp ; i++) {
for(j = 0; j < size_header_1; j++ ){
for(k = 0; k < size_header_2 ; k++){
for(l = i-max_inputs; l < i; l++){
if((strcmp(header_2[k],"price")==0)|| (strcmp(header_2[k], "change")==0)){
seq.push_back(indata[l][j+k]);
seq.push_back(mean_func(indata, inputs_short_term, j*size_header_2, l));
//std::cout << i << " " << j << " " << k <<std::endl;
//std::cout << header_1[j] << " " << header_2[k] << std::endl;
//std::cout << typeid(mean).name() << std::endl;
//std::cout << mean_func(indata, inputs_short_term, j*size_header_2, l) << std::endl;
}else{
seq.push_back(indata[l][j+k]);
//std::cout << header_1[k] << " " << header_2[k] << std::endl;
}
}
}
seq.push_back(mean_func(indata, daily_inputs, j+k, l));
seq.push_back(mean_func(indata, weekly_inputs, j+k, l));
}
//std::cout << seq.size() << std::endl;
seq_collec.push_back(seq);
seq.clear();
}
outdata = transf_vec_2_array(seq_collec, seq_collec.size(), seq_collec[0].size());
//std::cout << seq_collec.size() << std::endl;
//std::cout << seq_collec[0].size() << std::endl;
return outdata;
}
int main(){
int rows = 10846, cols = 12, max_inputs = 20, daily_inputs = 1000, weekly_inputs=5000, inputs_short_term=4;
unsigned int size_header_1 = 3, size_header_2 = 4;
const char *header_1[size_header_1] = {"CH:SMI","DJIA","RUI"};
const char *header_2[size_header_2] = {"change","delta_vol","price","volume"};
double* *indata = new double*[rows];
double* *outdata = new double*[rows];
for (int i=0; i < rows; i++){
indata[i] = new double[cols];
outdata[i] = new double[cols];
}
for (int i=0; i < rows; i++){
for (int j=0; j < cols; j++){
indata[i][j]=i + j ;
}
}
outdata = cfun(indata, rows, cols, max_inputs, daily_inputs, weekly_inputs, inputs_short_term, header_1, header_2, size_header_1, size_header_2, outdata);
for(int j = 0; j < 1; j++){
for(int i = 0; i < 366; i++){
std::cout << outdata[i][j] << std::endl; // PROBLEM HERE !!!
}
}
return 0;
}