はじめまして。
VC++6.0(SP6適用)、MFC ダイアログベースで開発しています。
aaaaaa
bbb
ccccccccccc
・・・
といった、行数も1行の文字数もばらばらな文字列をファイルから読み込んで
表示する、というプログラムを作ろうとしています。
CStringArray *result_array = new CStringArray[n]; //CStringArrayの配列を動的確保
-----result_arrayにデータを追加して表示-----
delete [] result_array; //解放
nは配列の要素数で、値は現在10(テスト段階なので少なめ)を格納してあります。
他部分のプログラムはあまり影響無いようだったので省略しました。
これを実行すると「ブレークポイントの設定位置 ○○(アドレス)」と出て
混合モードの画面が出た状態で処理がとまります。
int 3の所でとまっており、調べた所配列の要素数を超えてアクセスしている
ようです。
1ステップずつ実行してみるとdeleteに問題がある様子。
しかし、正しい解放の仕方が分かりません・・・。
そもそもこのresult_arrayの宣言自体、正しいのか自信が無いです。
newを使っているのでdeleteする必要はありますよね?
どうすれば良いのでしょうか。
(足りない情報がありましたらご指摘ください)
よろしくお願い致します。
>CStringArray *result_array = new CStringArray[n]; //CStringArrayの配列を動的確保
が大間違いです。C++の基本をしっかりと勉強し、
また、MFCのマニュアルを良く読みましょう。
CStringArrayはクラスです。それ単体で動作します。
CStringArray StrAry; // 文字列の配列を構築
StrAry.Add( _T("最初の文字列"));
StrAry.Add( _T("次の文字列"));
の様に使います。
ありがとうございます。
やはり宣言からして違いましたか・・・
ファイル内のデータが
aaaaaaa
bbb
ccccccc
dddd
eeeeeee
とある時aaaaaaa〜cccccccを1つのCStringArrayに、
dddd・eeeeeeeを別のCStringArrayに格納したいのです。
2つ3つなら地道に
CStringArray StrAry1;
CStringArray StrAry2;
CStringArray StrAry3;
とすることもできますが、ファイルを読み込むまでいくつになるか分かりません。
CStringArrayをコンテナ等で更に配列にすれば良いのでしょうか・・・
> CStringArrayをコンテナ等で更に配列にすれば良いのでしょうか・・・
正解。とはいえ配列の要素数はあらかじめわかんないっしょ。
CStringArrayの可変長配列をこしらえればいんじゃないすか?
文字列を動的な配列で扱うだけではなく
「CStringArray」そのものも動的に扱うというなら、間違ってない
ので、
1:new〜delete[]までの間をすべてコメントアウトして、newとdeleteだけで正常に動くかためす
2:内容を少しずつコメント解除しながら試し、どこに原因があるか探る
それでもわからない場合は、今回省略して提示してない部分をあげてみてください
以下参考**************
CStringArray *strarray = new CStringArray[ 2 ];
strarray[0].Add("Test");
strarray[0].Add("NEXT");
strarray[1].Add("Test");
strarray[1].Add("NEXT");
delete [] strarray;
#VC6で動作確認
>επιστημηさん
CStringArrayの可変長配列、頑張って調べてみます。
>ryoさん
現在私が書いているソースもryoさんの参考とほぼ同じなのに
1.の段階でブレークポイントになりました。
試しに、参考をそのまま貼り付けてやってみても同じ・・・だったのですが、
リビルドするとちゃんと動きました・・・。
私が本来書いていたソースでも正常です。
ひとまず解決にしたいと思います。お騒がせしました・・・
根本的によく分かっていない所も多いので、きちんと勉強していきたいと思います。
仲澤@失業者さん、επιστημηさん、ryoさん、
ありがとうございました。
> CStringArrayの可変長配列、頑張って調べてみます。
いらんことしぃ ^^;
#include <iostream>
#include <afx.h>
#include <afxtempl.h>
int main() {
CArray<CStringArray*,CStringArray*> saa; // CStringArrayのArray
// いくつかつっこんで
CStringArray* sa;
sa = new CStringArray();
sa->Add("0-0");
sa->Add("0-1");
saa.Add(sa);
sa = new CStringArray();
sa->Add("1-0");
sa->Add("1-1");
sa->Add("1-2");
saa.Add(sa);
// よみだすなり
for ( int i = 0; i < saa.GetCount(); ++i ) {
CStringArray* pa = saa[i];
for ( int j = 0; j < pa->GetCount(); ++j ) {
std::cout << static_cast<const char*>((*pa)[j]) << std::endl;
}
delete pa; // ついでに廃棄
std::cout << std::endl;
}
}
>επιστημηさん
ご丁寧にありがとうございます(笑
せっかくなので、時間ができたらこの方法もじっくり考えてみようと思います。
また、もし再度CStringArray辺りで問題発生したり、
今のソースで対処しきれなかったりして調べても分からなかったら
参考にさせていただきますね。