1

次のデータをACスタイルのポインター配列に変換するより簡単な方法はありますか?

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
}
}
4

2 に答える 2

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);
}
于 2012-10-12T19:58:09.660 に答える
0

verticalLines直接使用することの何が問題になっていますか?型のすべては、あなたが書いたかのT ident[n]ように暗黙的に変換することができます。そして、本当に明確にしたいのであれば、直接書くことができます。T* ident&ident[0]&ident[0]

于 2012-10-12T20:05:19.573 に答える