<?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[Speicherplatz in Hauptprogramm für Routine aus DLL reservieren]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich möchte eine Routine aus einer DLL nutzen und stehe auf dem Schlauch was die Speicherzuweisung der Strings im Hauptprogramm betrifft.</p>
<p>Auszug aus DLL:</p>
<pre><code>typedef unsigned char *PChar;
typedef PChar *StringParam[100];

DLLEXPORT void _stdcall CCalculateEx(double *PInput, double *POutput, double *PUser, StringParam PStrings)
{
sprintf((char*)PChar(PStrings[0]), &quot;%s&quot;, &quot;Test&quot;);
}
</code></pre>
<p>Auszug aus aufrufendem Programm:</p>
<pre><code>typedef int (_stdcall *RunRoutine)(double[100],double[100], double[100], ???);

int main()
{
double PInput[100];
double POutput[100];
double PUser[100];

HMODULE hDll;
hDll = LoadLibrary(&quot;MYLib.dll&quot;);

RunRoutine goRun;

goRun = (RunRoutine)GetProcAddress(hDll,&quot;CCalculateEx&quot;);
goRun(PInput, POutput, PUser, ???);
}
</code></pre>
<p>Die PStrings in der DLL benötigt letztendlich Speicherplatz für 100 Strings a 1000 Zeichen.<br />
Es wird doch ein 2D Array benötigt, auf den über Pointer verwiesen wird? Nur wie genau? Ich wäre dankbar, wenn mir jemand erklären könnte, wie ich den Strings aus der DLL den benötigten Speicherplatz zuweise.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/324781/speicherplatz-in-hauptprogramm-für-routine-aus-dll-reservieren</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Jul 2026 06:16:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/324781.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 01 Apr 2014 14:29:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherplatz in Hauptprogramm für Routine aus DLL reservieren on Tue, 01 Apr 2014 14:29:48 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich möchte eine Routine aus einer DLL nutzen und stehe auf dem Schlauch was die Speicherzuweisung der Strings im Hauptprogramm betrifft.</p>
<p>Auszug aus DLL:</p>
<pre><code>typedef unsigned char *PChar;
typedef PChar *StringParam[100];

DLLEXPORT void _stdcall CCalculateEx(double *PInput, double *POutput, double *PUser, StringParam PStrings)
{
sprintf((char*)PChar(PStrings[0]), &quot;%s&quot;, &quot;Test&quot;);
}
</code></pre>
<p>Auszug aus aufrufendem Programm:</p>
<pre><code>typedef int (_stdcall *RunRoutine)(double[100],double[100], double[100], ???);

int main()
{
double PInput[100];
double POutput[100];
double PUser[100];

HMODULE hDll;
hDll = LoadLibrary(&quot;MYLib.dll&quot;);

RunRoutine goRun;

goRun = (RunRoutine)GetProcAddress(hDll,&quot;CCalculateEx&quot;);
goRun(PInput, POutput, PUser, ???);
}
</code></pre>
<p>Die PStrings in der DLL benötigt letztendlich Speicherplatz für 100 Strings a 1000 Zeichen.<br />
Es wird doch ein 2D Array benötigt, auf den über Pointer verwiesen wird? Nur wie genau? Ich wäre dankbar, wenn mir jemand erklären könnte, wie ich den Strings aus der DLL den benötigten Speicherplatz zuweise.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392178</guid><dc:creator><![CDATA[Barnaby]]></dc:creator><pubDate>Tue, 01 Apr 2014 14:29:48 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherplatz in Hauptprogramm für Routine aus DLL reservieren on Tue, 01 Apr 2014 15:12:39 GMT]]></title><description><![CDATA[<p>Spricht was gegen einen passend dimensionierten <code>vector&lt;array&lt;char, 1000&gt;&gt;</code> bzw. ein statisches <code>array&lt;array&lt;char, 1000&gt;, 100&gt;</code> ?</p>
<p>Das Ganze kommt mir übrigens nicht sehr gut gemacht vor. Ist die aufgerufene Routine von dir geschrieben? Ich habe doch gesunde Zweifel, dass die &quot;100&quot; und die &quot;1000&quot; tatsächlich für die Funktionalität wichtig sind und nicht einfach nur für &quot;große Zahl&quot; stehen. Es wäre vermutlich sehr viel besser, die Länge der Felder als Parameter mit an die Funktion zu geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392187</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 01 Apr 2014 15:12:39 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherplatz in Hauptprogramm für Routine aus DLL reservieren on Tue, 01 Apr 2014 15:42:08 GMT]]></title><description><![CDATA[<p>Danke für deine Antwort.<br />
Die aufgerufene Routine stammt nicht von mir. Die DLL wird eigentlich in ein Elektroniksimulationsprogramm eingebunden. 100 ist die maximale Anzahl an Ein/Ausgängen und 1000 die maximale Länge der Strings, welches das Programm vorgibt.</p>
<blockquote>
<p>Spricht was gegen einen passend dimensionierten vector&lt;array&lt;char, 1000&gt;&gt; bzw. ein statisches array&lt;array&lt;char, 1000&gt;, 100&gt;?</p>
</blockquote>
<p>Ich glaube dagegen spricht nichts, wahrscheinlich tue ich mich nur bei der Erstellung schwer <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
Hättest du noch kurz ein Code-Beispiel dafür? - Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392191</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392191</guid><dc:creator><![CDATA[Barnaby]]></dc:creator><pubDate>Tue, 01 Apr 2014 15:42:08 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherplatz in Hauptprogramm für Routine aus DLL reservieren on Tue, 01 Apr 2014 19:22:10 GMT]]></title><description><![CDATA[<p>vector/array kennst du aber, oder? Wenn nicht: Unbedingt mal ein gutes C++-Buch schnappen. Das ist <strong>wichtig</strong>!</p>
<p>Ansonsten:</p>
<pre><code>array&lt;array&lt;char, 1000&gt;, 100&gt; foo;
// bzw.
vector&lt;array&lt;char, 1000&gt;&gt; bar(100);
</code></pre>
<p>Natürlich nach Einbindung der entsprechenden Header und ggf. mit expliziter Angabe des Namespaces <code>std</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392222</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 01 Apr 2014 19:22:10 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherplatz in Hauptprogramm für Routine aus DLL reservieren on Wed, 02 Apr 2014 14:14:03 GMT]]></title><description><![CDATA[<p>Hallo SeppJ,</p>
<p>so in etwa habe ich es schon probiert aber es funktioniert beides nicht.</p>
<p>Ich habe die Funktion aus der DLL jetzt mal sinngemäß übernommen und in ein eigenes Projekt kopiert.</p>
<p>Die übergebende Variable scheint nicht die korrekte Form zu besitzen.</p>
<p>Ein Beispiel:</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;array&gt;
#include &lt;windows.h&gt;
#include &lt;string.h&gt;
#include &lt;stddef.h&gt;
#include &lt;stdio.h&gt;

using namespace std;

typedef unsigned char *PChar;
typedef PChar *StringParam[100];

double PArray[100];

void copy(double *PUser, StringParam PStrings)
{
	sprintf((char*)PChar(PStrings[0]), &quot;%s&quot;, &quot;a&quot;);
}

int main()
{

vector&lt;array&lt;char, 1000&gt;&gt; bar(100);
array&lt;array&lt;char, 1000&gt;, 100&gt; foo;

copy(PArray, bar);

return 0;
}
</code></pre>
<p>Fehler: \src\ArrayVector.cpp:30:17: error: no matching function for call to 'copy(double [100], std::vector&lt;std::array&lt;char, 1000u&gt; &gt;&amp;)'</p>
<p>Hast du noch eine Idee wie die Übergabe korrekt auszusehen hat?</p>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392372</guid><dc:creator><![CDATA[Barnaby]]></dc:creator><pubDate>Wed, 02 Apr 2014 14:14:03 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherplatz in Hauptprogramm für Routine aus DLL reservieren on Wed, 02 Apr 2014 16:07:30 GMT]]></title><description><![CDATA[<p>Du musst natürlich nicht das vector-Objekt selbst übergeben (das ist eine komplexe Klasse, mit der der C-Code nix anfangen kann), sondern einen Zeiger auf die Daten, die der vector verwaltet.</p>
<p>Also zum Beispiel</p>
<pre><code>copy(PArray, reinterpret_cast&lt;StrinParam&gt;(bar.data()));
// oder
copy(PArray, reinterpret_cast&lt;StrinParam&gt;(foo.data()));
// oder
copy(PArray, reinterpret_cast&lt;StrinParam&gt;(&amp;bar[0]));
// oder
copy(PArray, reinterpret_cast&lt;StrinParam&gt;(&amp;foo[0]));
</code></pre>
<p>Ich hoffe, ich habe bei all dem Gepointere jetzt nichts falsch gemacht bei den Typen. Ich kann den Code gerade nicht vernünftig testen und programmiere im Kopf. Was bei so vielen Verschachtelungen schon leicht verwirrend ist <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/2392401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392401</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 02 Apr 2014 16:07:30 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherplatz in Hauptprogramm für Routine aus DLL reservieren on Wed, 02 Apr 2014 16:48:20 GMT]]></title><description><![CDATA[<p>Danke für deine Geduld!</p>
<p>Leider kommt es immer zu einem invalid cast Error:</p>
<pre><code>invalid cast from type 'std::array&lt;std::array&lt;char, 1000u&gt;, 100u&gt;::pointer {aka std::array&lt;char, 1000u&gt;*}' to type 'StringParam {aka unsigned char** [100]}'
</code></pre>
<p>hier am Beispiel von:</p>
<pre><code>array&lt;array&lt;char, 1000&gt;, 100&gt; foo;
copy(PArray, reinterpret_cast&lt;StringParam&gt;(foo.data()));
</code></pre>
<p>Ich habe versucht es noch mit array&lt;array&lt;unsigned char, 100&gt;, 1000&gt; foo; etc versucht aber Änderungen in der Form haben es auch nicht gebracht.</p>
<p>Könntest du bitte noch mal drüber schauen?</p>
<p>Wäre es eigentlich auch möglich den Array durch char Array[100][1000] zu erstellen, und dann über zwei Pointer darauf zu zeigen und diese dann an die DLL-Routine zu übergeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392407</guid><dc:creator><![CDATA[Barnaby]]></dc:creator><pubDate>Wed, 02 Apr 2014 16:48:20 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherplatz in Hauptprogramm für Routine aus DLL reservieren on Wed, 02 Apr 2014 22:48:15 GMT]]></title><description><![CDATA[<p>Argh! Ja ich hab's falsch rum gemacht. Deine Funktion will ja 100 Zeiger auf Zeiger auf unsigned char, nicht einen Zeiger auf 100 Zeiger auf unsigned char. Das macht immer weniger Sinn, aber wenn's so vorgegeben ist, dann ist das eben so.</p>
<p>Jedenfalls muessen wir bei so einer Struktur tatsaechlich mit ein paar haerteren Mitteln ran und uns den Speicher manuell besorgen:</p>
<pre><code>#include &lt;cstdio&gt;

typedef unsigned char Pchar;
typedef Pchar *StringParam[100];

void test(double *values, StringParam strings)
{
  for(unsigned i = 0; i &lt; 100; ++i)
    sprintf((char*) strings[i], &quot;Blah: %f\n&quot;, values[i]);
}

#include &lt;cstddef&gt;
#include &lt;algorithm&gt;
// Wrapper around a C-style list of lists (T**)
// but with static inner dimension. Makes no sense
// (why not use an array?) but is needed by external
// library function.
template&lt;typename T&gt; class List_of_Lists
{
private:
  std::size_t outer;
  std::size_t inner;
  T** internal_data;
public:
  List_of_Lists(std::size_t outer, std::size_t inner):
    outer(outer), inner(inner), internal_data(new T*[outer]())
  {
    try
      {
        for(std::size_t i = 0; i &lt; outer; ++i)
          {
            internal_data[i] = new T[inner];
          }
      }
    catch (...)
      {
        for(std::size_t i = 0; i &lt; outer; ++i)
          delete[] internal_data[i];       
        delete[] internal_data;
        throw;
      }
  }

  ~List_of_Lists()
  {
    for(std::size_t i = 0; i &lt; outer; ++i)
      delete[] internal_data[i];       
    delete[] internal_data;
  }

  List_of_Lists(const List_of_Lists&amp; other):
    outer(other.outer),
    inner(other.inner),
    internal_data(new T*[outer]())
  {
    try
      {
        for(std::size_t i = 0; i &lt; outer; ++i)
          {
            internal_data[i] = new T[inner];
            std::copy(other.internal_data[i], 
                      other.internal_data[i] + inner, 
                      internal_data[i]);
          }
      }
    catch (...)
      {
        for(std::size_t i = 0; i &lt; outer; ++i)
          delete[] internal_data[i];       
        delete[] internal_data;
        throw;
      }
  }

  List_of_Lists&amp; operator=(List_of_Lists other)
  {
    std::swap(other.inner, inner);
    std::swap(other.outer, outer);
    std::swap(other.internal_data, internal_data);
    return *this;
  }

  T** data() { return internal_data; }
  const T* operator[](std::size_t index) const { return internal_data[index]; }
  T* operator[](std::size_t index) { return internal_data[index]; }
};

#include &lt;iostream&gt;
#include &lt;vector&gt;
int main()
{
  std::vector&lt;double&gt; bar(100);
  for(int i = 0; i &lt; 100; ++i) bar[i] = 25.37326 * i + 7.4747;

  List_of_Lists&lt;unsigned char&gt; strings(100, 1000);
  test(bar.data(), strings.data());

  for(int i = 0; i &lt; 100; ++i) std::cout &lt;&lt; strings[i];
}
</code></pre>
<p>Diese Mal ist es auch getestet, dass es tatsaechlich funktioniert <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>Move constructor und move assignment spare ich mir mal, das moege man sich bei Bedarf selber implementieren. Wahrscheinlich werden selbst der Kopierkonstruktor und der Zuweisungsoperator hier nie benutzt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392470</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 02 Apr 2014 22:48:15 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherplatz in Hauptprogramm für Routine aus DLL reservieren on Wed, 02 Apr 2014 23:37:15 GMT]]></title><description><![CDATA[<p>Etwas modifiziert um Code-Duplication und das phöse re-throw zu vermeiden:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class List_of_Lists_Base
{
protected:
	std::vector&lt;T*&gt; internal_data;

	explicit List_of_Lists_Base(std::size_t outer)
		: internal_data(outer) {}

	~List_of_Lists_Base()
	{
		for (auto p : internal_data)
			delete[] p;
	}

	List_of_Lists_Base(List_of_Lists_Base const&amp;) = delete;
	List_of_Lists_Base&amp; operator = (List_of_Lists_Base const&amp;) = delete;
};

// Wrapper around a C-style list of lists (T**) 
// but with static inner dimension. Makes no sense 
// (why not use an array?) but is needed by external 
// library function. 
template&lt;typename T&gt;
class List_of_Lists : private List_of_Lists_Base&lt;T&gt;
{
private:
	std::size_t inner;

public:
	List_of_Lists(std::size_t outer, std::size_t inner)
		: List_of_Lists_Base(outer), inner(inner)
	{
		for (auto&amp; p : internal_data)
			p = new T[inner];
	}

	List_of_Lists(List_of_Lists const&amp; other)
		: List_of_Lists(other.internal_data.size(), other.inner)
	{
		for (std::size_t i = 0; i &lt; internal_data.size(); ++i)
			std::copy(other.internal_data[i], other.internal_data[i] + inner, internal_data[i]);
	}

	List_of_Lists&amp; operator = (List_of_Lists other)
	{
		std::swap(other.inner, inner);
		std::swap(other.internal_data, internal_data);
		return *this;
	}

	T const* const* data() const { return internal_data.data(); }
	T** data() { return internal_data.data(); }

	T const* operator[](std::size_t index) const { return internal_data[index]; }
	T* operator[](std::size_t index) { return internal_data[index]; }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2392478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392478</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 02 Apr 2014 23:37:15 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherplatz in Hauptprogramm für Routine aus DLL reservieren on Thu, 03 Apr 2014 01:28:58 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Etwas modifiziert um Code-Duplication und das phöse re-throw zu vermeiden:</p>
</blockquote>
<p>Ich wusste schon, dass genau diese Antwort kommen würde, während ich das schrieb. Aber in dem Fall siegte die Faulheit <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="😃"
    /> . Ich rede mich aber trotzdem mal damit raus, dass der TE meinen Code wohl eher versteht (wenn er überhaupt noch was versteht), auch wenn es nicht gerade eine Demonstration von best-practices<sup>*</sup> ist.</p>
<p><sup>*</sup>: Mein Code zeigt ja sogar ganz im Gegenteil, wieso es keine gute Idee ist, mehrere Ressourcen in einem Objekt zu halten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392480</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 03 Apr 2014 01:28:58 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherplatz in Hauptprogramm für Routine aus DLL reservieren on Thu, 03 Apr 2014 01:41:29 GMT]]></title><description><![CDATA[<p>Meine Faulheit äussert sich darin dass ich gerade solchen Code schreibe. Weil ich keine Lust habe mir über Dinge den Kopf zu zerbrechen, wie eben ob alles in jedem Fall richtig freigegeben wird etc. <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 />
Und weil ich noch viel weniger Lust habe das wiederholt zu tun - wie wenn ich ein Programm lese, Fehler suche, Änderungen machen muss etc.<br />
(Was in dem Fall natürich wurscht wäre, aber das is einfach schon so ne starke Angewohnheit...)</p>
<p>~Mir sind Leute suspekt die dreckigen Test- oder Demo-Code schreiben. Ich bin nämlich der Meinung dass die meisten davon auch dreckigen Produktiv-Code schreiben. ;)~</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392481</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 03 Apr 2014 01:41:29 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherplatz in Hauptprogramm für Routine aus DLL reservieren on Thu, 03 Apr 2014 09:51:03 GMT]]></title><description><![CDATA[<p>Ich danke vielmals - Es geht alles - einfach wunderbar <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 />
Das hätte ich aber selber garantiert nicht hinbekommen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392530</guid><dc:creator><![CDATA[Barnaby]]></dc:creator><pubDate>Thu, 03 Apr 2014 09:51:03 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherplatz in Hauptprogramm für Routine aus DLL reservieren on Thu, 03 Apr 2014 11:41:34 GMT]]></title><description><![CDATA[<p>Was ist denn bitte an throw; boese?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392547</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Thu, 03 Apr 2014 11:41:34 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherplatz in Hauptprogramm für Routine aus DLL reservieren on Thu, 03 Apr 2014 15:21:55 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Was ist denn bitte an throw; boese?</p>
</blockquote>
<p>Es ist halt ein Zeichen für einen Designfehler. Wenn man ein rethrow macht, dann hat man vorher höchstwahrscheinlich ein <code>catch(...)</code> gemacht. Das einzig sinnvolle, was man in einem <code>catch(...)</code> -Block machen kann, sind jedoch Aufräumarbeiten. Das wiederum bedeutet, dass man RAII nicht konsequent durchgezogen hat, denn dan wäre das unnötig. Und C++ ohne RAII ist aber nicht wirklich C++.<br />
Genau das ist in meinem Beispiel passiert: Zwar ist das gesamte Datenfeld geRAIIt (das ist ja gerade der Zweck der Klasse), aber sauber wäre es gewesen, so wie bei hustbaer auch die einzelnen Unterfelder mittels RAII zu verwalten, nicht nur das Gesamtobjekt. Dann entfallen nämlich die Aufräumarbeiten und die daraus folgende Codeduplikation in den Konstruktoren.</p>
<p>Man sieht: Das faul programmierte Beispiel war anscheinen didaktisch wertvoll <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="😃"
    /> . Manchmal muss man eben auch mal demonstrieren, wie es falsch aussähe, damit klar wird, warum der richtige Weg besser ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392582</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 03 Apr 2014 15:21:55 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherplatz in Hauptprogramm für Routine aus DLL reservieren on Thu, 03 Apr 2014 15:25:14 GMT]]></title><description><![CDATA[<p>Exceptions aus einem Thread entkommen lassen ist auch ein Designfehler. Was machst du da? :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392583</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392583</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Thu, 03 Apr 2014 15:25:14 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherplatz in Hauptprogramm für Routine aus DLL reservieren on Thu, 03 Apr 2014 16:20:57 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Exceptions aus einem Thread entkommen lassen ist auch ein Designfehler.</p>
</blockquote>
<p>Nicht wirklich.<br />
Wenn man die Exception nur mit &quot;Mist, bitte 1x Programm abbrechen&quot; behandeln kann, dann kann man sie auch gleich rausfliegen lassen. Hat sogar einige Vorteile.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2392599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2392599</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 03 Apr 2014 16:20:57 GMT</pubDate></item></channel></rss>