调用函数后数组中的垃圾

时间:2018-06-21 09:01:30

标签: c++ function pointers matrix matrix-multiplication

问题出现在foo()(在注释行中)中,并且是foo2()应该在其第一个参数中返回矩阵乘法重复过程的结果。它在第一种情况下可以运行,而在第二种情况下会失败。

BB_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()显示为垃圾? 而且,如果必须更改声明,最好的方法是什么?

我正在尝试尽可能多地使用堆栈内存。

1 个答案:

答案 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);