プロが教えるわが家の防犯対策術!

動的配列の構造体の受け渡しについて教えていただきたいです。
typedef struct{
int class;
int **matrix;
}pattern_struct;
という構造体を用意しました。
メイン側で
int main(){
pattern_struct *sample,*prototype;
省略
for(k=0;k<9;i++){
for(i=0;i<height;i++){
for(j=0;j<width;j++){
prototype[0].matrix[i][j]=sample[k].matrix[i][j]+prototype[0].matrix[i][j];
}
}
for(i=0;i<height;i++){
for(j=0;j<width;j++){
prototype[1].matrix[i][j]=sample[k].matrix[i][j]+prototype[1].matrix[i][j];
}
}
    ~9まで続きます~
}
省略
}

少し変えていますが、このようなプログラムを記述しました。
記述を省略するためにmallocで作成した構造体配列の足し算をする関数を作りたいのですが、どのように記述するべきなのでしょうか。

A 回答 (3件)

for(i=0;i<height;i++){


for(j=0;j<width;j++){
prototype[0].matrix[i][j]=sample[k].matrix[i][j]+prototype[0].matrix[i][j];
}
}
for(i=0;i<height;i++){
for(j=0;j<width;j++){
prototype[1].matrix[i][j]=sample[k].matrix[i][j]+prototype[1].matrix[i][j];
}
}
の部分って,
for(i=0;i<height;i++){
for(j=0;j<width;j++){
prototype[0].matrix[i][j]=sample[k].matrix[i][j]+prototype[0].matrix[i][j];
prototype[1].matrix[i][j]=sample[k].matrix[i][j]+prototype[1].matrix[i][j];
}
}
のようにループをまとめられるように見えるんだが.... 気のせいか?

そしてよく考えれば k のループを中に入れることができる.

この回答への補足

少し変えたっていうところがその部分なんです。
実際は
for(k=0;k<9;i++){
switch(sample[k].class){
case 0:
for(i=0;i<height;i++){
for(j=0;j<width;j++){
prototype[0].matrix[i][j]=sample[k].matrix[i][j]+prototype[0].matrix[i][j];
}
}
break;
case 1:
for(i=0;i<height;i++){
for(j=0;j<width;j++){
prototype[1].matrix[i][j]=sample[k].matrix[i][j]+prototype[1].matrix[i][j];
}
}
break;
    ~9まで続きます~
}
}
こうなります。

補足日時:2013/04/30 23:53
    • good
    • 0

「少し変えた」って, 全然意味違うじゃんかよ.



例えば sample[k].class の値が 0 なら
prototype[0].matrix[i][j]=sample[k].matrix[i][j]+prototype[0].matrix[i][j];
をまわすんだよね. で, 1 だったら
prototype[1].matrix[i][j]=sample[k].matrix[i][j]+prototype[1].matrix[i][j];
と.

switch の立場はいったいどこへ?

あと, 本当にこのままだとプログラムとしておかしいね.

この回答への補足

switch の立場はいったいどこへとは?

プログラムとしておかしいとはどのような意味ですか?

補足日時:2013/05/01 02:47
    • good
    • 0

>switch の立場はいったいどこへとは?



#2でちゃんと説明してありますけど。

>prototype[0].matrix[i][j]=sample[k].matrix[i][j]+prototype[0].matrix[i][j];

switch (sample[k].class)
{
case 0:
prototype[0]~ // prototype[0] の 0 はsample[k].classの値と一緒
break;
case 1:
prototype[1]~// prototype[1] の 1 はsample[k].classの値と一緒
break;
~ これを9まで繰り返し
}

これは次に書き換えられるわけで

switch (sample[k].class)
{
case 0:
prototype[sample[k].class]~
break;
case 1:
prototype[sample[k].class]~
break;
~ これを9まで繰り返し
}

さらにswitchも意味がないので

prototype[sample[k].class].matrix[i][j]=sample[k].matrix[i][j]+prototype[sample[k].class].matrix[i][j];

になるわけですが。
なのでswitchの立場がない。

変えたのは少しのつもりなんでしょうけど質問に書かれてるのと処理的には別物になってますが、これであってるんですか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
なるほど、良く分かりました。確かにswitchを使う必
要がありませんでした。

補足に書いてある方が正しい処理です。勝手に省略をしてしまい申し訳ないです。

何度もありがとうございました。

お礼日時:2013/05/01 07:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!