構造体配列の動的確保&使用方法

[戻る]
KENBO 2006/05/16(火) 10:54:08
VC6.0 XP ダイアログベースです。

#define MAX_LOG_DATA_NUM    27593    // 最大LOGデータ数
#define MAX_LOG_DATA_LEN    0x64    // 最大LOGデータ長

typedef struct{
  int year;
  int month;
  int day;
  int hour;
  int min;
  int sec;
  int ms;
} TIME_INFO;

// LOG情報構造体
typedef struct{
  TIME_INFO    time;            // 日時時間
  char        code;            // 識別コード
  char        data[MAX_LOG_DATA_LEN];    // LOG情報
} LOG_INFO;

上記、構造体を
CxxxDlgクラスのメンバ変数として以下のように定義するとスタックオーバーフローしま
す。
LOG_INFO m_FileLog[MAX_LOG_DATA_NUM];
そのため、
CArray、std::vectorを用いるべきだと思うのですが、
過去ログなど色々検索したのですが
二つの使い方がわかりません。
だれかご教授おねがいします。

512MのSRAMの内容をまるごとコピーしたファイルを
リードし、リードした値(ASCII)を変換し構造体に格納したいです。
日時時間(15byte)、識別コード(2byte)は固定長ですが、
LOG情報は2〜90byteぐらいの可変長です。
そのため、
読み出したログ数は可変になります。
ファイルは512Mbyteのリングバッファとなっております。

また、このm_FileLogはCxxxDlgクラス内の色々な関数の中でアクセスしたいため
メンバ変数としたいのです。
どのようにするのが最適でしょうか?

επιστημη 2006/05/16(火) 11:10:14
ナニがわからんのかわかりません。

> 512MのSRAMの内容をまるごとコピーしたファイルを
> リードし、リードした値(ASCII)を変換し構造体に格納したいです。
> 日時時間(15byte)、識別コード(2byte)は固定長ですが、
> LOG情報は2〜90byteぐらいの可変長です。
> そのため、読み出したログ数は可変になります。
> ファイルは512Mbyteのリングバッファとなっております。

で?

> また、このm_FileLogはCxxxDlgクラス内の色々な関数の中でアクセスしたいため
> メンバ変数としたいのです。

??? すればいい。

ITO 2006/05/16(火) 11:20:20
> http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200605/06050026.txt
このスレが未解決ですが今回のスレはその続きですか?

KENBO 2006/05/16(火) 11:23:18
>このスレが未解決ですが今回のスレはその続きですか?
続きです。
タイトル自体の問題は解決したので
別スレたてました。

ITO 2006/05/16(火) 11:32:22
> 続きです。
> タイトル自体の問題は解決したので
> 別スレたてました。

結果どうなって解決したのかちゃんと返事しておいたほうがいいですよ。
別スレたて多目的もね。

あと忘れずに、
>←解決時は質問者本人がここをチェックしてください

KENBO 2006/05/16(火) 11:36:51
>結果どうなって解決したのかちゃんと返事しておいたほうがいいですよ。
>別スレたて多目的もね。
もちろんわかってます。

タイトルの【プログラムが死ぬ・・・】理由はわかりました。
これで本来解決とするのでしょうが、
みなさんが色々な方法を教えてくださったので。
でもどう使えばいいかわからなくて。。。
だから、解決とは言えないかな!?
と、思いまして。

ITO 2006/05/16(火) 11:42:09
了解しました。

> タイトルの【プログラムが死ぬ・・・】理由はわかりました。
> これで本来解決とするのでしょうが、
> みなさんが色々な方法を教えてくださったので。
> でもどう使えばいいかわからなくて。。。
> だから、解決とは言えないかな!?
> と、思いまして。

この内容を「【プログラムが死ぬ・・・】」
のスレに返事しておいたほうがいいと思いました。

KENBO 2006/05/16(火) 11:48:02
>ナニがわからんのかわかりません。

定義の記述の仕方、実際使用する時の記述の仕方がわかりません。

ITO 2006/05/16(火) 12:01:31
>ナニがわからんのかわかりません。
僕が分らないのは、
1. 512MBのSRAMは何ですか。
2. 
 >ファイルは512Mbyteのリングバッファとなっております。
 リングバッファにする必要性は何ですか。

>CArray、std::vectorを用いるべきだと思うのですが、
>過去ログなど色々検索したのですが
>二つの使い方がわかりません。
MFCで使うか「CArray」、C++のテンプレートを使うか「std::vector」の違いだと思います。

KING・王 2006/05/16(火) 12:49:02
> 定義の記述の仕方、実際使用する時の記述の仕方がわかりません。

「CArray」や「std::vector」という単語まで分かっているなら、
とりあえずGoogleで検索しましょう。

「CArray」でGoogleで検索した結果の1番目のページでもわかりやすそうです。
> http://www.page.sannet.ne.jp/mtoga/lang/cv/bih-m_80.htm

「std::vector」に関して
>http://www.s34.co.jp/cpptechdoc/
のReferencesのSTL samplesをたどっていけば、サンプルがみつかります。

KING・王 2006/05/16(火) 12:54:07
> 定義の記述の仕方、実際使用する時の記述の仕方がわかりません。

元スレ(http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?
print+200605/06050026.txt)で、
Blueさんが、参考サイトを紹介済みだった。。。

というか、検索しましょうということまで、指摘済み。。。orz

#余計なお世話かもしれなませんが、スレ主さんは、頂いたレスをちゃんと見ているのだろう
か。。。

KENBO 2006/05/16(火) 12:55:42
>とりあえずGoogleで検索しましょう。
いちおGoogleで検索はして色々見てみたのですが・・・

サンプルありがとうございます。
調べてみます。

2006/05/16(火) 13:08:47
定義の記述の仕方

public:
    CArray<LOG_INFO, LOG_INFO> m_FileLog;
    あるいは
    std::vector<LOG_INFO> m_FileLog;

実際使用する時の記述の仕方

    m_FileLog.Add(LOG_INFOのデータ);    // CArrayの場合

    m_FileLog.push_back(LOG_INFOのデータ);    // vectorの場合

ITO 2006/05/17(水) 10:58:07
> CArray、std::vectorを用いるべきだと思うのですが、
512MBの固定長として考えれば普通の変数をnewする方法
でもいいとおもいますが....
# 512MBの変数領域を確保するなら、本体に搭載するメモリ容量もそれに似合った
  量必要だと思います。
# そのアプリケーションが動くたびにWindows全体の動作が遅くなる、関係ない他の
 ソフトが例外を起こしてハングアップする、といったことが起こるかもしれません。

PATIO 2006/05/17(水) 11:25:53
思うにC++言語の勉強自体をもっとされたほうが良いと思います。
使い方にしてもMSDNを調べるとかすれば、簡単な使用例は出ています。
テンプレートクラスの使い方がわからないのであれば、
それこそC++言語レベルの話なのでC++言語の本で勉強すべきでしょう。

あと、今のPCのリソースがいくらリッチになったといっても
他のアプリケーションの動作に影響が出るほど大きなメモリを確保するのは
どうかと思います。そのアプリを動かしている間は他のアプリは動かせませんで
済むのであれば良いでしょうが、通常、これを許してくれるユーザーはあまりいません。
そのアプリ専用マシンというならわからなくもないですけれど。
普通ならどうしても必要なメモリで抑えて動作環境に対する要求を下げる方向で
考えると思います。ログであれば、なにも全レコードをメモリに持つ必要もないと
思いますし。全レコードを一度に画面上に表示するのは事実上不可能でしょうし。
(スクロール等が必要になるくらいの量でしょうと言う意味です)

ドルドル 2006/05/17(水) 21:49:11
>いちおGoogleで検索はして色々見てみたのですが・・・
 私も最近、STLのvectorを利用しましたがすぐに見つかりましたが・・・

サンプルソース
http://www.geocities.jp/ky_webid/cpp/library/002.html 

vectorの詳細
http://www.wakhok.ac.jp/~sumi/stl/header/vector.html  

 前のすれの続きとしたら MFCを利用されているんですよね??それなら CArrayとか
使えばいいと思います。私は よくCPtrArrayクラスをよく利用します。
http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_COb.html  

最後に
>二つの使い方がわかりません
とありますが、どういったことがわからないのですか??配列に格納する方法??配列
に入ってるもの??それともCArrayクラスそのもの?? 何がわからないかを言って頂
かないとなんとも返答しにくいです。
 

ITO 2006/05/19(金) 11:00:39
> どういったことがわからないのですか??配列に格納する方法??配列
> に入ってるもの??それともCArrayクラスそのもの?? 
> 何がわからないかを言って頂かないとなんとも返答しにくいです。
どうやら、「動的配列を扱ったことがないので普通の配列の使い方で
いいか分らない。」と言いたいのかなと思います。

意見としても書いたのですが、何でリングバッファしたいのか分らないです.
リングバッファしたいのなら「CList」を使う方法もあると思います。

KENBO 2006/05/22(月) 09:05:29
色々なご意見ありがとうございます。
別件で忙しかったものでまだ全然調べていないのですが。

>1. 512MBのSRAMは何ですか。
>2. リングバッファにする必要性は何ですか。

あるソフトがSRAMにデータをロギングします。
このソフトはSRAMをリングバッファとしてロギングします。
先頭4バイトにライトポインタを保存しておきます。
最大ロギングデータ数はディファイン定義どおり、27593バイトです。
リングバッファなので古いデータは上書きされます。

別のアプリでSRAMの情報を全てファイルにロギングします。

僕の作るアプリでは、ファイルをリードしロギングデータを取り出します。
ロギングデータはASCII形式なので、BINARYまたは文字情報に変換して
ダイアログ上のリストビューに表示します。
(表示数に関しては仕様は決まっていませんが・・・
制限が必要かもしれません。)

さらに、この中で色々な検索方法(何月〜何月、何時〜何時など・・)に該当するデー
タを表示し直します。
最後に現在表示されているデータをファイルにロギングする機能をつけます。

KENBO 2006/05/22(月) 09:26:39
>#余計なお世話かもしれなませんが、スレ主さんは、頂いたレスをちゃんと見ているの
>だろうか。。。

見てます。見てもわからなかったもので


>使い方にしてもMSDNを調べるとかすれば、簡単な使用例は出ています。
みました。さっぱりわかりません。
今までメモリの動的確保をしたことがありませんでした。というか、使用方法など調べ
たこともありませんでした。
C++自体2年ぶりぐらいで、ここ最近は純粋なCばっかりでしたので・・・

PATIO 2006/05/22(月) 10:03:17
>> 使い方にしてもMSDNを調べるとかすれば、簡単な使用例は出ています。
> みました。さっぱりわかりません。
> 今までメモリの動的確保をしたことがありませんでした。というか、使用方法など調べ
> たこともありませんでした。
> C++自体2年ぶりぐらいで、ここ最近は純粋なCばっかりでしたので・・・

さっぱりわからないのでしたら勉強しなおすしかないと思います。
2年ぶりとは言っても2年前にテンプレートライブラリが無かったのかというと
そんな事は無かったと思いますし。
少なくとも理解しないで使うのは非常に危ない状況だと思います。

PATIO 2006/05/22(月) 10:15:10
他の方も何回か書いていいたと思いますが、
汎用性の高いアプリなのか専用のアプリで動作環境を選んでも良いのかによって
話は180度変わります。ですから、特定の用途向けの専用アプリであり、
使用環境を制限する(最低スペックを明示してそれ以下は動作保障なしとか
他のアプリケーションとの同時起動は不可と言うような話)であれば、
それを基準に考えれば済むはずなのでオンメモリに取ろうが、他に上がっている
アプリケーションがほとんど動かないような状況になろうが仕様ですという
話なのでそれはそれだと思うのですけれど、その辺がどうもハッキリしてない
と思います。

> あるソフトがSRAMにデータをロギングします。
> このソフトはSRAMをリングバッファとしてロギングします。
> 先頭4バイトにライトポインタを保存しておきます。
> 最大ロギングデータ数はディファイン定義どおり、27593バイトです。
> リングバッファなので古いデータは上書きされます。

メモリ上にロギングするのが仕様の必須条件なのであれば、
逆に動作環境はこのメモリが確保できるハードが必須となると思います。
但し、この仕様だと汎用性に関しては低くなると思います。
汎用性が低くてよいのであれば、そう明言してしまった方が話が早くなります。

ITO 2006/05/22(月) 10:16:13
>あるソフトがSRAMにデータをロギングします。
あるソフトとは何ですか。
差し支えなければ........
>C++自体2年ぶりぐらいで、ここ最近は純粋なCばっかりでしたので・・・
だとすると、「Vector」を使用するならもう一度「C++」を(特にテンプレート)
を本で勉強しなおしたほうがいいです。

KENBO 2006/05/22(月) 10:34:42
>テンプレートライブラリ
今回で初めて存在を知りました。勉強します。

>汎用性の高いアプリなのか専用のアプリで動作環境を選んでも良いのか
汎用性は高くないです。基本的にシステムに問題があった時にログを吸い上げて、
どの箇所で問題が発生したか切り分けるために用います。


>あるソフトとは何ですか。
CLINUX上で動くソフトです。CPUはSH4です。
ソフトは受信した制御指令通りに接続された装置の設定を変更します。
また、現在の装置の状態を監視し、送信します。

PATIO 2006/05/22(月) 11:12:46
例えばの話ですが、
メモリを山ほど積んでいて512MBのメモリを確保できない場合はエラー終了しても
良い様なソフトならnewで一気に確保もありでしょう。
メモリ不足でエラーメッセージを表示して終了するのも仕様という事になります。
但し、それはあくまでもそれが仕様として許されるのであればという話です。
それは駄目だ、最低限このくらいのメモリのPCでも動作しないと使い物にならないと
いう話なのであれば、そもそも512MBものメモリが確保できないと動かないような設計が
間違っているという事になります。仮にスワップを許してまで確保したとしても
それではパフォーマンスが大幅に落ちると思います。
そういう意味ではどの程度のハードまでを動作対象にするのかがきちんと設定されて
いないとパフォーマンスと要求動作環境のバランスをとる事が出来ないはずです。
例えば、画面に100レコード一ページとして表示するような仕様にするのであれば、
100レコード分だけメモリ上に確保するようにすれば、表示はできるはずです。
検索を行う場合は、ログファイルに対してファイル上で行う事も可能でしょうし、
検索のために起動時にインデックス化した内容をメモリに保持するという方法も
あるでしょう。
要は必要なパフォーマンスを出しつつ、何処まで動作環境を緩和できるかという話ですよね。
メモリに置いておけば速いのはわかりきっていますし、アクセスも楽ですが、
それだけなら技術的な工夫はほとんどないのと同じだと思います。
省メモリでパフォーマンスをどれだけ出せるかが技術者の腕の見せ所でしょう。
(この辺はアプリに対する要求仕様による話ですから一概には言えないとは思いますけれど)

ITO 2006/05/22(月) 11:35:01
>CLINUX上で動くソフトです。CPUはSH4です。
>ソフトは受信した制御指令通りに接続された装置の設定を変更します。
>また、現在の装置の状態を監視し、送信します。
了解しました。
僕が「あるソフトとは何ですか。」と聞いたのは、512MBものSRAMを使用するには、
それなりの手段、PCIボードにSRAMが搭載していてドライバーを介してデータを取得
するとか、単にUSBメモリーで1ドライブとなる等あると思ったので
聞いたのですが..............

tetrapod 2006/05/22(月) 12:59:44
っていうかそもそも最初の前提から間違っている気がする

俺なら512MBのログデータをRAMにずっと保持する設計など絶対しない。意味ないもの。
それに512MBのログを全てダウンロードするためにはそれなりの時間がかかりそう。
データをダウンロードし終わるまで何も出来ないくらいなら
今必要な少量のデータだけダウンロード+保持するほうがマシ

ターンアラウンドタイムとレスポンスタイムの違いってわかってるのだろうか?

KENBO 2006/05/22(月) 13:44:49
>メモリを山ほど積んでいて512MBのメモリを確保できない場合はエラー終了しても
>良い
それはないです。少なくてもなにかしら表示はしないとまずいですね。


>そういう意味ではどの程度のハードまでを動作対象にするのかがきちんと設定されて
>いないとパフォーマンスと要求動作環境のバランスをとる事が出来ないはずです。
このアプリを使用するPCのスペックはある程度決めることはできますが、
既設のPCを使用する場合もあると思うのでなんともいえないです。

>要は必要なパフォーマンスを出しつつ、何処まで動作環境を緩和できるかという話で
>すよね。
その通りです。

>それに512MBのログを全てダウンロードするためにはそれなりの時間がかかりそう。
時間はかかると思いますが、そこは特に問題ないです。
メモリ容量が平気なのであれば、512Mのファイルを一時バッファにコピーし、構造体配
列のデータに変換して、全データ保持しておきたいです。
変換したデータでないと、検索するのがかなり面倒になるので・・・

Ban 2006/05/22(月) 14:29:42
時間がかかってもぜんぜん気にしないのであれば、
一件一件変換しながら検索しても別に問題ないような気もします。
気になるなら、バックグラウンドのスレッドで処理するとか。

リングバッファでログ…これだけみると、
std::vector で中身を自前管理するほかにも、std::deque あたりも選択肢にあがるかな。
# とか書くと更に混乱させそうな気もしますが、終端への追加と削除に向いたコンテナです>deque

いっそ、DBにでも入れちゃった方がメモリ管理や検索含めで楽なのでは?

ITO 2006/05/22(月) 21:24:39
>時間はかかると思いますが、そこは特に問題ないです。
>メモリ容量が平気なのであれば、512Mのファイルを一時バッファにコピーし、構造体配
>列のデータに変換して、全データ保持しておきたいです。
時間かけていいならここでメモリーにコピーするのでなく、ハードディスクにコピーし
たほうが楽ではないですか。
Banさんの意見にもある通り、DBに保存するのもいいと思います。

PATIO 2006/05/23(火) 10:51:59
> 時間かけていいならここでメモリーにコピーするのでなく、ハードディスクにコピーし
> たほうが楽ではないですか。

私もこの意見に賛成です。
今時のハードディスクはかなり早いですからね。
検索に使うキーが限られるのであれば、データは一旦ハードディスクに書き出して
検索用のインデックスのみをメモリ上に持つという方法もあるのではないですか?
動作環境を選ぶようなソフトにしたくないのであれば、
全てをメモリ上に持つという発想自体に無理があると思いますよ。

KENBO 2006/05/24(水) 09:16:28
>時間がかかってもぜんぜん気にしないのであれば、
そりゃあ早いにこしたことはないですけどね・・・
実際、このアプリを使用する時は他のアプリケーションと同時に起動することはないで
しょう。
また、それを仕様とすることもできます。


>512MBのログデータをRAMにずっと保持する
RAMに保持してある512mのログデータはASCII形式なのでBINARY形式に変換すると約半分
の256Mのデータ保持ですみます。
また、ログデータの保存領域を256Mにする(SRAMの領域全ては使わない)という話もあり
ます。この辺はまだ仕様が確定していません。

>時間かけていいならここでメモリーにコピーするのでなく、ハードディスクにコピーし
>たほうが楽
ハードディスクにコピー?プログラムでできるのですか?専用の構文などあるのです
か?

ITO 2006/05/24(水) 12:19:48
> RAMに保持してある512mのログデータはASCII形式なのでBINARY形式に変換すると
> 約半分の256Mのデータ保持ですみます。
それでもメモリー上に持つのはかなり難しいと思います。

>ハードディスクにコピー?プログラムでできるのですか?専用の構文などあるのです
>か?
そのまま、BINARY形式に変換して少しづつ保存していくようになると思います。
RAMのデータをどうやって取得するのか分らないのでこれ以上は説明のしようが
ないです。
専用の構文などはないと思いますが.......

Ban 2006/05/24(水) 18:48:21
> ハードディスクにコピー?プログラムでできるのですか?専用の構文などあるのですか?

???

# 活用できるかは設計次第だと思いますが、CreateFileMapping とか。

KENBO 2006/05/25(木) 13:17:58
> 時間かけていいならここでメモリーにコピーするのでなく、ハードディスクにコピー
>したほうが楽ではないですか。
昨日はイメージわきませんでしたが、ハードディスクにコピーというのは、
変換したデータをファイルを新規作成して書き込み、保存しておくということですね?
それで検索する時は、このファイルをリードして行なう。
そうすればメモリを使わなくて済むと。

PATIO 2006/05/25(木) 13:24:19
というか、通常は大きなデータならそうしますよ。
今でこそメモリが2GBなんてパソコンもありますけれど、
昔のPCなんて1MBも積んでませんでしたし。
大きなファイルは一度ハードディスク上に記録しておいて
検索上どうしても必要な情報のみインデックス化して
メモリ上に置くのが一般的な方法だと思います。

但し、ハードディスク上に置いても十分な検索スピードが出せるのであれば、
無理にメモリ上にインデックス等を置く必要はないです。
この辺は要求性能によるのでケースバイケースです。
メモリに置く物が少ないほど要求する動作環境は低くなるので
より使用環境を広げたいのであれば、考えるべきだと思います。

KENBO 2006/05/25(木) 15:00:20
今さっき重大な問題が発覚しました。
勘違いしてました。。。
SRAMのサイズは512Mではなく、512Kでした・・・・・・・・・・


その中でログデータ領域に使用するサイズは、384Kか256Kになるようです。
なので、変換したデータは192Kか128Kになります。
それでも全変換データメモリ保持するのはよくないのでしょうか?

ITO 2006/05/25(木) 15:13:40
 う--む、たとえ512KBだとしても、時間が許せるならばデータメモリ保持と並列に
 ハードディスクに保存したほうがいいと思います。
 途中で停電などの事故がおきてSRAM上のデータが消えてもデータを保持できます。
 通常観測データ等、外部からの取得データは容量の大きい・小さいに関係なく、
 ハードディスク等に保存します。
 

PATIO 2006/05/25(木) 17:21:04
私もITOさんに賛成ですね。
安全を見るなら不揮発な媒体にデータを保存しておいた方が安心です。
もっとも媒体が駄目になってしまうとそれまでですけれど。
それでもメモリ上に置いておいて停電等でデータが跳ぶ事に比べれば、
安全でしょうね。
特にトラブル時の対応に必要なデータなのであれば、
なおさら保存しておいた方が良さそうです。

KENBO 2006/05/30(火) 15:19:26
>途中で停電などの事故がおきてSRAM上のデータが消えても
この装置は電源を切ることがないのです。
装置の寿命が10年ほどですが、その間フル稼働です。
もし停電が起きてもUPSがついてるので少しの間なら平気です。
また、SRAMの情報は電源の供給が遮断されても5日ほどはもつそうです。
装置(SRAM)のある場所と僕のアプリを操作するPCはまったく別の場所にあります。
(100km以上離れている所もあります。)
僕のアプリを操作するPC内のハードディスクにwebブラウザを用いてSRAMの情報をファ
イルに保存します。

僕のアプリはこのファイルを参照して検索、表示、保存などを行ないます。
この元となるファイルの仕様が変わりました。
年(2)、月(1)、日(1)、時(1)、分(1)、秒(1)、MS(2)、識別コード(1)、データ長(1)、デ
ータ(2^80)   *()内はバイト数
と、STX,ETXのチェックをし、データを取り出し、バイナリーに変換されたデータををフ
ァイルに保存したものとなりました。


僕は、これを年〜ms、識別コード、データと3つに分けファイルに保存することにしま
した。
んで、データ長とデータの先頭ポインタをメモリにもち、制御します。


検索した結果は、メモリ上で構造体に格納することにしました。

KENBO 2006/05/30(火) 17:25:49
CArrayというのは、最初にSetSizeで配列の要素数を決めなければ、
Addで追加した分のメモリ領域しか確保されないのですか?

Blue 2006/05/30(火) 17:42:56
CArrayのソースを見てもらえばわかりますが、
なるべく new, delete をしないように
ある程度の領域をあらかじめ確保しておいて、それが足りなくなると
再確保するようなつくりになっています。
(CArrayのメンバのm_nMaxSizeがあらかじめ大きく取っておいたサイズ)

よって、
> Addで追加した分のメモリ領域しか確保されないのですか?
というわけではないです。

KENBO 2006/05/31(水) 09:35:08
できるだけ、SetSizeであらかじめある程度の配列サイズを確保したほうがいいのでしょ
うか?
調べたところによると
Addでのみ追加すると、そのたびに拡張するので負荷が多くなる。
みたいですけど・・・
それよりも、毎回GetSizeを越えてないかチェックして
超えてないなら、SetAtで値を設定する。
超えてたらAddで追加する。
このようなやり方のほうが最適なのでしょうか?

KENBO 2006/05/31(水) 09:43:13
>それよりも、毎回GetSizeを越えてないかチェックして

意味不明でしたね。。
以下のように書き換えます。

最初にSetSizeである程度の配列要素数を設定し、
毎回GetSizeでm_nMaxSizeを超えてないかチェックする。

Blue 2006/05/31(水) 10:05:35
> そのたびに拡張するので負荷が多くなる
どこからその情報が?毎回拡張するわけではないですよ?

> 毎回GetSizeでm_nMaxSizeを超えてないかチェックする。
m_nMaxSizeはprotectedメンバなので参照できませんけど。
(CArrayを継承してそういうメソッドをつくるのでしょうか?)

というか、SetSizeで設定したサイズがGetSizeで取れるんじゃないでしょうか?


(1)とりあえず、格納されそうであるある程度のサイズをSetSizeで設定。
↓
(2)CArrayとは別に今まで格納した要素をカウントする変数を追加。
↓
(3)(2)で用意した変数を元に、Addで追加するか、SetAtで設定するかを切り分け
る。

適当な例)
CArray< int, int > arr;
int count = 0;

arr.SetSize( 10 );

for ( int i = 0; i < 20; i++ )
{
    if ( count => arr.GetSize() )
    {
        arr.Add( i );
    }
    else
    {
        arr.SetAt( count, i );
    }
    count++;
}

# いつまで、このスレ続くのか。(レス数が40を超えるのもすごい)
# 質問がどんどん別のものになっているような。。。
# 結局CArrayつかうのかな?

Blue 2006/05/31(水) 10:09:56
> if ( count => arr.GetSize() )
GetSizeの値と比較するのは良くなさそう。
SetSize時の値と比較するように変更。
(しかも、比較演算子間違ってるし、、、)

CArray< int, int > arr;
int count = 0;
const int max = 10;

arr.SetSize( max );
for ( int i = 0; i < 20; i++ ){
    if ( count >= max )
        arr.Add( i );
    else
        arr.SetAt( count, i );
    count++;
}

KENBO 2006/05/31(水) 10:20:31
[[解決]]
>というか、SetSizeで設定したサイズがGetSizeで取れるんじゃないでしょうか?

そうでした。SetSizeで指定したら、GetSize=m_nMaxSizeですね。

文章苦手なものでうまく伝わらないですいません。
僕がやろうとしてたことは、
Blueさんのやり方と同じです。

># 結局CArrayつかうのかな?
CArrayを使ってやります。


みなさん、ありがとうございました。

Blue 2006/05/31(水) 10:22:13
というか CArray に SetAtGrow というメソッドがありますね。
これが最適かな?

<引用>
指定したインデックス位置に配列要素を格納します。
必要に応じて、配列を自動的に拡張します (つまり、新しい要素を格納できるように、
上限を調整します)。
</引用>

KENBO 2006/05/31(水) 10:37:07
[[解決]]
>というか CArray に SetAtGrow というメソッドがありますね。
>これが最適かな?
いいメソッドがありますね。
見落としてました。
これなら判定がいらなくなりますね。

ITO 2006/05/31(水) 10:48:05
そんなに苦労しなくても、データのサイズが決まっているならCArrayを使う必要は
ないと思いますが.......

struct  XXXX
{
  int year;
  unsigned char mounth;
  unsigned char month;
  unsigned char day;
  unsigned char hour;
  unsigned char Minute;
  unsigned char second;
  unsigned char code;
  unsigned char MS;
  unsigned char datasize;
  unsigned char data[MAXSIZE];
};
こんなのをつくればいと思いますが......
別に構造体でなくてもクラスでもかまわないと思います。

もし、「MAXSIZE」が大きいのであれば、newすればいいと思います。


 
 

古いスレッドには追加発言できません。