将GLfloat []数组转换为GLfloat *数组

时间:2012-10-12 19:34:43

标签: objective-c c opengl-es objective-c++

有没有更快捷的方法将以下数据转换为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
}
}

2 个答案:

答案 0 :(得分:1)

这取决于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);
}

答案 1 :(得分:0)

直接使用verticalLines有什么问题?类型为T ident[n]的任何内容都可以隐式转换为T* ident,就像您已编写&ident[0]一样。如果你真的想要明确,你可以直接写&ident[0]