1

我知道这个问题已经在别处被问过了,但我一直不明白这里出了什么问题。也许我做错了什么,因为这两个数组在一个结构内。

(编辑:我从其他代码中获取结构,我无法更改它)

我试图将两个浮点数组传递给一个函数,然后将操作结果保存在第一个数组中。

核心.h:

typedef struct{
    //other stuff
    float m_vector[16];
} structure_t;

class CoreClass{
    private:
        structure_t s1;
        structure_t s2;

       float *MyFunction(const float *vDest, const float *vNew);
}

核心.cpp:

#include "core.h"
#include "another_file.h"

void anotherFunction(){
    //....
    s1.m_vector = MyFunction(s1.m_vector, s2.m_vector); //error here
    //....    
}

float *CoreClass::MyFunction(const float *vDest, const float *vNew){
    return yet_another_function(vDest, vNew);
}

但是,当我调用该函数时,出现此错误:

error: incompatible types in assignment of ‘float*’ to ‘float [16]’

为了完整起见,这是我正在调用的函数,尽管它在编译时似乎没有任何问题:

另一个文件.h

static __inline float *yet_another_function(const float *vDest, const float *vNew){
    float *tmp = new float[16];
    //tmp = matrix multiplication (vDest * vNew)
    for(int i=0; i<4; i++)
        for(int j = 0; j<4;j++)
            for(int k = 0; 4; k++)
                tmp[i + j*4] += vDest[i + k*4] * vNew[k + j*4];

    return tmp;

}
4

2 回答 2

2

问题是因为您将指针分配给数组。在 C++ 中,您不能将指针分配给数组。

s1.m_vector = MyFunction(s1.m_vector, s2.m_vector);
  ^^ array   ^^ return pointer  

MyFunction您可以使用从to复制返回值s1.m_vector。但是为什么你需要重新分配价值s1.m_vector呢?你可以让MyFunction函数引用structure_t并在内部修改m_vector

void MyFunction(structure_t& vDest, const structure_t& vNew)
{
    vDest.m_vector[0] = vNew.m_vector[0];
    //...
    vDest.m_vector[15] = vNew.m_vector[15];
}

编辑

yet_another_function(structure_t* t, structure_t& vDest, const structure_t& vNew)
{
    // blah blah
    t->m_vector[i + j*4] += vDest.m_vector[i + k*4] * vNew.m_vector[k + j*4];
}
于 2013-02-06T08:35:40.353 回答
0

看起来您返回了一个指向 float 的指针并试图将其保存到您的数组中。structure_t.m_vector 是一个数组而不是指针。

你可以像这样修复它:

float * temp = MyFunction(s1.m_vector, s2.m_vector);
for(int i=0; i<16;i++)
    s1.m_vector[i] = temp[i];
delete[] temp; 

这仍然很容易出错,如果你在 yet_another_function 中新的大小不是 16,你就会遇到错误。作为一般规则,建议使用 std::array 或 std::vector 并按值返回。如果您的编译器支持 c++ 11,则按值返回的移动语义不会影响性能。

于 2013-02-06T08:34:29.220 回答