Преобразувайте 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)


Зависи дали verticalLines ще остане или не. Ако е дефиниран както е по-горе и няма да се промени, можете да се откажете от целия malloc и просто да посочите lineVertices към него.

linesVertices = &verticalLines[0]

ако verticalLines ще се промени, вероятно искате свое собствено копие, така че нямате друг избор освен да копирате действителните данни от една част от паметта в друга, както правите, като се има предвид това, това може да е малко по-елегантно

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