Когда перечесляют через сout елементы массива double вместо чисел -1.45682e+144 и не критичная ошибка C6385
void S(double* x ) {
for (int i = 0; i < l; ++i) {
n[i] = x[i];
cout << n[i] << endl;
}
}
вот откуда берется х
double* GetInput(const char * filename, unsigned int h,unsigned int w) {
sf::Image image;
vector<double> in;
image.loadFromFile(filename);
for (unsigned int i = 0; i < h; ++i) {
for (unsigned int j = 0; j < w; ++j)
{
sf::Color c;
c = image.getPixel(j,i );
in.push_back((int)(c.r + c.b + c.g) / 3);
//int u = (int)((c.r + c.b + c.g) / 3);
//cout << u << endl;
}
}
double* input = &in[0];
//copy(in.begin(), in.end(), input);
return input;
}
а l это костанта которая равна w*h и текст ошибки вот текст ошибки серьезность код описание проект файл строка состояние подавления предупреждение c6385 чтение недопустимых данных из "x": доступный для чтения объем равен "l 8" байт, однако считать можно только "16" байт. source.cpp 156
int main(){
N g(28*28);//это и есть 'l'
g.S(GetInput("f.png", 28, 28));
return 0;
}
Ответы (2 шт):
Т.к. вы возвращаете double* input, а не vector<double> in при завершении этой функции у in вызывается деструктор, где происходит удаление данных, а вы возвращаете указатель на эти данные, следовательно в input после завершения функции будут не определенные значения, ну и в целом вы возвращаете пустой указатель.
Чтобы решить эту проблему нужно сначала под input выделить новую память куда мы будем копировать данные из вектора, а потом раскомментировать строчку :)) :
double* input = new double[w * h];
copy(in.begin(), in.end(), input);
то есть произвести полное копирование данных.
а вот это помогло
/*double* input = &in[0];
copy(in.begin(), in.end(), input);*/
double* input = new double[w * h];
for (int i = 0; i < w * h; i++) {
input[i] = in[i];
}
return input;