несовместимые типы при присвоении 'float' к 'float [16]' - PullRequest
2 голосов
/ 15 августа 2011

У меня есть структура:

struct mat4 {
    float m[16];
    mat4();
    ...
    float *getFloat();
}

float *mat4::getFloat() {
    return m;
}

Теперь я хочу сделать m равным m из вновь созданной матрицы r:

void mat4::rotate(vec3 v) {
    mat4 r, rx, ry, rz;
    ...
    matrix calculations
    ...
    m = *r.getFloat();
}

Но это дает мне ошибку "несовместимые типы при назначении" float "для" float [16] '" Я искал Google и пробовал разные способы, но пока безуспешно. Скажите, пожалуйста, как я могу это сделать?

Ответы [ 5 ]

5 голосов
/ 15 августа 2011

getFloat() возвращает указатель. m это массив. Если вы хотите скопировать все, что возвращается в m, вам нужно будет использовать std::copy или std::memcpy:

std::memcpy(m, r.getFloat(), sizeof(m));

Если бы вы хотели получить только одно число с getFloat(), вы могли бы сделать:

  • m[0] = *r.getFloat();
2 голосов
/ 15 августа 2011

r.getFloat() возвращает указатель на один float. Это разыменовывается, чтобы дать один float, а затем назначается массиву из 16 float.

Предполагая, что m содержит все состояние mat4, вы можете использовать встроенный оператор присваивания:

*this = r;

Компилятор автоматически реализует структуру dump / memcpy для копирования всех 16 чисел с плавающей запятой.

2 голосов
/ 15 августа 2011

Не используйте голые массивы Си.Это C ++, мы можем сделать намного лучше:

#include <tr1/array>  // or <array> if you're in MSVC or GCC

typedef std::tr1::array<float, 16> myfloats;

int main()
{
  myfloats a, b;
  a[0] = /* ... fill the array */
  b = a; // done
}

Вы также можете поместить массив в структуру вашей матрицы:

struct mat4
{
  typedef std::tr1::array<float, 16> myfloats;

  myfloats & data() { return m_data; }

  mat4(); /* ... etc.  ... */

private:
   myfloats m_data;
};

Вы должны иметь возможность просто назначать переменные типаmat4 друг другу напрямую!

2 голосов
/ 15 августа 2011

Используйте std::copy как:

#include <algorithm>

std::copy(r.m, r.m+16, m);

Кроме того, если вы можете использовать r.m напрямую, зачем звонить r.getFloat() тогда?

0 голосов
/ 15 августа 2011

r.getFloat () возвращает указатель на «свое» m.Массивы не могут быть скопированы с простым присваиванием;вам придется работать либо с memcpy() или memmove(), либо с for циклом над элементами массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...