<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[SIGSEGV-Fehler bei rekusivem Duchlauf]]></title><description><![CDATA[<p>Hi,<br />
Ich baue gerade ne Funktion zum rekurisven Durchsuchen von Ordner. Die sieht momentan wie folgt aus:</p>
<pre><code class="language-cpp">void SearchDataInFolder(HANDLE hwd,WIN32_FIND_DATA *DataStruct)
{
    while(FindNextFile(hwd,DataStruct) == true)
    {

        if (DataStruct-&gt;cFileName[0] != '.')
        {
            //Wenn Ordner-&gt;Zähler hoch-&gt;In Ordner
            if (DataStruct-&gt;dwFileAttributes &amp; FILE_ATTRIBUTE_DIRECTORY)
            {
                FolderCnt++; //globaler int
                //hier ist der Fehler
                SearchDataInFolder(hwd,DataStruct);
            }
            //Wenn Datei-&gt;Zähler hoch
            else DataCnt++; //globaler int
        }
    }
    FindClose(hwd);
}
</code></pre>
<p>Ein einmaliger Durchlauf(ohne checken der Unterordner) klappt ohne Probleme, wenn ich jedoch auch in die Unterordner gehen will macht mein Programm erstmal gar nichts und dann kommt ein Speicherfehler (der Debugmodus nennt das ganze SIGSEGV - hab bei Wikipedia geschaut, aber das half mir nicht viel...)<br />
ALso es ist ein Problem mit dem Spichermanagment, jedoch wies sich nicht genau wo,wie und warum....</p>
<p>Zum erst-Aufruf der Funktion :</p>
<pre><code class="language-cpp">...
    HANDLE hwd;
    WIN32_FIND_DATA DataStruct;
...
    //StartPath ist ein ganz normaler String (mit *) wie z.B. &quot;C:\\Test\\*&quot;
    hwd = FindFirstFile(StartPath,&amp;DataStruct);
    SearchDataInFolder(hwd,&amp;DataStruct);
...
</code></pre>
<p>P.S. Kann sein, dass der Thread besser ins C++-Forum passt, aber da die Funktion hauptsächlich aus WinApi-Befehlen besteht....</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/180687/sigsegv-fehler-bei-rekusivem-duchlauf</link><generator>RSS for Node</generator><lastBuildDate>Sat, 04 Apr 2026 17:33:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/180687.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 05 May 2007 11:36:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to SIGSEGV-Fehler bei rekusivem Duchlauf on Sat, 05 May 2007 11:36:53 GMT]]></title><description><![CDATA[<p>Hi,<br />
Ich baue gerade ne Funktion zum rekurisven Durchsuchen von Ordner. Die sieht momentan wie folgt aus:</p>
<pre><code class="language-cpp">void SearchDataInFolder(HANDLE hwd,WIN32_FIND_DATA *DataStruct)
{
    while(FindNextFile(hwd,DataStruct) == true)
    {

        if (DataStruct-&gt;cFileName[0] != '.')
        {
            //Wenn Ordner-&gt;Zähler hoch-&gt;In Ordner
            if (DataStruct-&gt;dwFileAttributes &amp; FILE_ATTRIBUTE_DIRECTORY)
            {
                FolderCnt++; //globaler int
                //hier ist der Fehler
                SearchDataInFolder(hwd,DataStruct);
            }
            //Wenn Datei-&gt;Zähler hoch
            else DataCnt++; //globaler int
        }
    }
    FindClose(hwd);
}
</code></pre>
<p>Ein einmaliger Durchlauf(ohne checken der Unterordner) klappt ohne Probleme, wenn ich jedoch auch in die Unterordner gehen will macht mein Programm erstmal gar nichts und dann kommt ein Speicherfehler (der Debugmodus nennt das ganze SIGSEGV - hab bei Wikipedia geschaut, aber das half mir nicht viel...)<br />
ALso es ist ein Problem mit dem Spichermanagment, jedoch wies sich nicht genau wo,wie und warum....</p>
<p>Zum erst-Aufruf der Funktion :</p>
<pre><code class="language-cpp">...
    HANDLE hwd;
    WIN32_FIND_DATA DataStruct;
...
    //StartPath ist ein ganz normaler String (mit *) wie z.B. &quot;C:\\Test\\*&quot;
    hwd = FindFirstFile(StartPath,&amp;DataStruct);
    SearchDataInFolder(hwd,&amp;DataStruct);
...
</code></pre>
<p>P.S. Kann sein, dass der Thread besser ins C++-Forum passt, aber da die Funktion hauptsächlich aus WinApi-Befehlen besteht....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279228</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Sat, 05 May 2007 11:36:53 GMT</pubDate></item><item><title><![CDATA[Reply to SIGSEGV-Fehler bei rekusivem Duchlauf on Sat, 05 May 2007 12:16:18 GMT]]></title><description><![CDATA[<p>Du veränderst den Dateinamen der Ordnersuche nicht. Du musst bei dem gefundenen Ordnernamen wieder das sternchen und den Ursprungspfad anhängen, damit es Funktioniert. Außerdem musst du immer eine neue Suche starten:</p>
<pre><code class="language-cpp">void SearchDataInFolder(HANDLE hwd, LPCWSTR lpFolder)
{
    DWORD len = (DWORD)wcslen(lpFolder);
    // Ordnername + \* muss da sein
    if(lpFolder[len - 1] == L'\\')
        lpFolder[len++] = L'*', lpFolder[len] = 0;

    // Neue suche beginnen
    WIN32_FIND_DATA wfd;
    HANDLE hFind = FindFirstFile(lpFolder, &amp;wfd);
    // . ordner wird nicht beachtet, .. rausfiltern

    while(FindNextFile(hwd, wfd))
    {

        if (wfd.cFileName[0] != '.')
        {
            //Wenn Ordner-&gt;Zähler hoch-&gt;In Ordner
            if (DataStruct-&gt;dwFileAttributes &amp; FILE_ATTRIBUTE_DIRECTORY)
            {
                FolderCnt++; //globaler int
                //Neuer Pfad für rekursive funktion
                WCHAR Path[MAX_PATH];
                // Sternchen entfernen
                lpPath[len - 1] = L&quot;\0&quot;;
                PathCombine(Path, lpFolder, wfd.cFileName);
                // Sternchen wieder hin
                lpPath[len - 1] = L&quot;*&quot;;
                DWORD len2 = (DWORD)wcslen(Path);
                // Sternchen an neuen Pfad hinzufügen
                Path[len2] = L'\\';
                Path[len2 + 1] = L'*';
                Path[len2 + 2] = L'\0';
                // Suchen
                SearchDataInFolder(hwd,DataStruct);
            }
            //Wenn Datei-&gt;Zähler hoch
            else DataCnt++; //globaler int
        }
    }
    FindClose(hFind);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1279247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279247</guid><dc:creator><![CDATA[Dennis123]]></dc:creator><pubDate>Sat, 05 May 2007 12:16:18 GMT</pubDate></item><item><title><![CDATA[Reply to SIGSEGV-Fehler bei rekusivem Duchlauf on Sat, 05 May 2007 12:21:46 GMT]]></title><description><![CDATA[<p>Zusatz:<br />
Da der Ordnername nicht geändert ist rufst du die Funktion immer mit dem gleichem Namen auf ==&gt; Stack overflow. Das wäre so als würdest du in einer unendlichen Schleife arbeiten nur, dass der Stack eben mit den returnadressen zugemüllt wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279249</guid><dc:creator><![CDATA[Dennis123]]></dc:creator><pubDate>Sat, 05 May 2007 12:21:46 GMT</pubDate></item><item><title><![CDATA[Reply to SIGSEGV-Fehler bei rekusivem Duchlauf on Sat, 05 May 2007 12:27:42 GMT]]></title><description><![CDATA[<p>Achso... Ok, danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279253</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279253</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Sat, 05 May 2007 12:27:42 GMT</pubDate></item><item><title><![CDATA[Reply to SIGSEGV-Fehler bei rekusivem Duchlauf on Sat, 05 May 2007 12:30:25 GMT]]></title><description><![CDATA[<p>Keine ursache, aber in dem code habe ich vergessen das handle hwn durch hFind zu ersetzen und das bei der Funktionssignatur rauszumachen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279255</guid><dc:creator><![CDATA[Dennis123]]></dc:creator><pubDate>Sat, 05 May 2007 12:30:25 GMT</pubDate></item><item><title><![CDATA[Reply to SIGSEGV-Fehler bei rekusivem Duchlauf on Sat, 05 May 2007 14:25:25 GMT]]></title><description><![CDATA[<p>Joa, hab ich gesehen, hab den aber auch nicht 1zu1 kopiert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Ich habs nun geschafft, dass alles funktioniert, nur geht der folgende Aufruf nicht immer:<br />
Ich hab einen Testordner mit folender Herachie angelegt:</p>
<pre><code>D:\t-&gt;a-&gt;c-&gt;Datei
        -&gt;Datei    
        -&gt;Datei
     -&gt;b-&gt;Datei
</code></pre>
<p>a,b,c sind Ordner. a enthält einen Unterordner und 2 Dateien. C(Unterordner von a) eine Datei und B ebenfalls eine Datei.<br />
Mein Programm findet aber nur 3 Dateien und 3 Unterordner- daher irgendwo wird was unterschlagen, ich denke mal die Datei die sich in Ordner b befindet...<br />
Aber warum?<br />
Hier der Code:</p>
<pre><code class="language-cpp">void SearchDataInFolder(char *StartPath)
{
    char TempStartPath[1024] = {'\0'};
    unsigned int i = 0;

    HANDLE hwd;
    WIN32_FIND_DATA DataStruct;

    //Das was auf in dem Pointer steht in die lokale Variable,um die später zu verändern
    while (StartPath[i] != '\0')
    {
        TempStartPath[i] = StartPath[i];
        i++;
    }

    hwd = FindFirstFile(TempStartPath,&amp;DataStruct);

    while(FindNextFile(hwd,&amp;DataStruct) == true)
    {

        if (DataStruct.cFileName[0] != '.')
        {
            //Wenn Ordner-&gt;Zähler hoch-&gt;In Ordner
            if (DataStruct.dwFileAttributes &amp; FILE_ATTRIBUTE_DIRECTORY)
            {
                FolderCnt++;
                //Ändert halt den Pfad entsprechend
                ChangePath(TempStartPath,DataStruct.cFileName);
                SearchDataInFolder(TempStartPath);
            }
            //Wenn Datei-&gt;Zähler hoch
            else DataCnt++;
        }
    }
    FindClose(hwd);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1279297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279297</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Sat, 05 May 2007 14:25:25 GMT</pubDate></item><item><title><![CDATA[Reply to SIGSEGV-Fehler bei rekusivem Duchlauf on Sat, 05 May 2007 15:11:59 GMT]]></title><description><![CDATA[<p>Ich hab mal die Ordner angelegt und den Code durchlaufen lassen und bin darauf gekommen, dass der ordner b als a\b\* durchsucht wird. Du musst nachdem du den Unterordner durchsucht hast den alten ordner wiederherstellen oder den char array extra für den unterordner anlegen --&gt; TempStartPath in die ordnerbedingung verlegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279313</guid><dc:creator><![CDATA[Dennis123]]></dc:creator><pubDate>Sat, 05 May 2007 15:11:59 GMT</pubDate></item><item><title><![CDATA[Reply to SIGSEGV-Fehler bei rekusivem Duchlauf on Sat, 05 May 2007 15:17:07 GMT]]></title><description><![CDATA[<p>Wird das so aber nicht schon gehandhabt?<br />
Man hat doch immer Instanzen der Variablen, daher es gibt mehrere TempPathStrings, jweils eine für jede ausgeführte Funktion.<br />
Darum pack ich die ja auch extra um am Anfang der Funktion, damit ich nicht die Variable der alten Funktion ändere oder hab ich da nun was falsch verstanden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279316</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Sat, 05 May 2007 15:17:07 GMT</pubDate></item><item><title><![CDATA[Reply to SIGSEGV-Fehler bei rekusivem Duchlauf on Sat, 05 May 2007 15:24:33 GMT]]></title><description><![CDATA[<p>Schon aber dein ChangePath verändert den Pfad und ruft die neue Funktion auf, aber du tust danach den veränderten pfad nicht zurücksetzen.</p>
<pre><code class="language-cpp">void SearchDataInFolder(char *StartPath)
{
    char TempStartPath[1024] = {'\0'};
    unsigned int i = 0;

    HANDLE hwd;
    WIN32_FIND_DATA DataStruct;

    //Das was auf in dem Pointer steht in die lokale Variable,um die später zu verändern
    while (StartPath[i] != '\0')
    {
        TempStartPath[i] = StartPath[i];
        i++;
    }
    // TempStartPath ist D:\t\*

    hwd = FindFirstFile(TempStartPath,&amp;DataStruct);

    while(FindNextFile(hwd,&amp;DataStruct) == true)
    {

        if (DataStruct.cFileName[0] != '.')
        {
            //Wenn Ordner-&gt;Zähler hoch-&gt;In Ordner
            if (DataStruct.dwFileAttributes &amp; FILE_ATTRIBUTE_DIRECTORY)
            {
                FolderCnt++;
                //Ändert halt den Pfad entsprechend
                ChangePath(TempStartPath,DataStruct.cFileName);
                // Nun D:\t\a\*
                SearchDataInFolder(TempStartPath);
            }
            //Wenn Datei-&gt;Zähler hoch
            else DataCnt++;
            // Immer noch D:\t\a\* sollte aber D:\t\* sein
            // Beim 2. mal wird der ordner b angehängt --&gt; D:\t\a\b\*
        }
    }
    FindClose(hwd);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1279318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279318</guid><dc:creator><![CDATA[Dennis123]]></dc:creator><pubDate>Sat, 05 May 2007 15:24:33 GMT</pubDate></item><item><title><![CDATA[Reply to SIGSEGV-Fehler bei rekusivem Duchlauf on Sat, 05 May 2007 15:53:50 GMT]]></title><description><![CDATA[<p>Achso...<br />
Ok, geänder und funzt DANKE</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1279332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1279332</guid><dc:creator><![CDATA[Pille456]]></dc:creator><pubDate>Sat, 05 May 2007 15:53:50 GMT</pubDate></item></channel></rss>