LINUX.ORG.RU

m=(float[]){1,2,3,4};

или иной путь(коих в С++ много) помочь компилятору вывести тип

MKuznetsov ★★★★★
()

Типа такого?

float *m;
...
const float init[] = {1, 2, 3, 4, 5, 6};
m = new float[6];
for(int i = 0; i < 6; i++) m[i] = init[i];
...
delete [] m;
Werenter ★★★
()
Последнее исправление: Werenter (всего исправлений: 3)

Непонятно что надо. Указателю, по определению, можно присвоить только адрес. Массив значений - это не адрес.

James_Holden ★★★★★
()

И вообще, раз ты пишешь на плюсах, а не на сишке - можно использовать std::vector или std::array.

Werenter ★★★
()

До C99 вроде никак. Ну можно каким-нибудь извратом вроде закодированного в строковом литерале float-а, но это точно undefined behaviour во все поля.

С C99 - https://en.cppreference.com/w/c/language/compound_literal

vbr ★★★★★
()

Я что-то не понял дебаг показывает что массив 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)
Ответ на: комментарий от bad_master

Потому что он обьявлен как массив, а не как указатель. Просто сделай, как я говорю, должно работать. Я не знаю, почему Qt Creator работает так.

Werenter ★★★
()
	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)
Ответ на: комментарий от bad_master

Если подаю indices_ то все работает, если подаю indices то то не работает

Выше5 уже сказал что ты на indices память не выделил.

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

Не в этом дело, дело в неправильном использовании sizeof

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

вынос мозга ентот современный gl чтобы что-то изменить надо в десяти местах код править

Оборачивай типовые и связанные вещи в функцию. =)

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

То ли дело старый добрый OpenGL 1.0 -

glBegin(...);
glVertex2f(...);
glVertex2f(...);
...
glEnd();

и треугольник готов

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

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

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

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

MKuznetsov ★★★★★
()

Убери c++ из тегов. Это галимая сишка.

ox55ff ★★★★★
()

C++ и указатели…

С вероятностью 99% ты что-делаешь не так.

Чем std::vector не угодил? А ещё лучше, опиши полную задачу.

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

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

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

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

Если вам нужен массив на стеке, то нет нужды так делать, как вы хотите, а если нужен массив на куче, то 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)
Ответ на: комментарий от bad_master

Библиотека С++ очень вряд ли требует сырой указатель. Скорее всего вы используете библиотеку Си (зачем?).

И, как вам уже сказали выше, есть метод data

zx_gamer ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.