とても初歩的な事で恥ずかしいのですが、色々調べても分からないので教えてください。
MFCで、クラスAと構造体Bを作り、Aの配列、Bの配列(2次元)、int型を引数として
void func(A *a,B b[][10],int n)
という関数を作ったのですが
①引数を(class A *a,struct B b[][10],int n)の形にしないとエラーになる。
②(①の形に変更後)struct B b[][10]以下の引数が認識されない(class viewで
funcにマウスを合わせると、引数がB b[][10]までしか表示されない)
という2つで先に進めなくなってしまいました。
本などには①のような書き方はしてないので、どうも気になります。
②に関しては、全くのお手上げです。
どなたか宜しくお願いします。
STLのvector やら MFCのCArray を使ってBのコンテナクラスを引数にする。
もしくは、Bのポインタを使う。
ten_bun様
コンテナクラスを引数にするか、ポインタを使う・・との事なので、なじみのあるポインタ
を使って実現したいのですが(コンテナクラスは使った事がないもので・・・)、どのよう
に書けばいいのでしょうか?
B[][10]という書き方は、C言語の本に載っていた(char型でしたが・・・)のですが、
VCではこのような書き方はダメなんですか?
主に二つの方法がある。
ただし、これは配列の要素数が分かっていなければできない。
配列をSample[S][T]とする。
1)ポインタを使う方法。
Func_00(B* ppDim,const int NumS,const int NumT){
for(int i=0;i<NumS;i++){
for(int k=0;k<NumT;k++){
//これでSample[i][k]のメンバを参照。
(*(ppDim + NumS*i + k)).member;
}
}
}
//関数のコールの仕方は
Func_00(&Sample[0][0],S,T);
2)配列ポインタを使う方法
Func_01( B(*pDim)[T],const int NumS,const int NumT){
for(int i=0;i< NumS;i++){
for(int k=0;k<NumT;k++){
//これでSample[i][k]のメンバを参照。
pDim[i][k].member;
}
}
}
//関数のコールの仕方は
Func_01(&Sample[0],S,T);
実はtemplateを使う方が楽だったりする。
template<Temp>
void
Func_Temp(Temp Dim,const int NumS,const int NumT){
for(int i=0;i< NumS;i++){
for(int k=0;k<NumT;k++){
//これでSample[i][k]のメンバを参照。
Dim[i][k].member;
}
}
}
//関数のコールの仕方は
Func_Temp(Sample,S,T);
訂正
1)で
(*(ppDim + NumS*i + k)).member;->(*(ppDim + NumT*i + k)).member;
(ppDim + NumT*i + k)->member;//も可
ten_bun様。
アドバイス本当にありがとうございました。お陰で、完成!・・・とまでは行かない
ものの、何とか先に進めそうです。助かりました。