153 / 7 / 1
Регистрация: 14.08.2019
Сообщений: 616
1

Работа с вектором

11.04.2021, 21:17. Показов 1955. Ответов 11
Метки нет (Все метки)

Объявление
C++
1
vector<float> matrixes;
Добавление массива с данными матрицы
C++
1
2
3
float matrix[16]{};
glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
matrixes.emplace_back(matrix, 16);
(Правильно ли?)

Итерация
C++
1
2
3
4
5
6
7
8
auto it = matrixes.begin();
 
for (; it != matrixes.end(); ++it)
{
    glMatrixMode(GL_MODELVIEW);
    glLoadMatrixf(*it); // Ругается на то что *it должен быть const float
    draw();
}
Поправьте пожалуйста <3
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.04.2021, 21:17
Ответы с готовыми решениями:

Работа с вектором
Здравствуйте! Помогите, пожалуйста разобраться..я только изучаю язык. Как в данной программе...

Работа с вектором
Доброго времени суток! Подскажите, пожалуйста, можно ли как-то задать значения вектору после его...

Работа с вектором
Задание: Вектор В сформировать из целых случайных чисел в диапазоне . а) найти минимальный...

Работа с вектором
Помогите разобраться что к чему, примеров найти не смог: Спасибо.

11
Эксперт С++
8719 / 4262 / 950
Регистрация: 15.11.2014
Сообщений: 9,669
11.04.2021, 21:24 2
Лучший ответ Сообщение было отмечено eXpl01TeR как решение

Решение

Цитата Сообщение от eXpl01TeR Посмотреть сообщение
(Правильно ли?)
нэт

C++
1
2
3
4
5
6
7
8
#include <vector>
 
int main()
{
    std::vector<float> matrixes;
    float matrix[16]{};
    matrixes.assign(std::begin(matrix), std::end(matrix));
}
1
153 / 7 / 1
Регистрация: 14.08.2019
Сообщений: 616
11.04.2021, 21:33  [ТС] 3
hoggy, а с
C++
1
glLoadMatrixf(*it); // Ругается на то что *it должен быть const float
Как быть?

Добавлено через 2 минуты
Сделал вот так
C++
1
glLoadMatrixf(const_cast<float*>(&test));
Но мне кажется это не правильно.. Ошибок нет, но и эффекта нужного тоже. Хотя, он может не быть и из-за чего-то ещё. Я правильно сделал const_cast?
0
437 / 281 / 182
Регистрация: 23.06.2018
Сообщений: 650
11.04.2021, 21:36 4
Лучший ответ Сообщение было отмечено eXpl01TeR как решение

Решение

Если ваш замысел был хранить несколько матриц в одном векторе, то в принципе всё неправильно...
Во-первых добавление новой матрицы работет как matrixes.insert(matrixes.end(), std::begin(matrix), std::end(matrix));
Во-вторых glLoadMatrixf принимает указатель на первый элемент массива из 16 элементов. Следовательно использование:
C++
1
2
3
4
5
6
for (int i = 0; i < matrixes.size(); i += 16)
{
    glMatrixMode(GL_MODELVIEW);
    glLoadMatrixf(matrixes.data() + i);
    draw();
}
А вообще для OpenGL есть отдельная ветка форума...
0
153 / 7 / 1
Регистрация: 14.08.2019
Сообщений: 616
11.04.2021, 21:41  [ТС] 5
Цитата Сообщение от Bleach163 Посмотреть сообщение
А вообще для OpenGL есть отдельная ветка форума...
Так тут вопрос конкретно про векторы а не OpenGL. OpenGL тут чисто проездом))
0
437 / 281 / 182
Регистрация: 23.06.2018
Сообщений: 650
11.04.2021, 21:44 6
Да-да, именно поэтому вы пытаетесь запихнуть в OpenGL функцию вместо массива всего одно число и спрашиваете в чём проблема...
0
Эксперт С++
8719 / 4262 / 950
Регистрация: 15.11.2014
Сообщений: 9,669
11.04.2021, 21:45 7
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Как быть?
1. почитать документацию gl.

C++
1
2
3
void WINAPI glLoadMatrixf(
   const GLfloat *m
);
2. почитать документацию std::vector

C++
1
const value_type* data() const noexcept;
3. перевести взгляд на свой код.
4. включать мозг.
5. подумать.
6. исправить глупую ошибку.

6.
PROFIT???!!!


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <vector>
 
using GLfloat = float;
 
void /*WINAPI*/ glLoadMatrixf(const GLfloat*){}
 
int main()
{
    std::vector<float> matrixes;
    float matrix[16]{};
    matrixes.assign(std::begin(matrix), std::end(matrix));
    glLoadMatrixf(matrixes.data());
}
0
153 / 7 / 1
Регистрация: 14.08.2019
Сообщений: 616
11.04.2021, 21:45  [ТС] 8
Bleach163, Но, раз уж Вы тут, подскажите пожалуйста, реализуемая ли вообще эта задумка или кто-то из нас (я и тот чувак с английского stackoverflow) друг-друга не понял? У меня НЕТ доступа к позиции в которой рисуется нужный мне объект (игра не моя) но я знаю как задетектить отрисовку нужного мне объекта. Он сказал что мне нужно сохранить матрицу с её настройками и потом когда вызовется SwapBuffers дорисовать уже то что я хочу (я знаю что можно отрисовать то что мне нужно сразу но дело в том что игра накладывает тени уже после отрисовки того объекта который я детекчу и на то что я нарисовал накладывается тень)
0
153 / 7 / 1
Регистрация: 14.08.2019
Сообщений: 616
11.04.2021, 21:48  [ТС] 9
Цитата Сообщение от Bleach163 Посмотреть сообщение
хранить несколько матриц в одном векторе, то в принципе всё неправильно
Почему?
0
437 / 281 / 182
Регистрация: 23.06.2018
Сообщений: 650
11.04.2021, 22:01 10
Цитата Сообщение от hoggy Посмотреть сообщение
ещё раз внимательно прочитай,
что именно ожидает функция.
A pointer to a 4x4 matrix stored in column-major order as 16 consecutive values.
Нет, ну если вам принципиально чтобы я назвал это именно указателем на массив, то пожалуйста, указатель на массив.

Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Почему?
Потому что emplace_back внутри вызывает конструктор с переданными ему параметрами, а float(float*, int) насколько я знаю не работает.
Также, раз уж glLoadMatrixf принимает матрицу, то закидывать по одному элементу или смешивать две разные матрицы какой-то... Странный вариант.
0
Эксперт С++
8719 / 4262 / 950
Регистрация: 15.11.2014
Сообщений: 9,669
11.04.2021, 22:06 11
Цитата Сообщение от Bleach163 Посмотреть сообщение
Нет, ну если вам принципиально чтобы я назвал это именно указателем на массив, то пожалуйста, указатель на массив.
нет-нет,
с твоим сообщением всё в порядке.

это моё сообщение #9 некорректное.
я уже попросил модераторов удалить его,
что бы людей не смущало.
0
153 / 7 / 1
Регистрация: 14.08.2019
Сообщений: 616
11.04.2021, 22:16  [ТС] 12
Цитата Сообщение от Bleach163 Посмотреть сообщение
Также, раз уж glLoadMatrixf принимает матрицу, то закидывать по одному элементу или смешивать две разные матрицы какой-то... Странный вариант.
Ох, это за гранью моего понимания. Как бы Вы посоветовали мне быть в таком случае? Мне нужно сохранить несколько матриц (количество может быть разное)

Добавлено через 2 минуты
Там написано что glLoadMatrixf принимает указатель на матрицу 4х4 в порядке по столбцам как 16 последовательных значений. То есть, по идее как раз массив который я и хотел передавать. Или я Вас не правильно понял?

Добавлено через 7 минут
Все вроде-бы работает.. Спасибо!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.04.2021, 22:16
Помогаю со студенческими работами здесь

Работа с вектором символов
Есть вектор, который заполнен символами типа &quot;char&quot;. Код должен удалить все повторяющиеся символы...

Работа с вектором из класса
Доброго времени суток ! Не до конца понимаю &quot;Как это работает&quot;© Есть вектор указателей,...

Работа с вектором с помощью итераторов
Вобщем, у меня есть вектор объектов, и задали задание работать с этим вектором с помощью...

Работа с вектором структур в функции
Здравствуйте. У меня возникли затруднения с работой вектора структур, пытаюсь передать в функцию,...

Работа со string, который под вектором
Не могу никак понять как удалить символ из строчки, которая является элементом вектора. Честно...

Не правильная работа memcpy с вектором - параметром функции
Есть функция int InitX( CUSTOMVERTEX InVertexes, int VertexCount ) { //... void*...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru