问题出现在foo()
(在注释行中)中,并且是foo2()
应该在其第一个参数中返回矩阵乘法重复过程的结果。它在第一种情况下可以运行,而在第二种情况下会失败。
B
和B_tmp
数组在foo()
的末尾应具有相同的值,并且不会发生
T
是1x6矩阵,A
是6x3矩阵,B
是200x3矩阵
foo3()
乘以TxA并将结果(1x3矩阵)存储在B
的末尾
foo2()
在B_t1_t2开头的操作无关紧要,它只是准备1x6矩阵,以某种方式更改顺序
我必须尝试解决此问题而不更改任何函数声明 我是c ++的新手,现在已经搜索了太久了,我感到绝望
#include <stdio.h>
#include <iostream>
#include <random>
#include <thread>
using namespace std;
double fRand(const double & min, const double & max) {
thread_local std::mt19937 generator(std::random_device{}());
std::uniform_real_distribution<double> distribution(min, max);
return distribution(generator);
}
int iRand(const int & min, const int & max) {
thread_local std::mt19937 generator(std::random_device{}());
std::uniform_int_distribution<int> distribution(min, max);
return distribution(generator);
}
void foo3(double T[6], double A[18], double *B)
{
for(int i = 0; i < 3; i++) {
double r = 0;
for(int j = 0; j < 6; j++) {
r += T[j] * A[i*3+j];
}
*B = r; B++;
}
}
void foo2(double *B, double *A, int from, int to)
{
for (int i=from; i < to; i++) { //This is not relevant but I leave it just in case
double B_t1_t2[6];
for (int x = 0; x < 3; x++)
B_t1_t2[x] = B[(i-1)*3 + x];
for (int x = 0; x < 3; x++)
B_t1_t2[x+3] = B[(i-2)*3 + x];
foo3(B_t1_t2, A, &B[i*3]);
}
}
void foo(double *A, double *B)
{
for (int i = 0; i < 18; i++)
A[i] = fRand(1, 2);
foo2(B, A, 2, 200);
cout << "\nB" << endl;
for (int i = 0; i < 600; i++)
cout << B[i] << " "; // HERE IS WORKING, B DOES NOT CONTAIN GARBAGE
cout << endl;
double B_tmp[600];
foo2(B_tmp, A, 2, 200);
cout << "\nB_tmp" << endl;
for (int i = 0; i < 600; i++)
cout << B_tmp[i] << " "; // WHY NOT WORKING HERE?
cout << endl;
}
int main()
{
double A[18], B[600];
for(int i = 0; i<6; i++)
B[i] = 1;
foo(A, B);
}
为什么cout
中的第二个foo()
显示为垃圾?
而且,如果必须更改声明,最好的方法是什么?
我正在尝试尽可能多地使用堆栈内存。
答案 0 :(得分:0)
在调用foo(A, B);
之前,已填充B数组的前6个元素(所有元素均设置为1)。在foo
函数中,您两次调用foo2
函数。在第一次调用中,您将B
数组传递到foo2
函数中,并且由于填充了B
而起作用。在foo2
中对foo
的第二次调用中,您传递了B_tmp
数组,但是该数组的所有项目都具有垃圾值,您没有初始化它们。
double B_tmp[600];
for (int i = 0; i < 6; ++i)
B_tmp[i] = 1;
foo2(B_tmp, A, 2, 200);