ページ 11

動的確保がうまく行かない

Posted: 2014年1月11日(土) 20:43
by bonbo
すみません、一つ質問が解決していないのですが
動的確保についてあまり理解が済んでいなかったのか、
うまくいかないところが生じてしまったので質問させていただきます。

コード:

int count =10;
GLfloat *squareVertices=new GLfloat(count*8);
for (int vert=0; vert<count; vert++) {
                squareVertices[(vert)*8+0]=vert*10      ;squareVertices[(vert)*8+1]=0 ;
                squareVertices[(vert)*8+2]=vert*10+width;squareVertices[(vert)*8+3]=0 ;
                squareVertices[(vert)*8+4]=vert*10      ;squareVertices[(vert)*8+5]=10;
                squareVertices[(vert)*8+2]=vert*10+width;squareVertices[(vert)*8+7]=10;
            }
これだけなのですが、エラーがおこってしまいます。
NSLog(@"%f",(GLfloat *)squareVertices);
で、チェックすると
nan
がかえってきてしまいます。
どこがおかしいのでしょうか。

Re: 動的確保がうまく行かない

Posted: 2014年1月11日(土) 20:48
by bonbo
忘れていました。
よろしくおねがいします。

Re: 動的確保がうまく行かない

Posted: 2014年1月11日(土) 20:59
by bonbo
なにをやっているんだ…
注釈を書こうとしたら間違えて送信をしてしまいました。
すみませんでした。

コード:

typedef float           GLfloat;
で定義されています。
よろしくおねがいします。

Re: 動的確保がうまく行かない

Posted: 2014年1月11日(土) 21:02
by softya(ソフト屋)
iPhone系は答えられないですが、言語や機種の表明とかcodeタグとかちゃんと使ってくださいね。C++になってました。

コード:

int count =10;
GLfloat *squareVertices=new GLfloat(count*8);
for (int vert=0; vert<count; vert++) {
                squareVertices[(vert)*8+0]=vert*10      ;squareVertices[(vert)*8+1]=0 ;
                squareVertices[(vert)*8+2]=vert*10+width;squareVertices[(vert)*8+3]=0 ;
                squareVertices[(vert)*8+4]=vert*10      ;squareVertices[(vert)*8+5]=10;
                squareVertices[(vert)*8+2]=vert*10+width;squareVertices[(vert)*8+7]=10;
            }

Re: 動的確保がうまく行かない

Posted: 2014年1月11日(土) 21:09
by みけCAT
bonbo さんが書きました:NSLog(@"%f",(GLfloat *)squareVertices);
で、チェックすると
nan
がかえってきてしまいます。
どこがおかしいのでしょうか。
おかしいのはここで、

コード:

NSLog(@"%f",*((GLfloat *)squareVertices));
が正しいのではないでしょうか?

Re: 動的確保がうまく行かない

Posted: 2014年1月11日(土) 21:13
by bonbo
すみません・・・

Re: 動的確保がうまく行かない

Posted: 2014年1月11日(土) 21:46
by bonbo
>みけCATさん
ありがとうございます。
なおしたらちゃんと
80.0がかえってきました。
となると

コード:

for (int vert=0; vert<count; vert++) {
                squareVertices[(vert)*8+0]=vert*10      ;squareVertices[(vert)*8+1]=0 ;
                squareVertices[(vert)*8+2]=vert*10+width;squareVertices[(vert)*8+3]=0 ;
                squareVertices[(vert)*8+4]=vert*10      ;squareVertices[(vert)*8+5]=10;
                squareVertices[(vert)*8+6]=vert*10+width;squareVertices[(vert)*8+7]=10;
            }
ここがおかしいのですね。
ちゃんと80個の動的確保ができてるのに
squareVertices[79]に代入するとエラーで終了してしまいます。

Re: 動的確保がうまく行かない

Posted: 2014年1月11日(土) 21:51
by みけCAT
bonbo さんが書きました:なおしたらちゃんと
80.0がかえってきました。
それは正しい値ではない気がします。
コードをみると、squareVertices[0]には0が入るのが正しい仕様に見えます。
80.0は10*8、すなわちcount*8ですね。
このことから、おそらくcount*8で初期化された1個のGLfloat型の要素を確保していると思います。
Objective-Cの仕様はわからないのですが、C++ならnew GLfloat[count*8]と書くはずです。
bonbo さんが書きました:ちゃんと80個の動的確保ができてるのに
この根拠は何ですか?

Re: 動的確保がうまく行かない

Posted: 2014年1月11日(土) 22:11
by bonbo
できました。
ぜんぜん分かってなかったのですね。ごめんなさい。
GLfloat *squareVertices=new GLfloat(count*8);
の()を[]に直したら
GLfloat *squareVertices=new GLfloat[count*8];
うまくいきました。
ちゃんと0がかえってきました。
ありがとうございました。