Преобразование массива GLfloat [] в массив GLfloat *

Есть ли более быстрый способ преобразовать следующие данные в массив указателей в стиле c?

GLfloat verticalLines [] = {
0.59, 0.66, 0.0,    
0.59, -0.14, 0.0
}

Мой текущий подход заключается в том, чтобы вручную перебирать данные, используя метод ниже:

-(GLfloat *)updateLineVertices{

int totalVertices = 6;
GLfloat *lineVertices =  (GLfloat *)malloc(sizeof(GLfloat) * (totalVertices));

for (int i = 0; i<totalVertices; i++) {
    lineVertices[i] = verticalLines[i];
}

return lineVertices;
}

Некоторая дополнительная информация. В конечном итоге мне понадобятся данные в формате, которым можно легко манипулировать, например:

-(void)scaleLineAnimation{
GLfloat *lineVertices = [self updateLineVertices];
for (int i = 0; i<totalVertices; i+=3) {
     lineVertices[i+1] += 0.5; //scale y axis
}
}

person user1607261    schedule 12.10.2012    source источник
comment
за необходимость иметь дело с массивом как с координатами, может помочь, что вы можете волшебным образом превратить массив в матрицу, используя правильную схему адресации элементов, см. здесь: stackoverflow.com/questions/6281728/   -  person Intentss    schedule 13.10.2012


Ответы (2)


Это зависит от того, останутся ли вертикальные линии или нет. Если он определен так, как указано выше, и не собирается меняться, вы можете отказаться от всего malloc и просто указать на него lineVertices.

linesVertices = &verticalLines[0]

если вертикальные линии будут изменены, вам, вероятно, нужна собственная копия, поэтому у вас нет другого выбора, кроме как копировать фактические данные из одной части памяти в другую, как вы это делаете, это, как говорится, может быть немного более элегантным

for (int i = 0; i<totalVertices; i++){
    lineVertices[i] = verticalLines[i];
}

или предпочтительным методом, вероятно, является использование memcopy(), вот некоторый рабочий код

//MemcopyTest.c
#include <cstdlib>
#include <stdio.h>
#include <string.h>

int main(){
   float a[] = {1.0,2.0,3.0};     //Original Array

   int size = sizeof(float)*3;      
   float *b = (float*)malloc(size); //Allocate New Array
   memcpy(b, a, size);              //Copy Data

   for(int i = 0; i<3; i++){
      printf("%f\n", b[i]);
   }
   free(b);
}
person Intentss    schedule 12.10.2012
comment
Да, данные изменятся. Я надеялся, что будет волшебная операция типа приведения... что-то вроде GLfloat *lineVertices = (GLfloat *) verticalLines; Сказав, что я могу использовать элегантное решение для начала и использовать исходный формат в других частях моей программы, где мне нужно манипулировать данными - формат просто помогает мне идентифицировать элементы x, y, z. - person user1607261; 13.10.2012
comment
Что ж, если вы хотите задействовать string.h, я думаю, вы можете использовать memcpy ;/ (см. обновление выше). - person Intentss; 13.10.2012
comment
спасибо, я уже использую memcpy для создания vbo, но я уверен, что использование его и здесь не повредит производительности. - person user1607261; 13.10.2012

Что плохого в том, чтобы просто использовать verticalLines напрямую? Все, что имеет тип T ident[n], может быть неявно преобразовано в T* ident, как если бы вы написали &ident[0]. И если вы действительно хотите быть явным, вы можете просто написать &ident[0] напрямую.

person Lily Ballard    schedule 12.10.2012