ページ 1 / 1
配列をポインタで渡せない。
Posted: 2010年11月22日(月) 08:08
by NANA
いつもお世話になっております。
現在VC++2010でプログラミングをしているのですが、配列をポインタで渡そうとすると、
コンパイルエラーが起こってしまい、解決法がわからなかったので、解決法をご教授いただければと思います。
まず、以下のような関数を作成しました。
int TextSmoothDraw ( char STRING[256], int *Count, char *STRINGBUF[256] ){
int StringLen, StringLen2 ;
if ( STRING[*Count] != '\0' ){
*STRINGBUF[*Count] = STRING[*Count] ;
StringLen = strlen( STRING ) ;
StringLen2 = GetDrawStringWidth( *STRINGBUF, StringLen ) ;
Count++;
}
return StringLen2 ;
}
で、
char EString[16][256], EStringBuf[16][256] ;
int EN[16] ;
(中略)
DrawString ( 600 - TextSmoothDraw ( EString[0], &EN[0], &EStringBuf[0] ) , 100, EStringBuf[0], white ) ;
として文字を表示しようとしたのですが、
第三引数の&EStringBuf[0]というテキストをTextSmoothDrawに送ろうとすると
「'TextSmoothDraw' : 3 番目の引数を 'char (*)[256]' から 'char *[]' に変換できません。」
とコンパイルエラーが発生してしまいます。
こちらをどのようにすれば解決できるか教えていただければ幸いです。
Re:配列をポインタで渡せない。
Posted: 2010年11月22日(月) 10:30
by 五反田
その関数に何をやらせたいのかはよく分かりませんが、同じ挙動をして、なおかつコンパイルエラーを出さないようにしたいなら
int TextSmoothDraw ( char STRING[], int *Count, char *STRINGBUF ){
int StringLen, StringLen2 ;
if ( STRING[*Count] != '\0' ){
STRINGBUF[*Count] = STRING[*Count] ;
StringLen = strlen( STRING ) ;
StringLen2 = GetDrawStringWidth( STRINGBUF, StringLen ) ;
Count++;
}
return StringLen2 ;
}
という関数にして、呼び出しは以下のようにすればいいと思います。
DrawString ( 600 - TextSmoothDraw ( EString[0], &EN[0], EStringBuf[0]) , 100, EStringBuf[0], white ) ;
ただ、この関数の仕様はいろいろと奇妙に見えます。
・初期化されていないStringLen2が返される可能性。
・Countの無意味なインクリメント。
・EString[16][256], EStringBuf[16][256]には違う文字列が入っているのか?
などです。
Re:配列をポインタで渡せない。
Posted: 2010年11月22日(月) 12:31
by へろりくしょん
>「'TextSmoothDraw' : 3 番目の引数を 'char (*)[256]' から 'char *[]' に変換できません。」
仮引数と実引数の型が違います。
仮引数、char *STRINGBUF[256] の型は、char 型のポインタの配列です。 つまりポインタの配列です。
実引数、&EStringBuf[0] の型は、char 型の配列型要素数256のポインタです。 つまり配列のポインタです。
関数 TextSmoothDraw() の中身が謎すぎてどうするのが適切なのかちょっと分かりませんが、今回のエラーはとりあえず
int TextSmoothDraw ( char STRING[256], int *Count, char *STRINGBUF[256] )
を
int TextSmoothDraw ( char STRING[256], int *Count, char (*STRINGBUF)[256] )
とし、要素数256の配列のポインタで受けて上げれば消えます。
Re:配列をポインタで渡せない。
Posted: 2010年11月22日(月) 14:33
by NANA
>五反田さん
>へろりさん
ご回答誠にありがとうございました。
結局char (*STRINGBUF)[256]とすることで、コンパイルエラー自体を消すことができました。
ちなみに挙動を修正した関数を以下に記載させていただきます。
int TextSmoothDrawPositionX ( char STRING[256], int *Count, char (*STRINGBUF)[256] ){
int StringLen, StringLen2 ;
if ( STRING[*Count] != '\0' ){
(*STRINGBUF)[*Count] = STRING[*Count] ;
*Count += 1;
}
StringLen = strlen( *STRINGBUF ) ;
StringLen2 = GetDrawStringWidth( *STRINGBUF, StringLen ) ;
return StringLen2 ;
}
実は関数の内容自体はコンパイルエラーに関係なかったので、内容は書いていなかったのですが、
挙動としては、「ある地点を中心に、テキストを流れるように描画する」といったものでした。
どうせなので、処理と座標の指定をまとめてしまおうと思い、こういう関数を作成しました。
やはり変な関数なのでしょうか?(汗)個人的にはこんなもんだろうと思っていましたが…
五反田さんの指摘されていることに対して私の考えとしては…
・初期化されていないStringLen2が返される可能性。
>こちらはミスをしていました。
・Countの無意味なインクリメント。
>これはSTRINGBUFが現在何文字まで描画されているかを意味しているものとなります。
・EString[16][256], EStringBuf[16][256]には違う文字列が入っているのか?
>前者には最終的に表示される文章を、後者には現在表示されている文章が格納されています。
http://homepage2.nifty.com/natupaji/DxL ... m.html#N20
↑一応こちらを参考にしてみたつもりなのですが…
Re:配列をポインタで渡せない。
Posted: 2010年11月22日(月) 15:19
by NANA
すみません。
↑の書き込みの後少し考えて、関数を改良してみました。
冷静に考えると、ずいぶんと遠回りなことをしていました…
void TextSmoothDraw( int X, int Y , char STRING[256], int *COUNT, int COLOR, int CENTERFLAG ){
int StringLen, StringLen2 ;
char STRINGBUF[256] = "" ;
for ( i = 0 ; i < *COUNT ; i++ )
STRINGBUF = STRING ;
if ( STRING[*COUNT] != '\0' ){
*COUNT += 1;
}
StringLen = strlen( STRINGBUF ) ;
StringLen2 = GetDrawStringWidth( STRINGBUF, StringLen ) ;
DrawString ( X - StringLen2 * 0.5 * CENTERFLAG, Y, STRINGBUF, COLOR ) ;
}