LINUX.ORG.RU

Я что-то не понял дебаг показывает что массив indices состоит из нуля одного

GLuint *indices;
indices = new GLuint[12];
GLuint  indices_[] = {
	0,1,2,
	3,4,5,
	6,7,8,
	9,10,11
	};// Note that we start from 0!
	for(int i=0;i<12;i++)
		indices[i] = indices_[i];

bad_master
() автор топика
Последнее исправление: bad_master (всего исправлений: 1)
Ответ на: комментарий от bad_master

Это просто ты не умеешь дебаггером пользоваться. Если у тебя Qt Creator - то он показывает только первый элемент массива по умолчанию. Чтобы увидеть все, надо написать такое выражение в окне watch values(на точность не претендую по названию): array_name[0..12]

Werenter ★★☆
()
Последнее исправление: Werenter (всего исправлений: 1)
	float array__[10] = {1,2,3}; ///array float[10] declared
	float (*xx) [10] = nullptr; ///pointer to array float[10] declared
	xx = &array__; ///assignment of array address to pointer to array
	
	float *some_pointer = &array__[0]; ///pointer to float declared and initialised with address of first element of array__
	some_pointer[5] = 666; ///use the pointer as "pointer to array"
alysnix ★★★
()

Кастануть тип в нужный, как и всегда.

#include <stdio.h>
int main()
{
    float* m = NULL;
    
    m=(float[]){1,2,3,4,5,6};

    int i = 0;
    for (i = 0; i < 6; ++i) 
    {
        printf("%f\n",m[i]);
    }
    return 0;
}

Сработает везде и всегда

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от Werenter

то есть происходит разная штука после того как я подаю этот массив сюда


	GLuint EBO;
	f->glGenBuffers(1, &EBO);
	f->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
	f->glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices_), indices_, GL_STATIC_DRAW);
Если подаю indices_ то все работает, если подаю indices то то не работает

bad_master
() автор топика
Ответ на: комментарий от bad_master

sizeof(indices_) - это было больно. sizeof нельзя так использовать, надо: sizeof(float) * 12, тогда это будет работать. Дело в том, что sizeof вычисляется на этапе компиляции, следовательно там sizeof не массива, а указателя.

Werenter ★★☆
()
Последнее исправление: Werenter (всего исправлений: 2)
Ответ на: комментарий от bad_master

Если написать обёртки, то намного проще всё и красивее. Если идти по learnopengl, там так и будет. Самое сложное - это втянуться, а дальше уже сильно легче.

А ещё ты не видел вулкана, там куда многословнее.

Werenter ★★☆
()
Последнее исправление: Werenter (всего исправлений: 3)
Ответ на: комментарий от bad_master
GLuint *indices; /*указатель на 1 элемент*/
indices = new GLuint[12];
GLuint  indices_[] = {
	0,1,2,
	3,4,5,
	6,7,8,
	9,10,11
	};// Note that we start from 0!
	for(int i=0;i<12;i++)
		indices[i] = indices_[i]; /*итерация...*/

А в indices кто память выделать будет? =)

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

А в indices кто память выделать будет? =)

не вполне понятно зачем вообще её выделять..

какое-то масло маслянное - упомянутый glBufferData сам занимается распределением и параметр data у него const (специально глянул справочник) для однократного копирования куда-то внутрь. Его не обязательно выделять в хипе и держать до звонка. Он однократный

MKuznetsov ★★★★★
()

Есть такой код

Такого кода нет.

В С++ управлять нормально памятью без классов-оберток нельзя, потому что выделенная в конструкторе класса память в случае исключения – утечёт.

Если вам нужен массив на стеке, то нет нужды так делать, как вы хотите, а если нужен массив на куче, то 10000 раз подумайте о возможных проблемах. С вероятностью 99% std::vector<T> будет лучшим решением размещения массива на куче.

Опять-таки при размещении массива на стеке часто целесообразно использовать std::array<T, std::size_t>, вместо сишного массива, нестандартных возможностей компилятора в виде VLA или нестандартных функций вроде alloca.

zx_gamer ★★★
()
Ответ на: комментарий от zx_gamer

тебе и остальным ребятам не понимающим зачем я использую массив вместо stl контейнеров объясняю - так надо в библиотеке которую я использую иначе никак

bad_master
() автор топика
Ответ на: комментарий от bad_master

так надо в библиотеке которую я использую иначе никак

У std контейнеров есть метод data(), который возвращает голый указатель для передачи в как раз такие библиотеки, и size() до кучи.

UPD: посмотрел доку на glBufferData -> size() надо умножить на sizeof(T), т.к. data имеет тип const void*

her_s_gory
()
Последнее исправление: her_s_gory (всего исправлений: 1)