<?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[2Dimensionales dynamisches Array - Pointer zu einem Array - wie von Funktion retournieren?]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe ein 2Dimensionales dynamisches Array.<br />
Folgender Code in der Funktion:</p>
<pre><code>char (*cds)[81] = 0; //pointer auf ein array mit 81 chars
cds = new char [2][81];
</code></pre>
<p>Aber wie kann ich diesen Pointer cds nun retournieren? So funktionierts nämlich nicht:</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

char(*)[] erstellen(char (*cds)[81])
{
  char (*cds)[81] = 0;
  cds = new char [2][81];
  return cds;
}

int main()
{
  char (*dvds)[81] = 0;
  dvds = erstellen(dvds);

  return 0;
}
</code></pre>
<p>Weiß hier jemand bescheid? Ich wäre sehr sehr dankbar <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/topic/325618/2dimensionales-dynamisches-array-pointer-zu-einem-array-wie-von-funktion-retournieren</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Jul 2026 04:09:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/325618.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 10 May 2014 16:13:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 2Dimensionales dynamisches Array - Pointer zu einem Array - wie von Funktion retournieren? on Sat, 10 May 2014 16:13:37 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe ein 2Dimensionales dynamisches Array.<br />
Folgender Code in der Funktion:</p>
<pre><code>char (*cds)[81] = 0; //pointer auf ein array mit 81 chars
cds = new char [2][81];
</code></pre>
<p>Aber wie kann ich diesen Pointer cds nun retournieren? So funktionierts nämlich nicht:</p>
<pre><code>#include &lt;iostream&gt;
using namespace std;

char(*)[] erstellen(char (*cds)[81])
{
  char (*cds)[81] = 0;
  cds = new char [2][81];
  return cds;
}

int main()
{
  char (*dvds)[81] = 0;
  dvds = erstellen(dvds);

  return 0;
}
</code></pre>
<p>Weiß hier jemand bescheid? Ich wäre sehr sehr dankbar <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/2398487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398487</guid><dc:creator><![CDATA[Frank92]]></dc:creator><pubDate>Sat, 10 May 2014 16:13:37 GMT</pubDate></item><item><title><![CDATA[Reply to 2Dimensionales dynamisches Array - Pointer zu einem Array - wie von Funktion retournieren? on Sat, 10 May 2014 17:31:21 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;string&gt;

int main()
{
  std::vector&lt;std::string&gt; &gt; dvds;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2398505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398505</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sat, 10 May 2014 17:31:21 GMT</pubDate></item><item><title><![CDATA[Reply to 2Dimensionales dynamisches Array - Pointer zu einem Array - wie von Funktion retournieren? on Sat, 10 May 2014 18:49:05 GMT]]></title><description><![CDATA[<p>bin schon draufgekommen - falls es jemand braucht ...<br />
ich retourniere einfach nichts sondern übergebe per referenz an die funktion:</p>
<pre><code>void erstellen(char (*&amp;cds)[81])
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2398516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398516</guid><dc:creator><![CDATA[Frank92]]></dc:creator><pubDate>Sat, 10 May 2014 18:49:05 GMT</pubDate></item><item><title><![CDATA[Reply to 2Dimensionales dynamisches Array - Pointer zu einem Array - wie von Funktion retournieren? on Sat, 10 May 2014 19:04:35 GMT]]></title><description><![CDATA[<p>Falls es jemand brauchen sollte, wäre manni66s Lösung aber besser.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2398521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398521</guid><dc:creator><![CDATA[patrick246]]></dc:creator><pubDate>Sat, 10 May 2014 19:04:35 GMT</pubDate></item><item><title><![CDATA[Reply to 2Dimensionales dynamisches Array - Pointer zu einem Array - wie von Funktion retournieren? on Sat, 10 May 2014 19:06:38 GMT]]></title><description><![CDATA[<p>Frank92 schrieb:</p>
<blockquote>
<pre><code>void erstellen(char (*&amp;cds)[81])
</code></pre>
</blockquote>
<p>Willst Du &quot;richtiges&quot; C++ lernen (so wie man es benutzen sollte), oder willst du einfach nur, dass Dein Compiler Dein Programm akzeptiert? Falls ersteres, dann lass Dich doch bitte nochmal stark von der ersten Antwort inspirieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2398522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398522</guid><dc:creator><![CDATA[kkaw]]></dc:creator><pubDate>Sat, 10 May 2014 19:06:38 GMT</pubDate></item><item><title><![CDATA[Reply to 2Dimensionales dynamisches Array - Pointer zu einem Array - wie von Funktion retournieren? on Sat, 10 May 2014 19:06:46 GMT]]></title><description><![CDATA[<p>Und es heißt nicht retournieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2398523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398523</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 10 May 2014 19:06:46 GMT</pubDate></item><item><title><![CDATA[Reply to 2Dimensionales dynamisches Array - Pointer zu einem Array - wie von Funktion retournieren? on Sat, 10 May 2014 19:16:57 GMT]]></title><description><![CDATA[<p>Wenn du unbedingt willst:</p>
<pre><code class="language-cpp">char (*erstellen())[81] { ... }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2398524</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398524</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Sat, 10 May 2014 19:16:57 GMT</pubDate></item><item><title><![CDATA[Reply to 2Dimensionales dynamisches Array - Pointer zu einem Array - wie von Funktion retournieren? on Sat, 10 May 2014 19:39:38 GMT]]></title><description><![CDATA[<p>kkaw schrieb:</p>
<blockquote>
<p>Willst Du &quot;richtiges&quot; C++ lernen (so wie man es benutzen sollte), oder willst du einfach nur, dass Dein Compiler Dein Programm akzeptiert? Falls ersteres, dann lass Dich doch bitte nochmal stark von der ersten Antwort inspirieren.</p>
</blockquote>
<p>Alles klar vielen Dank! Wir machen in der Lehrveranstaltung nur leider keine Vectoren, deshalb dachte ich, ich darf diese für die Hausaufgabe auch nicht verwenden. Wenn es aber allgemein so gemacht wird, werde ich mir das auf jedsten mal ansehen! <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/2398525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398525</guid><dc:creator><![CDATA[Frank92]]></dc:creator><pubDate>Sat, 10 May 2014 19:39:38 GMT</pubDate></item><item><title><![CDATA[Reply to 2Dimensionales dynamisches Array - Pointer zu einem Array - wie von Funktion retournieren? on Sun, 11 May 2014 02:20:29 GMT]]></title><description><![CDATA[<p>Typedefs sind bei solchen Syntaxverrenkungen (das wird mit Funktionszeigern noch unübersichtlicher) ausgesprochen hilfreich. In diesem Fall</p>
<pre><code class="language-cpp">typedef char sinnvoller_name[81];

sinnvoller_name *erstellen() { ... }
</code></pre>
<p>Übrigens:</p>
<p>Frank92 schrieb:</p>
<blockquote>
<p>Wir machen in der Lehrveranstaltung nur leider keine Vectoren, (...)</p>
</blockquote>
<p>Das (und das Hantieren mit nacktem new/delete) kann als Warnsignal gelten. Womöglich bringt man euch C mit Klassen bei statt ordentlichem C++, weil das Skript von (gefühlt) 1995 ist und es seither niemand überarbeitet hat.</p>
<p>Derartige Lehrveranstaltungen sind so unschön wie häufig. Problematisch ist vor allem, dass man sich mit damit schlechte Angewohnheiten aneignet, die man später mühsam wieder loswerden muss.</p>
<p>Hier zum Beispiel -- korrigier mich, wenn ich das falsch einschätze -- scheint es so zu sein, dass euch C-Strings (char*) vor C++-Strings (std::string), nacktes new[]/delete[] vor Standard-Containern (std::vector, std::deque und derlei) und nacktes new/delete ohne Erwähnung von Smart-Pointern beigebracht wird, was den unangenehmen Effekt haben kann, dass selbst wenn später die besonders für Anfänger besseren Wege eingeführt werden, sie in den Köpfen der Vorlesungsteilnehmer nicht als Default-Vorgehensweise drinstecken. Stattdessen wenden sie am Ende routinemäßig die Dinge an, die sie zuerst gelernt haben, und das häufig ohne ein ausgeprägtes Verständnis dafür, wie viel Ärger sie sich mit dieser Vorgehensweise einhandeln, weil die Gefahren (insbesondere Exceptions) erst ein halbes Jahr später gegen Vorlesungsende erwähnt wurden.</p>
<p>Ich erwähne Exceptions ausdrücklich, weil ein großer Anteil der haarraufigen Probleme, die man sich mit der C++-ist-doch-nur-C-mit-mehr-Features-Herangehensweise einhandelt, mit Exceptions und Exceptionsicherheit zusammenhängt. Exceptions sind ein Fehlerbehandlungsmechanismus, der eigentlich in allen Lehrveranstaltungen ganz weit vorne auftauchen sollte, es aber frustrierend selten tut. Grob umrissen: man kann zu beliebigen Zeiten (üblicherweise, wenn eine Ausnahmesituation auftritt, die nicht sofort bereinigt werden kann) eine sog. Exception werfen, die dann den Call-Stack hoch an allem Code vorbeifliegt, der normalerweise ausgeführt würde, bis sich jemand zuständig fühlt und sie behandelt. Das sieht etwa so aus:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;stdexcept&gt;

void inner_function() {
  std::cout &lt;&lt; &quot;inner start\n&quot;;
  throw std::logic_error(&quot;42&quot;); // &lt;-- geworfen werden kann alles mögliche. std::logic_error ist ein Typ
                                // aus der Standardbibliothek, der zum Melden von Fehlern in der Programmlogik
                                // vorgesehen ist (die Definition ist leider interpretierbar, aber naja).
                                // In der Praxis bietet es sich an, von std::logic_error eigene Fehlerklassen
                                // abzuleiten und die zu benutzen, damit man Fehler leichter auseinanderhalten kann.
                                // Wenn dir &quot;ableiten&quot; nichts sagt, mach dir keinen Kopf darum, das kriegt ihr noch
                                // und es ist hierfür erstmal nicht wichtig.
  std::cout &lt;&lt; &quot;inner end\n&quot;;
}

void outer_function() {
  std::cout &lt;&lt; &quot;outer start\n&quot;;
  inner_function();
  std::cout &lt;&lt; &quot;outer end\n&quot;;
}

int main() {
  try {
    std::cout &lt;&lt; &quot;try start\n&quot;;
    outer_function();
    std::cout &lt;&lt; &quot;try end\n&quot;;
  } catch(std::logic_error const &amp;e) { // &lt;-- fühlt sich für fliegende std::logic_errors zuständig.
    // e.what() ist die Nachricht, die wir dem logic_error oben mitgegeben haben.
    std::cout &lt;&lt; e.what() &lt;&lt; '\n';
  }

  std::cout &lt;&lt; &quot;main end\n&quot;;
}
</code></pre>
<p>führt zur Ausgabe</p>
<pre><code>try start
outer start
inner start
42
main end
</code></pre>
<p>Vom Vorbeifliegen ausgenommen (d. h. trotzdem ausgeführt) werden spezielle Funktionen, sog. Destruktoren, die ihr hoffentlich behandeln werdet, wenn ihr Klassen durchnehmt. Für den Moment sei genug, dass an komplexe Datentypen spezielle Aufräumroutinen rangebappt werden können, die automatisch ausgeführt werden, wenn ein Objekt dieses Datentyps seinen Gültigkeitsbereich verlässt, selbst wenn das durch eine fliegende Exception passiert. Diese benutzen std::string, alle Standardcontainer, alle Smart-Pointer und alles andere, was Ressourcen verwaltet, um sicherzustellen, dass Dinge, die in jedem Fall noch getan werden müssen -- meistens das Freigeben der verwalteten Ressource -- auch wirklich getan werden, ohne dass der Programmierer dafür jedes mal komische Klimmzüge machen muss.</p>
<p>Kurzum, folgenden Umstand solltest du im Hinterkopf behalten:</p>
<pre><code class="language-cpp">void tue_etwas(char *buf, std::size_t buflen) {
  throw std::logic_error(&quot;Etwas ist schief gegangen. Das tut uns Leid.&quot;);
}

void falscher_weg() {
  std::size_t n = laenge_bestimmen();
  char *buffer = new char[n];

  tue_etwas(buffer, n);

  delete[] buffer; // &lt;-- das hier wird nie ausgeführt.
}

int main() {
  try {
    falscher_weg();
  } catch(std::logic_error const &amp;e) {
    std::cout &lt;&lt; e.what() &lt;&lt; std::endl;
  }
}
</code></pre>
<p>und</p>
<pre><code class="language-cpp">void tue_etwas(std::string &amp;s) {
  throw std::logic_error(&quot;Etwas ist schief gegangen. Das tut uns Leid.&quot;);
}

void richtiger_weg() {
  std::string buffer = irgendeine_initialisierung();
  tue_etwas(buffer);
} // &lt;-- std::string hat einen Destruktor, der hier aufgerufen wird und 
  // buffer wegräumt. Yay!

int main() {
  try {
    richtiger_weg();
  } catch(std::logic_error const &amp;e) {
    std::cout &lt;&lt; e.what() &lt;&lt; std::endl;
  }
}
</code></pre>
<p>Dies ist der Hauptgrund, aus dem man C++-Code nicht so schreiben kann wie C-Code, ohne Cthulhu aufzuwecken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2398561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398561</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sun, 11 May 2014 02:20:29 GMT</pubDate></item><item><title><![CDATA[Reply to 2Dimensionales dynamisches Array - Pointer zu einem Array - wie von Funktion retournieren? on Sun, 11 May 2014 13:30:31 GMT]]></title><description><![CDATA[<p>seldon schrieb:</p>
<blockquote>
<p>Hier zum Beispiel -- korrigier mich, wenn ich das falsch einschätze -- scheint es so zu sein, dass euch C-Strings (char*) vor C++-Strings (std::string), nacktes new[]/delete[] vor Standard-Containern (std::vector, std::deque und derlei) und nacktes new/delete ohne Erwähnung von Smart-Pointern beigebracht wird, [...]</p>
</blockquote>
<p>Die Lehrveranstaltung heißt zwar &quot;Einführung in C++&quot;, aber sogar ein Bekannter von mir hat schonmal gemeint ob ich nicht eher C lerne.<br />
Und du hast recht, es gibt in der Vorlesung keine C++ Strings und auch keine Vectoren. Es ist sowieso eine sehr merkwürdige Lehrveranstaltung, bei den Tests muss man innerhalb von zwei Minuten rekursive Funktionen auslesen welche char Arrays verändern. Und sobald man einen Buchstaben falsch ausgegeben hat (was bei dem Zeitdruck ja doch vorkommen kann), kann man den Punkt beim Test vergessen. Danach gibt es immer Rätselaufgaben ... aber egal.</p>
<p>Vielen vielen Dank für die Hilfe! Mir ist mit euren Antworten wirklich sehr geholfen <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="🙂"
    /><br />
LG Frank92</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2398626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2398626</guid><dc:creator><![CDATA[Frank92]]></dc:creator><pubDate>Sun, 11 May 2014 13:30:31 GMT</pubDate></item></channel></rss>