関数が別の場所へ移動できません。 – プログラミング – Home

関数が別の場所へ移動できません。
 
通知
すべてクリア

[解決済] 関数が別の場所へ移動できません。


はな
 はな
(@はな)
ゲスト
結合: 22年前
投稿: 123
Topic starter  

また、ヒントお願いします、はなです。
OSはWindows XPでVisual Studio2005のVC++です。

下記の※に1~2を挿入して実行したいのですが、コンパイル後、エラーは出ないのです
が、実行できません。

よろしくおねがいします。

void CSampleDlg::SetDate(LPCTSTR dir)
{
CFileFind finder;
CString path;

path = dir + CString(\\*.*);

m_lvList.DeleteAllItems();
BOOL bWorking = finder.FindFile(path);
while(bWorking)
{

bWorking = finder.FindNextFile();

CString file = finder.GetFileName();
ULONGLONG length = finder.GetLength();
CTime time;
CString namefile;
finder.GetLastWriteTime(time);

SetFileView(namefile, length, time); ←※

}

}

void CSampleDlg::SetFileView(CString namefile,ULONGLONG length,CTime time) ←

{
CFileFind finder;

CString csGetLength;

csGetLength.Format(%d,finder.GetLength());

CString s( _T( finder.GetFileName()) );

int pos = s.ReverseFind('.');

m_lvList.InsertItem(0,namefile );
m_lvList.SetItemText(0,1,csGetLength);

if (pos != -1)
m_lvList.SetItemText(0,2,s.Mid(pos) );

m_lvList.SetItemText(0,3,time.Format(%H:%M:%S));
} ←2


引用未解決
トピックタグ
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

もし、丸ごとコピーしているなら動かなくて当たり前かと。
挿入部分にもCFileFind finder;があるので
ブロック内では中で宣言した物が使われるはずです。

というか、ちゃんとデバッガでデバッグすれば、すぐわかるはずですよ。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

というか
> CFileFind finder;
> CString s( _T( finder.GetFileName()) );
引数のnamefileを使えばは不要ですよね?
(ちなみに、CStringの戻り値に_Tマクロを使うのはおかしい)

CFileFindの変数を渡すのであれば、引数のnamefile,length,timeは不要ですね。


返信引用
はな
 はな
(@はな)
ゲスト
結合: 22年前
投稿: 123
Topic starter  

PATIOさん、まるごとコピーなわけではありません。デバックしても他のクラス
(filefind.cpp)にエラーが出てました。助言、ありがとうございます。

ULONGLONG CFileFind::GetLength() const
{
ASSERT(m_hContext != NULL);←ここにエラーでした。
ASSERT_VALID(this);

ULARGE_INTEGER nFileSize;

if (m_pFoundInfo != NULL)
{
nFileSize.LowPart = ((LPWIN32_FIND_DATA) m_pFoundInfo)-
>nFileSizeLow;
nFileSize.HighPart = ((LPWIN32_FIND_DATA) m_pFoundInfo)-
>nFileSizeHigh;
}
else
{
nFileSize.QuadPart = 0;
}

return nFileSize.QuadPart;
}

Blueさん、ちょっと変え方がわからないのでそのまま考えてみたいと思います。アドバ
イスはありがとうございます。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

 以前もあったのですが、ソースを掲示して
「動かないんです、さぁー見てください。」
 でなく、どう動かないのかを説明する必要があると思います。

PATIOさんも発言していますが、デバックしてどこまで予定通り動くのかの
情報が欲しいです。


返信引用
はな
 はな
(@はな)
ゲスト
結合: 22年前
投稿: 123
Topic starter  

わかりずらい発言すいませんでした。もう少し理解してからの発言にすべきでした。

デバックしてm_hContext1の中身を見ると値が0になっていて変です。

また、namefileの中身は値が……となっていてうまくいってないようです。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

だから、
> CSampleDlg::SetFileView
のなかの
> CFileFind finder;
と、呼び出しもとの
> CFileFind finder;
は同じものでしょうか?

> ASSERT(m_hContext != NULL);←ここにエラーでした。
これは、CSampleDlg::SetFileView のなかの finder が FindFileしていないから出ま
す。
先にもアドバイスしたとおり、finderを使わず、引数のnamefile,lengthを使いましょ
う。

void CSampleDlg::SetFileView( CString namefile,U LONGLONG length, CTime time )
{
CString csGetLength;
csGetLength.Format( _T(%d ), length ); // LONGLONGで%dでいいのかなぁ?

int pos = namefile.ReverseFind( _T( '.' ) );

m_lvList.InsertItem( 0, namefile );
m_lvList.SetItemText( 0, 1, csGetLength );

if ( pos != -1 )
m_lvList.SetItemText( 0, 2, namefile.Mid( pos ) );

m_lvList.SetItemText( 0, 3, time.Format( _T( %H:%M:%S ) ) );
}


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

typo. 余分な空白が入ってしまいました。

> void CSampleDlg::SetFileView( CString namefile,U LONGLONG length, CTime
time )
void CSampleDlg::SetFileView( CString namefile, ULONGLONG length, CTime time )

> // LONGLONGで%dでいいのかなぁ?
// ULONGLONGで%dでいいのかなぁ?


返信引用
はな
 はな
(@はな)
ゲスト
結合: 22年前
投稿: 123
Topic starter  

>>だから、
>> > CSampleDlg::SetFileView
>>のなかの
>> > CFileFind finder;
>>と、呼び出しもとの
>> > CFileFind finder;
>>は同じものでしょうか?

どうやら同じもののようでした。

わざわざ書いていただいてすいませんでした。お手数かけました。

上記のようにしましたら成功しました。ファイル名が出ていなかったので、なんとかや
ってもようと思います。ありがとうございました。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> どうやら同じもののようでした。
いやぜんぜん違うでしょ。

Sample)

void test1();
void test2();

int main()
{
test1();
return 0;
}

void test1()
{
int i = 10;
test2();
}

void test2()
{
int i;
// i の値は 10 ですか?
}


返信引用
はな
 はな
(@はな)
ゲスト
結合: 22年前
投稿: 123
Topic starter  

考えてみましたが、test2()のint iは10が代入されないと思いますね。

この関数の所は考えが難しくて悩む所なのです。(上のような簡単な例題でも)

基本がまだまだなっていないって事なのですが…。

易しい問題まで用意していただいてほんとすいません。


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

>この関数の所は考えが難しくて悩む所なのです。(上のような簡単な例題でも)
C言語を使うにおいてとても大切な考え方です。
C言語の参考書には必ず説明が書いてあります。
ぜひ、読んで見てください。


返信引用
はな
 はな
(@はな)
ゲスト
結合: 22年前
投稿: 123
Topic starter  

上の
void CSampleDlg::SetDate(LPCTSTR dir)
{
.
.
.
CString file = finder.GetFileName();
.
.
}

 CString namefile = finder.GetFileName();
に変更したら、名前なども表示できるようになりました。

他の所を参考に変更したらきちんとできたみたいです。

感謝しています。


返信引用
はな
 はな
(@はな)
ゲスト
結合: 22年前
投稿: 123
Topic starter  

>>この関数の所は考えが難しくて悩む所なのです。(上のような簡単な例題でも)
>C言語を使うにおいてとても大切な考え方です。
>C言語の参考書には必ず説明が書いてあります。
>ぜひ、読んで見てください。

確かに。参考書などでも比較的はじめのほうに簡単な例がのっていますよね。

そういうのからコツコツやっていく事で、応用に使っていくれのだと思います。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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