<?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[Zeiger auf Vector mit Iteratoren: Bei Zugriff Absturz]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche grad ein Code zu schreiben, der folgendes macht:<br />
Es sollen Linien gesucht werden, die sich in der Umgebung von anderen Linien befinden, und dann wieder Linien in deren Umgebung, also ist die Funktion rekursiv. So bekomme ich dann eine Gruppe von Linien, die ich als Iteratoren in einen Vektor schreibe, um diese Elemente (bis auf das erste) aus den Linienvektor zu löschen.</p>
<p>Hier der Code:</p>
<pre><code>void parallel_lines(std::vector&lt;std::vector&lt;LineData&gt;::iterator&gt;*, std::vector&lt;LineData&gt;*);
</code></pre>
<pre><code>void CPreProcessing::parallel_lines(std::vector&lt;std::vector&lt;LineData&gt;::iterator&gt;* vec, std::vector&lt;LineData&gt;* HoughLines)
{
    int j;
    int marker = 0;
    int i = HoughLines-&gt;size();
    std::cout&lt;&lt;&quot;\n --&gt;&gt;&gt; DELETE PARALLEL LINES, #Hough lines: &quot;&lt;&lt;HoughLines-&gt;size()&lt;&lt;std::endl;
    for(i; i&gt;=0; i--)
    {
        j = 0;
        std::vector&lt;LineData&gt;::iterator iter = (HoughLines[0]).begin();
        while(iter != (HoughLines[0]).end())
        {
            if (i != j)
            {
                if((abs(((HoughLines[0])[i]).StartPt.x - ((HoughLines[0])[j]).StartPt.x) &lt; 3
                    || abs(((HoughLines[0])[i]).EndPt.x - ((HoughLines[0])[j]).EndPt.x) &lt; 3)
                    &amp;&amp; abs(((HoughLines[0])[i]).d_slope - ((HoughLines[0])[j]).d_slope) &lt; 1)
                {
                    for(int m = 0; m &lt; vec-&gt;size(); m++)
                    {
                        if(&amp;*(vec-&gt;at(m)) == &amp;*iter)
                        {
                            marker = 1;
                        }
                    }
                    if(marker == 0)
                    {
                        (*vec).push_back(iter);
                        parallel_lines(vec, HoughLines);
                    }
                }
                else
                  iter++;
                  j++;
            }
            else
                iter++;
                j++;
        }
        for(int m = 0; m &lt; vec-&gt;size(); m++)
        {
            if (m != 0)
            {
                (HoughLines)[0].erase((*vec)[m]);
            }
        }
    }
};
</code></pre>
<p>Sobald ich auf den Vektor vec zugreife, stürzt das Programm ab, also hier in diesem Fall bei size() in der for-Bedingung.<br />
Weiß jemand was ich da falsch mache? Compiliert wird ja alles...</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/285469/zeiger-auf-vector-mit-iteratoren-bei-zugriff-absturz</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 05:13:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/285469.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 21 Apr 2011 09:30:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger auf Vector mit Iteratoren: Bei Zugriff Absturz on Thu, 21 Apr 2011 09:32:42 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche grad ein Code zu schreiben, der folgendes macht:<br />
Es sollen Linien gesucht werden, die sich in der Umgebung von anderen Linien befinden, und dann wieder Linien in deren Umgebung, also ist die Funktion rekursiv. So bekomme ich dann eine Gruppe von Linien, die ich als Iteratoren in einen Vektor schreibe, um diese Elemente (bis auf das erste) aus den Linienvektor zu löschen.</p>
<p>Hier der Code:</p>
<pre><code>void parallel_lines(std::vector&lt;std::vector&lt;LineData&gt;::iterator&gt;*, std::vector&lt;LineData&gt;*);
</code></pre>
<pre><code>void CPreProcessing::parallel_lines(std::vector&lt;std::vector&lt;LineData&gt;::iterator&gt;* vec, std::vector&lt;LineData&gt;* HoughLines)
{
    int j;
    int marker = 0;
    int i = HoughLines-&gt;size();
    std::cout&lt;&lt;&quot;\n --&gt;&gt;&gt; DELETE PARALLEL LINES, #Hough lines: &quot;&lt;&lt;HoughLines-&gt;size()&lt;&lt;std::endl;
    for(i; i&gt;=0; i--)
    {
        j = 0;
        std::vector&lt;LineData&gt;::iterator iter = (HoughLines[0]).begin();
        while(iter != (HoughLines[0]).end())
        {
            if (i != j)
            {
                if((abs(((HoughLines[0])[i]).StartPt.x - ((HoughLines[0])[j]).StartPt.x) &lt; 3
                    || abs(((HoughLines[0])[i]).EndPt.x - ((HoughLines[0])[j]).EndPt.x) &lt; 3)
                    &amp;&amp; abs(((HoughLines[0])[i]).d_slope - ((HoughLines[0])[j]).d_slope) &lt; 1)
                {
                    for(int m = 0; m &lt; vec-&gt;size(); m++)
                    {
                        if(&amp;*(vec-&gt;at(m)) == &amp;*iter)
                        {
                            marker = 1;
                        }
                    }
                    if(marker == 0)
                    {
                        (*vec).push_back(iter);
                        parallel_lines(vec, HoughLines);
                    }
                }
                else
                  iter++;
                  j++;
            }
            else
                iter++;
                j++;
        }
        for(int m = 0; m &lt; vec-&gt;size(); m++)
        {
            if (m != 0)
            {
                (HoughLines)[0].erase((*vec)[m]);
            }
        }
    }
};
</code></pre>
<p>Sobald ich auf den Vektor vec zugreife, stürzt das Programm ab, also hier in diesem Fall bei size() in der for-Bedingung.<br />
Weiß jemand was ich da falsch mache? Compiliert wird ja alles...</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052395</guid><dc:creator><![CDATA[Björn87]]></dc:creator><pubDate>Thu, 21 Apr 2011 09:32:42 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Vector mit Iteratoren: Bei Zugriff Absturz on Thu, 21 Apr 2011 09:32:53 GMT]]></title><description><![CDATA[<p>Hier mit C++-Tags:</p>
<pre><code class="language-cpp">void CPreProcessing::parallel_lines(std::vector&lt;std::vector&lt;LineData&gt;::iterator&gt;* vec, std::vector&lt;LineData&gt;* HoughLines) 
{ 
    int j; 
    int marker = 0; 
    int i = HoughLines-&gt;size(); 
    std::cout&lt;&lt;&quot;\n --&gt;&gt;&gt; DELETE PARALLEL LINES, #Hough lines: &quot;&lt;&lt;HoughLines-&gt;size()&lt;&lt;std::endl; 
    for(i; i&gt;=0; i--) 
    { 
        j = 0; 
        std::vector&lt;LineData&gt;::iterator iter = (HoughLines[0]).begin(); 
        while(iter != (HoughLines[0]).end()) 
        { 
            if (i != j) 
            { 
                if((abs(((HoughLines[0])[i]).StartPt.x - ((HoughLines[0])[j]).StartPt.x) &lt; 3 
                    || abs(((HoughLines[0])[i]).EndPt.x - ((HoughLines[0])[j]).EndPt.x) &lt; 3) 
                    &amp;&amp; abs(((HoughLines[0])[i]).d_slope - ((HoughLines[0])[j]).d_slope) &lt; 1) 
                { 
                    for(int m = 0; m &lt; vec-&gt;size(); m++) 
                    { 
                        if(&amp;*(vec-&gt;at(m)) == &amp;*iter) 
                        { 
                            marker = 1; 
                        } 
                    } 
                    if(marker == 0) 
                    { 
                        (*vec).push_back(iter); 
                        parallel_lines(vec, HoughLines); 
                    } 
                } 
                else 
                  iter++; 
                  j++; 
            } 
            else 
                iter++; 
                j++; 
        } 
        for(int m = 0; m &lt; vec-&gt;size(); m++) 
        { 
            if (m != 0) 
            { 
                (HoughLines)[0].erase((*vec)[m]); 
            } 
        } 
    } 
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2052396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052396</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Thu, 21 Apr 2011 09:32:53 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Vector mit Iteratoren: Bei Zugriff Absturz on Thu, 21 Apr 2011 09:49:49 GMT]]></title><description><![CDATA[<p>Wo wird deine Funktion aufgerufen und wie sehen die Daten in vec aus. Du bist dir sicher dass vec kein Nullpointer ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052403</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052403</guid><dc:creator><![CDATA[Tobias Gerg]]></dc:creator><pubDate>Thu, 21 Apr 2011 09:49:49 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Vector mit Iteratoren: Bei Zugriff Absturz on Thu, 21 Apr 2011 10:04:00 GMT]]></title><description><![CDATA[<p>Doch, war der <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="😃"
    /></p>
<pre><code>std::vector&lt;std::vector&lt;LineData&gt;::iterator&gt;* vec;
parallel_lines(vec, HoughLines);
</code></pre>
<p>Das ist der Aufruf, aber nun steht ja in vec nichts drin, und bei size erzählt der mir nun was von Millionen von Elementen und stürzt dann natürlich ab, wenn aufs erste zugegriffen wird <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052414</guid><dc:creator><![CDATA[Björn87]]></dc:creator><pubDate>Thu, 21 Apr 2011 10:04:00 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Vector mit Iteratoren: Bei Zugriff Absturz on Thu, 21 Apr 2011 10:26:16 GMT]]></title><description><![CDATA[<p>Einen Zeiger auf einen Vektor von Iteratoren eines Vektors auf Zeilen? Bist Du sicher, dass Du da nicht ein bisschen übertrieben hast?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052429</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052429</guid><dc:creator><![CDATA[Eisflamme]]></dc:creator><pubDate>Thu, 21 Apr 2011 10:26:16 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Vector mit Iteratoren: Bei Zugriff Absturz on Thu, 21 Apr 2011 10:50:20 GMT]]></title><description><![CDATA[<p>Mir fällt keine bessere Lösung ein, das erase will ja nunmal Iteratoren...<br />
Als int kann ich das ja deshalb nicht speichern, weil ich ja nachher alle Elemente aus dieser Gruppe, die der Vektor darstellt, löschen will, und der ja seine Iteratoren haben will...</p>
<p>Wenn das so sonst gar nich klappt, müsste ich den sonst jede Linie von links nach rechts durchgehen lassen und dann ggf. die linke von der aktuellen löschen oder sowas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052442</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052442</guid><dc:creator><![CDATA[Björn87]]></dc:creator><pubDate>Thu, 21 Apr 2011 10:50:20 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Vector mit Iteratoren: Bei Zugriff Absturz on Thu, 21 Apr 2011 11:09:22 GMT]]></title><description><![CDATA[<p>Björn87 schrieb:</p>
<blockquote>
<p>Doch, war der <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="😃"
    /></p>
<pre><code>std::vector&lt;std::vector&lt;LineData&gt;::iterator&gt;* vec;
parallel_lines(vec, HoughLines);
</code></pre>
<p>Das ist der Aufruf, aber nun steht ja in vec nichts drin, und bei size erzählt der mir nun was von Millionen von Elementen und stürzt dann natürlich ab, wenn aufs erste zugegriffen wird <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>Wenn das dein Aufruf ist, ist es klar... Du rufst die Funktion mit einem nicht initialisierten Zeiger auf, der irgendwo hin zeigt.</p>
<p>Versuchs mal so</p>
<pre><code class="language-cpp">std::vector&lt;std::vector&lt;LineData&gt;::iterator&gt; vec;
parallel_lines(&amp;vec, HoughLines);
</code></pre>
<p>Wobei du hier auf die Lebensdauer von vec aufpassen musst...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052455</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052455</guid><dc:creator><![CDATA[Tobias Gerg]]></dc:creator><pubDate>Thu, 21 Apr 2011 11:09:22 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Vector mit Iteratoren: Bei Zugriff Absturz on Thu, 21 Apr 2011 13:28:48 GMT]]></title><description><![CDATA[<p>Und selbst dann ist die Funktion immer noch absturzgefährdet, denn die Iteratoren können sich ja bei interner Neuallozierung des Vectors ändern (bei push_back).</p>
<p>Hallo Björn87,</p>
<p>nimm einfach den Index (size_t) anstatt des Iterators.<br />
Und bei erase(...) kannst du dann mittels &quot;vec.begin() + index&quot; den aktuell korrekten Iterator als Parameter angeben.</p>
<p>Und mit Referenzen solltest du dich auch mal beschäftigen, dann könntest du nämlich auf die ganzen Zeiger und Dereferenzierungen verzichten <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /><br />
(HoughLines[0] sagt mir nämlich, daß du einiges an C++ noch nicht ganz verstanden hast)</p>
<p>Zusammengefaßt also:</p>
<pre><code class="language-cpp">void PreProcessing::parallel_lines(std::vector&lt;size_t&gt; &amp;vec, std::vector&lt;LineData&gt; &amp;HoughLines)
{
  // ...
  vec.push_back(j);
  // ...

  HoughLines.erase(vec.begin()+m);
}
</code></pre>
<p>Und wenn du alle bis auf den ersten aus dem Vector löschen willst, dann geht auch einfach:</p>
<pre><code class="language-cpp">HoughLines.erase(vec.begin()+1, vec.end());
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2052527</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052527</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Thu, 21 Apr 2011 13:28:48 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger auf Vector mit Iteratoren: Bei Zugriff Absturz on Wed, 27 Apr 2011 06:48:03 GMT]]></title><description><![CDATA[<p>Ok, danke, werde ich mal versuchen, über Ostern war ich leider nicht da.<br />
Das mit dem HoughLines[0] habe ich vom Code meines Betreuers übernommen, ehrlich gesagt, hab ich kein Plan was das [0] da sein soll <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 />
Das mit dem ersten Element löschen war jetzt nur ein Beispiel, das will ich später so ändern, dass er alle Linie bis auf die in der Mitte löscht, bloß dazu muss ich erstmal die mittlere Linie finden usw.</p>
<p>Ich versuchs dann einfach mal so, danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2054873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2054873</guid><dc:creator><![CDATA[Björn87]]></dc:creator><pubDate>Wed, 27 Apr 2011 06:48:03 GMT</pubDate></item></channel></rss>