<?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[Array als Referenz]]></title><description><![CDATA[<p>Hallo<br />
ist es möglich einen Array als Referenz zu übergeben?<br />
Ich habe 2 Funktionen. In Funktion1 wird irgendwann Funktion2 aufgerufen. Dort soll dann ein int array[20] verändert werden. Nachher soll auf diesen Vektor dann in Funktion1 zugegriffen werden.<br />
Da ich gelesen habe, dass man globale Variablen wenn möglich vermeiden sollte wollte ich das mit einer Referenz machen</p>
<pre><code class="language-cpp">funktion2(int&amp; array[])...
</code></pre>
<p>aber leider bekomme ich das nicht hin.</p>
<p>Wäre nett wenn mir jemand helfen könnte und vielleicht auch noch erklären kann wieso man auf globale Variablen verzichten sollte <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>
<p>Vielen Dank</p>
<p>Gruß Zaus</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/269125/array-als-referenz</link><generator>RSS for Node</generator><lastBuildDate>Mon, 31 Aug 2026 10:00:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/269125.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 19 Jun 2010 14:07:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Array als Referenz on Sat, 19 Jun 2010 14:07:17 GMT]]></title><description><![CDATA[<p>Hallo<br />
ist es möglich einen Array als Referenz zu übergeben?<br />
Ich habe 2 Funktionen. In Funktion1 wird irgendwann Funktion2 aufgerufen. Dort soll dann ein int array[20] verändert werden. Nachher soll auf diesen Vektor dann in Funktion1 zugegriffen werden.<br />
Da ich gelesen habe, dass man globale Variablen wenn möglich vermeiden sollte wollte ich das mit einer Referenz machen</p>
<pre><code class="language-cpp">funktion2(int&amp; array[])...
</code></pre>
<p>aber leider bekomme ich das nicht hin.</p>
<p>Wäre nett wenn mir jemand helfen könnte und vielleicht auch noch erklären kann wieso man auf globale Variablen verzichten sollte <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>
<p>Vielen Dank</p>
<p>Gruß Zaus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914750</guid><dc:creator><![CDATA[Zaus]]></dc:creator><pubDate>Sat, 19 Jun 2010 14:07:17 GMT</pubDate></item><item><title><![CDATA[Reply to Array als Referenz on Sat, 19 Jun 2010 14:09:59 GMT]]></title><description><![CDATA[<p>Klammerung!</p>
<pre><code class="language-cpp">void dings_intern(int *const zeiger, size_t n)
{
  ...
}

template&lt;size_t N&gt;
inline void dings(int (&amp;arrayref)[N])
{
  dings_intern(arrayref,N);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1914754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914754</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 19 Jun 2010 14:09:59 GMT</pubDate></item><item><title><![CDATA[Reply to Array als Referenz on Sat, 19 Jun 2010 14:38:11 GMT]]></title><description><![CDATA[<p>Ok mit der richtigen Klammerung kompiliert er es jetzt, wobei ich sagen muss, dass ich das meiste von deinem Code nicht versehe <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>
<p>Was mir auffällt: Wenn ich die Werte im Array in Funktion2 1 mal ändere kann ich die so später auch in Funktion 1 auslesen, wenn ich allerdings die werte in funktion2 ändere und später nochmal überschreibe so funktioniert das überschreiben irgendwie nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914773</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914773</guid><dc:creator><![CDATA[Zaus]]></dc:creator><pubDate>Sat, 19 Jun 2010 14:38:11 GMT</pubDate></item><item><title><![CDATA[Reply to Array als Referenz on Sat, 19 Jun 2010 17:15:42 GMT]]></title><description><![CDATA[<p>Also ich hab einfach noch die Klammern in meinen Code eingefügt.</p>
<pre><code>funktion2(int (&amp;array)[])
</code></pre>
<p>Dann kam das Problem mit dem überschreiben.</p>
<p>Ich häng hier gleich noch ne Frage dran:<br />
Gibt es einen Geschwindikeitsunterschied zwischen:<br />
1. Eine Funktion die einen int erhält und einen string zurückgibt</p>
<pre><code class="language-cpp">string funktion(int b)
{
   if (b&gt;5)
   {
      return &quot;ja&quot;;
   else
   {
      return &quot;nein&quot;;
   }
}
</code></pre>
<p>2. den String vorher zu deklarieren und dann per Referenz an die Funktion zu übergeben in der er dann verändert wird.</p>
<p>Gruß Zaus</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914837</guid><dc:creator><![CDATA[Zaus]]></dc:creator><pubDate>Sat, 19 Jun 2010 17:15:42 GMT</pubDate></item><item><title><![CDATA[Reply to Array als Referenz on Sat, 19 Jun 2010 17:25:24 GMT]]></title><description><![CDATA[<p>Sry für den 3. post in Folge aber leider hab ich mich immer noch nicht registriert...<br />
Das erste Problem hat sich erledigt, bleibt nur noch die Frage nach der Geschwindigkeit <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/1914839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914839</guid><dc:creator><![CDATA[Zaus]]></dc:creator><pubDate>Sat, 19 Jun 2010 17:25:24 GMT</pubDate></item><item><title><![CDATA[Reply to Array als Referenz on Sat, 19 Jun 2010 17:53:11 GMT]]></title><description><![CDATA[<p>Das hängt davon ab, ob dein Compiler (N)RVO, eine Optimierung bei Rückgabewerten, kennt. Falls nein, muss der <code>std::string</code> unnötigerweise zwei Male kopiert werden: Einmal bei der <code>return</code> -Anweisung und einmal bei der Initialisierung <code>std::string s = funktion()</code> . In dem Falle wäre die Referenz sicher schneller.</p>
<p>Aber moderne Compiler sollten diese Technik eigentlich beherrschen. Mach dir um die Geschwindigkeit bei solchen Dingen nicht zu viele Gedanken, meistens hast du andere Probleme. Achte lieber auf ein schönes Schnittstellendesign. Denn dass der Benutzer statt</p>
<pre><code class="language-cpp">tuwas(funktion());
</code></pre>
<p>nun</p>
<pre><code class="language-cpp">std::string s;
funktion(s);
tuwas(s);
</code></pre>
<p>schreiben muss, ist eventuell auch nicht das Wahre.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1914851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914851</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 19 Jun 2010 17:53:11 GMT</pubDate></item><item><title><![CDATA[Reply to Array als Referenz on Sat, 19 Jun 2010 18:09:59 GMT]]></title><description><![CDATA[<p>Zaus schrieb:</p>
<blockquote>
<p>Gibt es einen Geschwindikeitsunterschied zwischen:<br />
1. Eine Funktion die einen int erhält und einen string zurückgibt</p>
<pre><code class="language-cpp">string funktion(int b)
{
   if (b&gt;5)
   {
      return &quot;ja&quot;;
   else
   {
      return &quot;nein&quot;;
   }
}
</code></pre>
<p>2. den String vorher zu deklarieren und dann per Referenz an die Funktion zu übergeben in der er dann verändert wird.</p>
</blockquote>
<p>Das macht keinen Unterschied. Es macht höchstens einen Unterschied, wenn das String-Objekt vorher schon Speicher für die Zeichenkette reserviert hatte, welcher dann wieder verwendet werden kann:</p>
<pre><code class="language-cpp">void funk(int b, string &amp; out);

int main()
{
  string temp;
  ...
  // temp-Objekt wird verwendet und behält Speicher
  ...
  funk(3,temp);
}
</code></pre>
<p>Wenn dann in funk die Zuweisung stattfindet und in <code>out</code> schon genügend Speicher besitzt, sollte es ganz flott gehen. Das, was typischerweise am meisten Zeit kostet, ist das Reservieren/Freigeben von Freispeicher. string verwendet den Freispeicher für die Zeichenketten.</p>
<p>Alternativ kannst Du aber auch das hier schreiben:</p>
<pre><code class="language-cpp">char const* funk(int b)
{
  return (b&gt;5) ? &quot;ja&quot; : &quot;nein&quot;;
}
</code></pre>
<p>und es später bei Bedarf den Zeiger in ein string-Objekt verwandeln. Das klappt hier zumindest so, weil &quot;ja&quot; und &quot;nein&quot; String-Literale sind, die nicht dynamisch angelegt werden, sondern char-Arrays mit statischer Lebenszeit sind.</p>
<p>Wenn Du deine Funktion nicht 1000000mal in einer inneren Schleife aufrufen willst, sollte das alles nicht so wichtig sein. Es ist aber natürlich von Vorteil zu wissen, was da hinter'm Vorhang so passiert. Das Initialisieren und Kopieren von string-Objekten kostet eben etwas Zeit. Manchmal braucht man keine Kopie, wie zB hier:</p>
<pre><code class="language-cpp">bool dings(string s)
{
  return !s.empty() &amp;&amp; s[0]=='x';
}
</code></pre>
<p>Wenn ich diese Funktion so aufrufe:</p>
<pre><code class="language-cpp">string t = &quot;123&quot;;
cout &lt;&lt; dings(t);
</code></pre>
<p>dann wird <code>s</code> eine lokale Kopie des string-Objekts <code>t</code> sein. Das muss nicht sein. Daher kann man auch schreiben:</p>
<pre><code class="language-cpp">bool dings(string const &amp; s)
{
  return !s.empty() &amp;&amp; s[0]=='x';
}
</code></pre>
<p>Aber pass-by-value ist auch nicht perse schlecht. Wenn man eine lokale Kopie braucht, ist das schon praktisch:</p>
<pre><code class="language-cpp">string rueckwaerts(string s)
{
  std::reverse(s.begin(),s.end());
  string ret;
  ret.swap(s);
  return ret;
}
</code></pre>
<p>Für einen Compiler, der unnötige Kopien wegoptimieren kann, ist diese Fassung von &quot;rueckwaerts&quot; optimal für eine Funktion die einen string bekommt und wieder einen zurückgeben soll.</p>
<p>Ohh, bin wohl abgeschweift... <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1914856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914856</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 19 Jun 2010 18:09:59 GMT</pubDate></item><item><title><![CDATA[Reply to Array als Referenz on Sat, 19 Jun 2010 18:40:57 GMT]]></title><description><![CDATA[<p>Vielen Dank, ist echt super wie schnell und ausführlich man hier Antworten bekommt.<br />
Also in der Schleife wird die angesprochene Funktion bis zu 10.000 mal aufgerufen. Da daraus &quot;in Echtzeit&quot; Daten für eine Steuerung generiert werden müssen ist es sehr wichtig, dass es da zu keinen Verzögerungen kommt. Verwendet wird dabei Visual Studio 2005. Kommt dort (N)RVO zum Einsatz?</p>
<p>Kennt sich einer von euch zufällig auch mit XML-Parsern aus und kann mir sagen wie groß bei über 1000 Aufrufen um eine XML-Datei nach einem bestimmten Attribut zu durchsuchen der Zeitunterschied zwischen TinyXML und RapidXML ist? Würde mir die Arbeit ersparen das selbst auszutesten <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/1914866</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1914866</guid><dc:creator><![CDATA[Zaus]]></dc:creator><pubDate>Sat, 19 Jun 2010 18:40:57 GMT</pubDate></item></channel></rss>