掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.7501

配列のメンバ変数の初期化とSetTimerの配置について
投稿者---ゆきの(2007/06/10 14:49:25)


お世話になります、ゆきのと申します。
是非ご教授していただきたいことが5点ございまして、分けて投稿させて
いただきたく、お願いいたします。

VC++を使っています。クラスのメンバ変数に
int temp[100];を宣言してます。
この変数の初期化が必要と思い、コンストラクタでtemp[100] = {0};と
配列の要素をすべて0で初期化しようとしたところエラーがでました。
コンストラクタ内で配列の初期化の形式通り int temp[100] = {0};
と書けばコンパイルが通りました。ここで教えていただきたいのですが、
このような初期化するときはコンストラクタ内でも型宣言が必要なのでしょうか。

∀辰かわるのですが、SetTimerの使い方についてです。
参考書のH氏のVC++2005シニア編にて使い方を学んでいます。
例題が載っていて、SetTimer(1,1000,NULL); OnTimer(UINT nIDEvent)で書くことはできたのですが、
このSetTimerの書く位置を他のクラスのメソッド内に配置したいのですが、思った動作にうまくいきません。
MDIですが、フォームビューをはりつけています。
ファイルメニューから時間という項目を選ぶとダイアログがでて
そこに時間を入力するとその時間間隔でピクチャボックスに貼り付けた
画像がくるくる変わるというアプリケーションを作成しています。
 
簡単に書きますが、
フレーム内でShowDialog(a)を記述して、ダイアログを画面にだして、
ダイアログにタイマの間隔値を入力できるようにしました。
OKボタンが押されたらダイアログが消えて、その入力値を
引数aに格納させ、その値を使ってSetTimer(1,a*1000,NULL);にします。
a*1000にしたのは秒に変換するためです。

ここで、OnTimer(UINT nIDEvent) を
別のクラス(フォームビュー内)で使おうとしています。
SetTimerの第1引数をここに代入すればいいと思ったのですが、
連動の仕方がわかりませんでした。
連動とは、
ダイアログを閉じてSetTimerに値を代入したタイミング
(SetTimerの第2引数の値が変化したタイミング)を
このクラスのOnTimerにどうやって知らせてあげたらいいのか
ということです。

言葉ばっかりで恐縮ですが、よろしくお願いいたします。
(開発環境はWindowsXP、VC++2005です。)


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:配列のメンバ変数の初期化とSetTimerの配置について 7504 ぽへぇ 2007/06/10 17:41:20
<子記事> Re:配列のメンバ変数の初期化とSetTimerの配置について 7513 2007/06/12 10:54:52


No.7504

Re:配列のメンバ変数の初期化とSetTimerの配置について
投稿者---ぽへぇ(2007/06/10 17:41:20)



丸つき数字は機種依存なので、読めない人もいます。
(1), (2)のようにするか、別の書き方をしましょう。

>この変数の初期化が必要と思い、コンストラクタでtemp[100] = {0};と
>配列の要素をすべて0で初期化しようとしたところエラーがでました。
>コンストラクタ内で配列の初期化の形式通り int temp[100] = {0};
>と書けばコンパイルが通りました。ここで教えていただきたいのですが、
>このような初期化するときはコンストラクタ内でも型宣言が必要なのでしょうか。

エラーが出たコードと、コンパイルが通ったコードと両方示してください。
何がなんだかわかりません。

>SetTimer(1,a*1000,NULL);にします。
これはどこでやっていますか?
ダイアログに対してWM_TIMERメッセージが投げられるようなコードになっていませんか?

ダイアログが閉じられたら、aの値(またはa*1000)をダイアログから読み出して、
フォームビューでSetTimerすること。



この投稿にコメントする

削除パスワード

No.7509

Re:配列のメンバ変数の初期化とSetTimerの配置について
投稿者---breakwind4u(2007/06/11 19:17:01)


前者> コンストラクタでtemp[100] = {0}; と配列の要素をすべて0で
前者> 初期化しようとしたところエラーがでました。
後者> コンストラクタ内で配列の初期化の形式通り int temp[100] = {0};
後者> と書けばコンパイルが通りました。

FAQ ネタだと思うのですが、残念ながらコントラクタで配列メンバの
「初期化」は**できません**。

後者のは、コンストラクタ内の自動変数の初期化を行っているだけで、
メンバ変数の temp には一切触れていません。

どうしてもコンストラクタで「初期化」したければ、下記のような
方法もあります。

struct Temp {
    int temp[100];
};

const static Temp zero = { { 0 } };

class A {
    Temp temp_struct;
public:
    A() : temp_struct(zero) {}
};


詳しく知りたければ、「メンバイニシャライザ 配列」でググって下さい。



この投稿にコメントする

削除パスワード

No.7551

Re:配列のメンバ変数の初期化とSetTimerの配置について
投稿者---ゆきの(2007/06/18 02:06:28)


ぽへぇ さん、breakwind4u さん
レスありがとうございます。遅れて申し訳ないです。

ぽへぇ さんへ
まず、(1)
Test.H に
Class Test{ private: int temp[100];};
Test.CPP に
コンストラスタ内
Test::Test()
{ int temp[100] = {0}; }
と書くとうまくいきました。
これをtemp[100] = {0};と書きますと、
エラーコードC2059:構文エラー
C2143';'が'{'の前にありません。C2143';'が'}'の前にありません。
がでました。

(2)
SetTimerはMainFrm.CPPに書いています。ダイアログでの入力値を
SetTimerの第2引数に入れています。
OnTimerはTestView.CPPに書いています。ビューに
貼り付けたスタティックテキストを移動させるためにこのCPP
(MainFrm.CPPとは別という意味)に書くのかなぁと思いました。

>ダイアログが閉じられたら、aの値(またはa*1000)をダイアログから読み出して、
>フォームビューでSetTimerすること。
aの値を読みだすのはわかります。フォームビューでSetTimerもわかります。ということはaはフォームビューのメンバー変数にするということでしょうか。


breakwind4u さんへ
>残念ながらコントラクタで配列メンバの「初期化」は**できません**。
そうだったんですか。勉強になりました。調べた結果memsetを使えば
いいのかなぁと思いました。

>詳しく知りたければ、「メンバイニシャライザ 配列」でググって下さい。
キーワードありがとうございます。余談ですが、ググッたらこの
掲示板が1ページ目にひっかかってました(笑)

引き続き自分なりにもっと調べてみます。
推敲してみてあんまり自分でもわかっていないなぁと思いましたが
よろしくお願いいたしします。


この投稿にコメントする

削除パスワード

No.7584

Re:配列のメンバ変数の初期化とSetTimerの配置について
投稿者---ぽへぇ(2007/06/21 07:39:13)


>まず、(1)
これはすでに解決済みだと思いますのでコメントは省きます。

(2)
>SetTimerはMainFrm.CPPに書いています
>OnTimerはTestView.CPPに書いています
ということは WM_TIMERメッセージは MainFrmに着ます。
MainFrmに着たWM_TIMERをどうにかしてCMDIChildWndに(再)配信し、
さらにTestViewに(再)配信しない限りTestViewに届きません。
#たぶんDocument経由になるかと。

7501:
>このSetTimerの書く位置を他のクラスのメソッド内に配置したいのですが、
>思った動作にうまくいきません。

>aの値を読みだすのはわかります。フォームビューでSetTimerもわかります。ということはaはフォームビューのメンバー変数にするということでしょうか。

もしかして、MainFrmでダイアログを出して時間を設定したら、
全部のMDI子WindowのViewに対して同じ時間間隔でViewが
更新されるようにしたい、ということでしょうか?

だとすると、ちょっと面倒ですが、以下のような感じになります。

1.MainFrame::OnTimerからMDIChildWndを列挙しWM_TIMERを(再)配信
2.CMDIChildWnd::OnTimer から (Document経由で)ViewにWM_TIMERを(再)配信



この投稿にコメントする

削除パスワード

No.7600

Re:配列のメンバ変数の初期化とSetTimerの配置について
投稿者---ゆきの(2007/06/22 18:53:41)


ぽへぇ さんへ
レスありがとうございます。
 
私がやってみたいと思っていることは実はもっと単純な仕組みでできるものなのか、普通はしないのかなぁと思いました。
初心者の私にはなんといいますか、私が全然わかっていないので、回答してくださったレベルについていけてない…
でも逃げずに勉強したいと思っています。
 
>MainFrmに着たWM_TIMERをどうにかしてCMDIChildWndに(再)配信し、
>さらにTestViewに(再)配信しない限りTestViewに届きません。
仰っている配信は引数を用意して、値を引き継いでいくという
イメージでしょうか。
まずは「メッセージを配信する方法」を調べてみますが
「メッセージ 配信 VC++」でググッたら曲?がでてきました(笑)
MSDNでも調べてみようと思います。
 
>#たぶんDocument経由になるかと。
ドキュメントクラスですね、ちょうど勉強中です。
データをひとつだけで管理するということですね。
 
>もしかして、MainFrmでダイアログを出して時間を設定したら、
>全部のMDI子WindowのViewに対して同じ時間間隔でViewが
>更新されるようにしたい、ということでしょうか?
違います。言葉足らずで申し訳ございません。
実行→親画面立ち上がる→ユーザがメニューから設定時間項目を選択→
時間設定用ダイアログ出現→ユーザが例えば1(秒)を入力してOKボタンをおす
→ダイアログが消える→1つのフォービューにピクチャボックスが貼り付けれていて、
そこに1秒ごとに絵がでてくる→みためアニメーションみたいな感じです。

ほかのMDIの画面は全くタイマは関係なく、まだ作ってもいないので
お恥ずかしい話ですが、その絵のデータ登録、管理用の画面をつくって
みようかなぁと思っています。


この投稿にコメントする

削除パスワード

No.7601

Re:配列のメンバ変数の初期化とSetTimerの配置について
投稿者---ぽへぇ(2007/06/22 20:00:18)


>仰っている配信は引数を用意して、値を引き継いでいくという
>イメージでしょうか。

一言で表現すると「WM_TIMERメッセージのバケツリレー」です。…が、

>>もしかして、MainFrmでダイアログを出して時間を設定したら、
>>全部のMDI子WindowのViewに対して同じ時間間隔でViewが
>>更新されるようにしたい、ということでしょうか?
>違います。

ということなので、これ以上は書きません(かえって混乱させても悪いし)。

>aの値を読みだすのはわかります。フォームビューでSetTimerもわかります。
>ということはaはフォームビューのメンバー変数にするということでしょうか。
こちらで良いと思います。

1.設定時間メニューのコマンドハンドラを TestView(FormView)に追加
(MainFrmに書いたコマンドハンドラは消し、a はTestViewのメンバにする。)。
2.TestView上でダイアログを出し、値に応じてSetTimer
3.OnTimerをTestViewに作る。
→アニメーション処理



この投稿にコメントする

削除パスワード

No.7513

Re:配列のメンバ変数の初期化とSetTimerの配置について
投稿者---あ(2007/06/12 10:54:52)


あんま関係ないかもしれませんが、

int temp[100];
tmp[100] = 0;

ですと、配列の要素数をぶっちぎってるので、思いっきり間違いなのは分かってますよね。
ただし{0}ですと、borlandの環境では「式の構文エラー」が出ました。



この投稿にコメントする

削除パスワード

No.7552

Re:配列のメンバ変数の初期化とSetTimerの配置について
投稿者---ゆきの(2007/06/18 02:14:15)


あ さん、レス遅れて申し訳ございません。

>あんま関係ないかもしれませんが、
いえいえ、ありがたいです。大事なことです。

>int temp[100];
>tmp[100] = 0;
>
>ですと、配列の要素数をぶっちぎってるので、思いっきり間違いなのは分かってますよね。
>ただし{0}ですと、borlandの環境では「式の構文エラー」が出ました。

仰るとおりです。配列は0から99までの100個なのに
100番目に0を入れるというのは明らかに間違いですね。
どこかの掲示板でみたことがありますが、配列を宣言して
最後の要素+1番目には何か値が入っているみたいなことをみましたが、保障はされないと思っています。

ご指摘ありがとうございました。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ