関数が別の場所へ移動できません。

[戻る]
はな 2006/07/13(木) 14:37:54
また、ヒントお願いします、はなです。
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) ←
1
{
    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 2006/07/13(木) 14:55:46
もし、丸ごとコピーしているなら動かなくて当たり前かと。
挿入部分にもCFileFind finder;があるので
ブロック内では中で宣言した物が使われるはずです。

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

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

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

はな 2006/07/13(木) 15:21:37
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 2006/07/13(木) 15:23:54
 以前もあったのですが、ソースを掲示して
「動かないんです、さぁー見てください。」
 でなく、どう動かないのかを説明する必要があると思います。

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

はな 2006/07/13(木) 15:30:08
わかりずらい発言すいませんでした。もう少し理解してからの発言にすべきでした。

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

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

Blue 2006/07/13(木) 15:38:20
だから、
> 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 2006/07/13(木) 15:40:03
typo. 余分な空白が入ってしまいました。

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

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

はな 2006/07/13(木) 16:02:40
>>だから、
>> > CSampleDlg::SetFileView
>>のなかの
>> > CFileFind finder; 
>>と、呼び出しもとの
>> > CFileFind finder;
>>は同じものでしょうか?

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

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

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

Blue 2006/07/13(木) 16:09:07
> どうやら同じもののようでした。
いやぜんぜん違うでしょ。

Sample)

void test1();
void test2();

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

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

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

はな 2006/07/13(木) 16:23:24
考えてみましたが、test2()のint iは10が代入されないと思いますね。

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

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

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

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

はな 2006/07/13(木) 16:49:29
[[解決]]
上の
void CSampleDlg::SetDate(LPCTSTR dir)
{
  .
  .
  .
  CString file = finder.GetFileName();
  .
  .
}
を
 CString namefile = finder.GetFileName();
に変更したら、名前なども表示できるようになりました。

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

感謝しています。

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

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

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

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