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クラス内の色々な関数の中でアクセスしたいため
メンバ変数としたいのです。
どのようにするのが最適でしょうか?
ナニがわからんのかわかりません。
> 512MのSRAMの内容をまるごとコピーしたファイルを
> リードし、リードした値(ASCII)を変換し構造体に格納したいです。
> 日時時間(15byte)、識別コード(2byte)は固定長ですが、
> LOG情報は2~90byteぐらいの可変長です。
> そのため、読み出したログ数は可変になります。
> ファイルは512Mbyteのリングバッファとなっております。
で?
> また、このm_FileLogはCxxxDlgクラス内の色々な関数の中でアクセスしたいため
> メンバ変数としたいのです。
??? すればいい。
> http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200605/06050026.txt
このスレが未解決ですが今回のスレはその続きですか?
>このスレが未解決ですが今回のスレはその続きですか?
続きです。
タイトル自体の問題は解決したので
別スレたてました。
> 続きです。
> タイトル自体の問題は解決したので
> 別スレたてました。
結果どうなって解決したのかちゃんと返事しておいたほうがいいですよ。
別スレたて多目的もね。
あと忘れずに、
>←解決時は質問者本人がここをチェックしてください
>結果どうなって解決したのかちゃんと返事しておいたほうがいいですよ。
>別スレたて多目的もね。
もちろんわかってます。
タイトルの【プログラムが死ぬ・・・】理由はわかりました。
これで本来解決とするのでしょうが、
みなさんが色々な方法を教えてくださったので。
でもどう使えばいいかわからなくて。。。
だから、解決とは言えないかな!?
と、思いまして。
了解しました。
> タイトルの【プログラムが死ぬ・・・】理由はわかりました。
> これで本来解決とするのでしょうが、
> みなさんが色々な方法を教えてくださったので。
> でもどう使えばいいかわからなくて。。。
> だから、解決とは言えないかな!?
> と、思いまして。
この内容を「【プログラムが死ぬ・・・】」
のスレに返事しておいたほうがいいと思いました。
>ナニがわからんのかわかりません。
定義の記述の仕方、実際使用する時の記述の仕方がわかりません。
>ナニがわからんのかわかりません。
僕が分らないのは、
1. 512MBのSRAMは何ですか。
2.
>ファイルは512Mbyteのリングバッファとなっております。
リングバッファにする必要性は何ですか。
>CArray、std::vectorを用いるべきだと思うのですが、
>過去ログなど色々検索したのですが
>二つの使い方がわかりません。
MFCで使うか「CArray」、C++のテンプレートを使うか「std::vector」の違いだと思います。
> 定義の記述の仕方、実際使用する時の記述の仕方がわかりません。
「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をたどっていけば、サンプルがみつかります。
> 定義の記述の仕方、実際使用する時の記述の仕方がわかりません。
元スレ( http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?
print+200605/06050026.txt)で、
Blueさんが、参考サイトを紹介済みだった。。。
というか、検索しましょうということまで、指摘済み。。。orz
#余計なお世話かもしれなませんが、スレ主さんは、頂いたレスをちゃんと見ているのだろう
か。。。
>とりあえずGoogleで検索しましょう。
いちおGoogleで検索はして色々見てみたのですが・・・
サンプルありがとうございます。
調べてみます。
定義の記述の仕方
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の場合
> CArray、std::vectorを用いるべきだと思うのですが、
512MBの固定長として考えれば普通の変数をnewする方法
でもいいとおもいますが....
# 512MBの変数領域を確保するなら、本体に搭載するメモリ容量もそれに似合った
量必要だと思います。
# そのアプリケーションが動くたびにWindows全体の動作が遅くなる、関係ない他の
ソフトが例外を起こしてハングアップする、といったことが起こるかもしれません。
思うにC++言語の勉強自体をもっとされたほうが良いと思います。
使い方にしてもMSDNを調べるとかすれば、簡単な使用例は出ています。
テンプレートクラスの使い方がわからないのであれば、
それこそC++言語レベルの話なのでC++言語の本で勉強すべきでしょう。
あと、今のPCのリソースがいくらリッチになったといっても
他のアプリケーションの動作に影響が出るほど大きなメモリを確保するのは
どうかと思います。そのアプリを動かしている間は他のアプリは動かせませんで
済むのであれば良いでしょうが、通常、これを許してくれるユーザーはあまりいません。
そのアプリ専用マシンというならわからなくもないですけれど。
普通ならどうしても必要なメモリで抑えて動作環境に対する要求を下げる方向で
考えると思います。ログであれば、なにも全レコードをメモリに持つ必要もないと
思いますし。全レコードを一度に画面上に表示するのは事実上不可能でしょうし。
(スクロール等が必要になるくらいの量でしょうと言う意味です)