館7章において

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
yusha

館7章において

#1

投稿記事 by yusha » 11年前

この場合での
「 ch.cnt++;」の「cnt」の意味と

「ch.img=(ch.cnt%24)/6;」の「img」の意味が分かりません。また、「(ch.cnt%24)/6;」の意味も教えていただきたいですm(_ _)m

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館7章において

#2

投稿記事 by softya(ソフト屋) » 11年前

質問が曖昧なので曖昧な返答になりますが、
> 「 ch.cnt++;」の「cnt」の意味と
cntはcountの略です。

>「ch.img=(ch.cnt%24)/6;」の「img」の意味が分かりません。
imgはimageの略です。

>また、「(ch.cnt%24)/6;」の意味も教えていただきたいですm(_ _)m24
24で割った余りを更に6で割るって事です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

naohiro19
記事: 256
登録日時: 14年前
住所: 愛知県

Re: 館7章において

#3

投稿記事 by naohiro19 » 11年前

ch.img=(ch.cnt%24)/6というのは

コード:

void calc_ch(){
        ch.cnt++;
        ch.img=(ch.cnt%24)/6;
}
>カウンタをふやして行き、24周期で1周します。その中で4種類の画像をループさせます。
と書かれています。以下のとおりに計算されていきます。
0 frames:0.000000...0
1 frames:0.166667...0
2 frames:0.333333...0
3 frames:0.500000...0
4 frames:0.666667...0
5 frames:0.833333...0
6 frames:1.000000...1
7 frames:1.166667...1
8 frames:1.333333...1
9 frames:1.500000...1
10 frames:1.666667...1
11 frames:1.833333...1
12 frames:2.000000...2
13 frames:2.166667...2
14 frames:2.333333...2
15 frames:2.500000...2
16 frames:2.666667...2
17 frames:2.833333...2
18 frames:3.000000...3
19 frames:3.166667...3
20 frames:3.333333...3
21 frames:3.500000...3
22 frames:3.666667...3
23 frames:3.833333...3
24 frames:0.000000...0
25 frames:0.166667...0
26 frames:0.333333...0
27 frames:0.500000...0
28 frames:0.666667...0
29 frames:0.833333...0
30 frames:1.000000...1
31 frames:1.166667...1
32 frames:1.333333...1
33 frames:1.500000...1
34 frames:1.666667...1
35 frames:1.833333...1
36 frames:2.000000...2
37 frames:2.166667...2
38 frames:2.333333...2
39 frames:2.500000...2
40 frames:2.666667...2
41 frames:2.833333...2
42 frames:3.000000...3
43 frames:3.166667...3
44 frames:3.333333...3
45 frames:3.500000...3
46 frames:3.666667...3
47 frames:3.833333...3
と計算されていきます。つまり (/6)というのは「6フレームごと」という意味です。

yusha

Re: 館7章において

#4

投稿記事 by yusha » 11年前

返信ありがとうございます。

3つ目は理解することができました!

すいません1,2つ目は質問が悪かったです。まとめて改めますと、

「calk_ch」で宣言しているのはわかるのですが「ch.cnt++」でなぜカウントを1ずつ加算していくのかがわかりません。
「++」で1ずつ加算されるのはわかるのですが・・・。また、「ch.」の存在も半ばあやふやです。それと同時に「ch.〇〇」という形でなぜキャラに関することが行われるのでしょうか??

文章が汚いですがお願いしますm(_ _)m

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館7章において

#5

投稿記事 by softya(ソフト屋) » 11年前

構造体はどの程度理解されていますか?
ch.cntの理解には構造体の知識が必要不可欠です。
構造体の宣言、構造体の変数の定義、構造体メンバの変数の参照などなどの知識です。

あと「calk_ch→calc_ch」で構造体の宣言はされてませんし、構造体変数の定義もされていません。
なので他にも誤解があると思われます。
ちなみにcalcはカリキュレート(calculate=計算)の略ですので意味を理解して読みとくと理解力も違ってきますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 館7章において

#6

投稿記事 by みけCAT » 11年前

yusha さんが書きました:「ch.cnt++」でなぜカウントを1ずつ加算していくのかがわかりません。
現在何フレーム目かの情報を得るために、
例えば1.0/60.0ずつ加算すると浮動小数点計算の誤差が積もっていくし、
2ずつや10ずつ加算すると情報が冗長になってしまう。
-1ずつ加算してもいいかもしれないが、わかりにくい。
これらのことを考えると、多分1ずつ加算するのが最適なのだと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

yusha

Re: 館7章において

#7

投稿記事 by yusha » 11年前

今回の場合、型の形→calc
型名 →chという風に解釈しています。

また、確かにcnt=count(数える)ということはわかるのですが、cntで数えろということはどこでも宣言してないと思われるのですがなぜPC側は数えると解釈できるのですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館7章において

#8

投稿記事 by softya(ソフト屋) » 11年前

やはり大きな誤解が潜んでいたいようです。
void calc_ch(){}は関数ですので、calc_chは関数名です。
構造体の宣言はstruct.hにある

コード:

//キャラクターに関する構造体
typedef struct{
        int flag;       //フラグ
        int cnt;        //カウンタ
        int power;      //パワー
        int point;      //ポイント
        int score;      //スコア
        int num;        //残機数
        int mutekicnt;  //無敵状態とカウント
        int shot_mode;  //ショットモード
        int money;      //お金
        int img;        //画像
        int slow;       //スローかどうか
        double x,y;     //座標
}ch_t;
ですね。

>また、確かにcnt=count(数える)ということはわかるのですが、cntで数えろということはどこでも宣言してないと思われるのですがなぜPC側は数えると解釈できるのですか?
calc_chは関数ですので、処理として ch.cnt++;で+1して数えてますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yusha

Re: 館7章において

#9

投稿記事 by yusha » 11年前

なるほど!

あと一つ引っかかることがあるのですが、関数名を「calc_ch」として使用してるのに、なぜブロック内では「ch」で話が通るのですか??

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 館7章において

#10

投稿記事 by みけCAT » 11年前

softya(ソフト屋) さんが書きました:>また、確かにcnt=count(数える)ということはわかるのですが、cntで数えろということはどこでも宣言してないと思われるのですがなぜPC側は数えると解釈できるのですか?
calc_chは関数ですので、処理として ch.cnt++;で+1して数えてますよ。
PCは「ch.cnt(に割り当てられたメモリ領域)の値を1増やす」という命令を解釈して実行しますが、
それが「数える」という操作であるとは解釈していないと思います。
人間が「ch.cntの値を増やす」ことを「数える」と解釈しています。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 館7章において

#11

投稿記事 by みけCAT » 11年前

yusha さんが書きました:あと一つ引っかかることがあるのですが、関数名を「calc_ch」として使用してるのに、なぜブロック内では「ch」で話が通るのですか??
「calc_ch」と「ch」は(コンパイラにとっては)全く関係ない識別子です。
「ch」で話が通るのは、別の場所で「ch」が宣言されているからです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

yusha

Re: 館7章において

#12

投稿記事 by yusha » 11年前

別の場所で宣言とはstruct.hでの構造体のことですよね??

それで、型名「ch_t」となり「ch.構造体内で宣言したやつ」で使用できるわけですよね??

だとすると、_tの存在がまた気になります・・・。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館7章において

#13

投稿記事 by softya(ソフト屋) » 11年前

typedefだけでは型の宣言ですのでメモリ実体を持ちません。代入できません計算もできません。
struct.hでの構造体は宣言実体定義していないので実態実体がありません。
ch_tの_tはDixqさんがtypdefしたよって意味でつけた印ですね。

コードを全部見ていないと思いますがch_tの型でchの実体を定義しているところを探してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yusha

Re: 館7章において

#14

投稿記事 by yusha » 11年前

main内のch_t ch; ですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館7章において

#15

投稿記事 by softya(ソフト屋) » 11年前

yusha さんが書きました:main内のch_t ch; ですか?
そうです。れが実体です。
ただし、あるゆるcppファイルからグローバル変数として参照するためもう一工夫されています。

【補足】
あれ? 途中の章で実体は移動しているはずでは?
7章だと、そこに無いはずですよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yusha

Re: 館7章において

#16

投稿記事 by yusha » 11年前

ということは「GV.h」でグローバル変数化した「GLOBAL ch_t ch; 」のことですか!!

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館7章において

#17

投稿記事 by softya(ソフト屋) » 11年前

yusha さんが書きました:ということは「GV.h」でグローバル変数化した「GLOBAL ch_t ch; 」のことですか!!
それです。それなら、calc_chからも参照できますよね。

あと第5章の「後は「main.cpp」「graph.cpp」「load.cpp」にある変数の定義部と、extern宣言を全て消してください。」がちゃんとされていないのでは?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yusha

Re: 館7章において

#18

投稿記事 by yusha » 11年前

ちゃんと出来てませんでした(×○×)取り敢えず直しました!

余談(?)かもしれませんが「GLOBAL ch_t ch; 」はプロトタイプ宣言とほぼ同義と考えても良いのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館7章において

#19

投稿記事 by softya(ソフト屋) » 11年前

俗にいうプロトタイプ宣言は、関数プロトタイプ宣言のことで、これは実体ではなく関数の型だけを宣言するものです。
「GLOBAL ch_t ch; 」はGLOBALマクロによって切り替わる実体定義とexternによる実体参照を切り替えるものですので、一致する点は無いと思いますが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yusha

Re: 館7章において

#20

投稿記事 by yusha » 11年前

ありがとうございます。自分の中で多くの勘違いをしていたようです…。

大切な時間を割いてまで返答してくださって本当にありがとうございました!

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 館7章において

#21

投稿記事 by softya(ソフト屋) » 11年前

最初は勘違いも多いと思いますので、ちゃんと解消していけば良いだけですよ。
疑問があるのは、ちゃんと考えている証拠でもあります。
そうですね。今回ので多かった問題は、なぜこんな名前なのかはよく考えてもらった方が良いと思います。
なんとなく名前が付いているのではなく、解読するための手がかりが名前には込められています。
あとデバッガなどを使って、値の変化を調べるとか実際の動作を調べる事も日常化した方がより理解できるようになると思います。

それじゃあ。解決した場合は、解決チェックをお願いしますね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

yusha

Re: 館7章において

#22

投稿記事 by yusha » 11年前

本当にありがとうございました!

また質問することがあるかもしれませんが、その時はまた教えてくださったら幸いです。

閉鎖

“C言語何でも質問掲示板” へ戻る