TCHAR型の配列 – プログラミング – Home

通知
すべてクリア

[解決済] TCHAR型の配列


ネコ
 ネコ
(@ネコ)
ゲスト
結合: 23年前
投稿: 94
Topic starter  

10個のファイル名称を格納したい為、
TCHAR型の配列を用いたいと考えています。

メンバ変数に、
TCHAR m_szFileName[10][256]

と宣言し、

_tcscpy(m_szFileName[0], _T(\\c:\\Test\\File0.txt) );
_tcscpy(m_szFileName[1], _T(\\c:\\Test\\File1.txt) );
_tcscpy(m_szFileName[2], _T(\\c:\\Test\\File2.txt) );
・・・省略・・・
_tcscpy(m_szFileName[9], _T(\\c:\\Test\\File9.txt) );

と設定していますが、
コンパイルは通りますし、実行も可能ですが、ごく稀に、
配列の初期化をしていないのに中身が消えてしまうことがあります。

TCHARの配列の考え方が正しいか、疑問に感じてきましたので質問させていただきました。
# もしかすると、他のところでプロチョンしているのかもしれませんね。。。。

ちなみに、CString型で配列を持たせる方法、

CString m_sFileName[10];
m_sFileName[0] = _T(\\c:\\Test\\File0.txt);
 ・・・省略・・・

はできれば使用を避けたいと思っています。

配列の考え方、間違っていないかご指摘いただけないでしょうか?


引用未解決
トピックタグ
DBL
 DBL
(@DBL)
ゲスト
結合: 21年前
投稿: 6
 

こんばんは。

Zeromemory, memset などの関数でゼロクリアしておいたらどうでしょうか?

違っていたらすみません。


返信引用
渋木宏明(ひどり)
 渋木宏明(ひどり)
(@渋木宏明(ひどり))
ゲスト
結合: 21年前
投稿: 33
 

>配列の初期化をしていないのに中身が消えてしまうことがあります。

255 文字以上のパス名を格納しようとしているとか。

>はできれば使用を避けたいと思っています。

なんでまた?


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

単純に思ったのですが
>_T(\\c:\\Test\\File0.txt);

\\c:\\Test\\File + 配列インデックス .txt
になってませんか

\\c:\\Test\\Fileの部分が規則性のないバラバラな物であれば
配列に格納する必要あると思いますけど
規則性があって、配列インデックスの値を付与しただけの物であれば
ファイル名を生成する手もアリじゃないですか?


返信引用
ネコ
 ネコ
(@ネコ)
ゲスト
結合: 23年前
投稿: 94
Topic starter  

ネコです。

>255 文字以上のパス名を格納しようとしているとか。

2,3階層で考えていますので、255文字以上はあり得ない状況です。

プログラム通して、配列についてはCStringは使っていないので、
この場所だけCString型の配列は統一感が無くなるのかなと思い、
CStringは避けたいと考えていました。

ただ、文字型の配列 m_szFileName[10][256]と宣言していますので、
値を代入したり、参照したりするときは、
今は、m_szFileName[0]等と表記していますが、
m_szFileName[0][0]の様に、2つめの要素も記述するべきなのかが
あいまいです。

動作をするという事は問題ないと思うのですが、厳密的には違うのかもしれません。

それと、
\\c:\\Test\\File + 配列インデックス .txt
のようにすれば確かにメンバ変数(配列)にする必要ないですね。
盲点でした。

DBLさん、渋木宏明(ひどり)さん、woodさん、ありがとうございました。

解決次第、解決チェックつけます。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

釈迦に説法と言う気もしますが、
他のメンバー変数への代入とかstrcpyとか、memcpyなんかで
変数領域をオーバーするようなコードがあってたまたまその部分を壊しているとか、

どこかのifにm_szFileName[i][0] == NULLとすべきところを
m_szFileName[i][0] = NULLと書いているところがあるとかそういった可能性は
全く無いのでしょうか?

いえ、最初に
「他のところでプロチョンしているのかもしれませんね」
と書いておられたようなのでその可能性も疑っただけなんですが。


返信引用
ネコ
 ネコ
(@ネコ)
ゲスト
結合: 23年前
投稿: 94
Topic starter  

ネコです。

PATIOさま、アドバイスありがとうございました。
見事、
>変数領域をオーバーするようなコードがあってたまたまその部分を壊しているとか、
でした。
# 本当に自分が恥ずかしいです...。m(__;)m

原因は、このコードとは別のところで、まさしく領域破壊が原因だった模様です。
TCHAR szName[20];
という変数があって、そこに特定の動作を行うと、文字だけで20文字(つまり、
ヌル文字入れて21文字)格納していました。

この領域を、多めに取ったら、見事再現はしなくなりました。
先の配列の中身が消えてしまうという事も無くなりました。

ちょっとのミスが、なかなか気づく事ができないエラーに陥ってしまいますので、
VC++って、本当に怖いのですね。

私もまだまだVC++は学習の身です。これからもよろしくお願いいたします!
みなさま、大変ありがとうございました!


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました