<?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[Funktion &amp;quot;erstellen&amp;quot;]]></title><description><![CDATA[<p>Hallo.</p>
<p>Ich weiss leider nicht wie man es nennen soll und so suche ich nun schon seit Stunden in google nach einer passenden Beschreibung/Hilfe.</p>
<pre><code class="language-cpp">ExprFunc1V = function(const x: Extended): Extended;

SinC   : ExprFunc1V;

SinC := CompileExpr(ParseExpr('sin(x)/x',['x']),tyPass1V);    // parse and compile expression
Result := SinC(1.0);                                          // evaluate the Expression
FreeFunc(@SinC);                                              // Free Function
ShowMessage('Result = '+FloatToStr(Result));
</code></pre>
<p>Ich möchte diesen Delphi Code gerne in C++ übernehmen, jedoch weiss ich nicht wie man so wie dort eine Funktion &quot;erstellt&quot;.</p>
<p>Der erste Schritt wäre</p>
<pre><code class="language-cpp">typedef Extended __fastcall (*ExprFunc1V)(const Extended x);
</code></pre>
<p>und<br />
ExprFunc1V SinC;</p>
<p>Aber wie caste(?) ich jetzt die Ausgabe von CompileExpr() in eine Funktion</p>
<pre><code class="language-cpp">ExprFunc1V SinC = (ExprFunc1V*)CompileExpr(ParseExpr(&quot;sin(x)/x&quot;, v, ARRAYSIZE(v)-1),tyPass1V); // Das bringts leider nicht  :rolling_eyes:
</code></pre>
<p>und gebe diese auch wieder frei?</p>
<p>Bitte einer muss das doch wissen, wenigstens nach welchem Begriff man suchen muss um irgendwie ansatzen zu können <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/123935/funktion-quot-erstellen-quot</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 19:28:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/123935.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 21 Oct 2005 14:18:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktion &amp;quot;erstellen&amp;quot; on Fri, 21 Oct 2005 14:18:51 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<p>Ich weiss leider nicht wie man es nennen soll und so suche ich nun schon seit Stunden in google nach einer passenden Beschreibung/Hilfe.</p>
<pre><code class="language-cpp">ExprFunc1V = function(const x: Extended): Extended;

SinC   : ExprFunc1V;

SinC := CompileExpr(ParseExpr('sin(x)/x',['x']),tyPass1V);    // parse and compile expression
Result := SinC(1.0);                                          // evaluate the Expression
FreeFunc(@SinC);                                              // Free Function
ShowMessage('Result = '+FloatToStr(Result));
</code></pre>
<p>Ich möchte diesen Delphi Code gerne in C++ übernehmen, jedoch weiss ich nicht wie man so wie dort eine Funktion &quot;erstellt&quot;.</p>
<p>Der erste Schritt wäre</p>
<pre><code class="language-cpp">typedef Extended __fastcall (*ExprFunc1V)(const Extended x);
</code></pre>
<p>und<br />
ExprFunc1V SinC;</p>
<p>Aber wie caste(?) ich jetzt die Ausgabe von CompileExpr() in eine Funktion</p>
<pre><code class="language-cpp">ExprFunc1V SinC = (ExprFunc1V*)CompileExpr(ParseExpr(&quot;sin(x)/x&quot;, v, ARRAYSIZE(v)-1),tyPass1V); // Das bringts leider nicht  :rolling_eyes:
</code></pre>
<p>und gebe diese auch wieder frei?</p>
<p>Bitte einer muss das doch wissen, wenigstens nach welchem Begriff man suchen muss um irgendwie ansatzen zu können <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/897860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/897860</guid><dc:creator><![CDATA[_midori_]]></dc:creator><pubDate>Fri, 21 Oct 2005 14:18:51 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion &amp;quot;erstellen&amp;quot; on Fri, 21 Oct 2005 14:38:07 GMT]]></title><description><![CDATA[<p>Is das ein Funktionszeiger?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/897872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/897872</guid><dc:creator><![CDATA[Pellaeon]]></dc:creator><pubDate>Fri, 21 Oct 2005 14:38:07 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion &amp;quot;erstellen&amp;quot; on Fri, 21 Oct 2005 14:54:36 GMT]]></title><description><![CDATA[<p>Ach oben die Zeile war nicht richtig</p>
<pre><code class="language-cpp">ExprFunc1V SinC = (ExprFunc1V)CompileExpr(ParseExpr(&quot;sin(x)/x&quot;, v, ARRAYSIZE(v)-1),tyPass1V); // ohne den Stern
</code></pre>
<p>Der Fehler daran ist aber das beim Start ein Speicherfehler Error kommt.</p>
<p>CompileExpr() ist **void ***</p>
<pre><code class="language-cpp">extern PACKAGE void * __fastcall CompileExpr(const Expression &amp;Bytecode, tyPassType PT);
</code></pre>
<p>Ich habe auch schon probiert</p>
<pre><code class="language-cpp">ExprFunc1V SinC = 0;
SinC = (ExprFunc1V)CompileExpr(ParseExpr(&quot;sin(x)/x&quot;, v, ARRAYSIZE(v)-1),tyPass1V); // ohne den Stern
</code></pre>
<p>Oft hilft es ja 0 zu setzen, leider hier nicht <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>Es compiliert, aber Speichererror bei Ausführung. Eine Ahnung woran es hängt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/897911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/897911</guid><dc:creator><![CDATA[_midori_]]></dc:creator><pubDate>Fri, 21 Oct 2005 14:54:36 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion &amp;quot;erstellen&amp;quot; on Sat, 22 Oct 2005 09:59:01 GMT]]></title><description><![CDATA[<p><em>midori</em> schrieb:</p>
<blockquote>
<p>Oft hilft es ja 0 zu setzen</p>
</blockquote>
<p>Kann schon sein, aber nicht in C++.</p>
<p>Gibt denn CompileExpr() eine gültige Adresse zurück?<br />
Und ob die Funktionssignatur von ExprFunc1V richtig ist, ist auch noch so ein Thema. Normalerweise nutzt man in C++ keine const by-value Übergaben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/898535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/898535</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Sat, 22 Oct 2005 09:59:01 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion &amp;quot;erstellen&amp;quot; on Sat, 22 Oct 2005 11:45:58 GMT]]></title><description><![CDATA[<p>Nunja, in C(++) kann man nicht wirklich neue Funktionen zur Laufzeit definieren - du könntest höchstens den Zeiger auf eine bereits existierend Funktion zurückliefern. Aber da du beliebige Nutzereingaben in Funktionen verwandeln willst, dürfte das etwas problematisch werden (da du für jede potentiell mögliche Eingabe die passende Funktion brauchst), da wäre vermutlich eine Parser-Klasse sinnvoller, die den String zur Laufzeit durchgeht:</p>
<pre><code class="language-cpp">class function_parser
{
public:
  function_parser(const std::string&amp; the_func): m_func(the_func) {}
  operator()(double x, double y=0, double z=0)
  {
    // hier drin m_func auswerten und die Parameter einsetzen
  }
private:
  std::string m_func;
}
</code></pre>
<p>(in dem Beispiel kann die berechnete Funktion bis zu drei Parameter haben)</p>
<p>Zum Parsen der Eingabe empfehle ich z.B. Spirit (hab' recht gute Erfahrung damit gemacht) oder lexx.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/898609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/898609</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 22 Oct 2005 11:45:58 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion &amp;quot;erstellen&amp;quot; on Sat, 22 Oct 2005 12:10:56 GMT]]></title><description><![CDATA[<p>@_midori_<br />
Wenn der Speicherfehler in der gezeigten Zeile kommt, dann ist es entweder die Funktion ParseExpr oder CompileExpr. Die Zuweisung des Ergebnis der Funktion CompileExpr (selbst wenn es eine ungültige Zahl ist) sollte erstmal keinen Fehler produzieren. Insofern ist es auch irrelevant, ob Du vorher die Variable auf 0 setzt. Wenn die zurückgebene Adresse ungültig ist (also kein Zeiger auf eine Funktion mit der gegebenen Signatur), bekommst Du einen Absturz, wenn Du versuchst, die Variable zu nutzen.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/2813">@groovemaster</a><br />
Extended ist in Delphi/C++Builder ein 10 Byte Floating Point Wert und damit &quot;praktisch&quot; ein POD. siehe z.B<br />
<a href="http://www.merlyn.demon.co.uk/pas-type.htm" rel="nofollow">http://www.merlyn.demon.co.uk/pas-type.htm</a><br />
Daher ist das f(const Extended x) vergleichbar mit f(const double d).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/898627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/898627</guid><dc:creator><![CDATA[niemand]]></dc:creator><pubDate>Sat, 22 Oct 2005 12:10:56 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion &amp;quot;erstellen&amp;quot; on Sat, 22 Oct 2005 12:20:18 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a><br />
Das Ding erzeugt tatsächlich eine neue Funktion. Siehe den Thread unter:<br />
<a href="http://www.delphi-forum.de/viewtopic.php?t=36946&amp;postdays=0&amp;postorder=asc&amp;start=20" rel="nofollow">http://www.delphi-forum.de/viewtopic.php?t=36946&amp;postdays=0&amp;postorder=asc&amp;start=20</a><br />
Der geparste Ausdruck wird zur Laufzeit compiliert...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/898638</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/898638</guid><dc:creator><![CDATA[niemand]]></dc:creator><pubDate>Sat, 22 Oct 2005 12:20:18 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion &amp;quot;erstellen&amp;quot; on Sun, 23 Oct 2005 11:34:26 GMT]]></title><description><![CDATA[<p>niemand schrieb:</p>
<blockquote>
<p>Extended ist in Delphi/C++Builder ein 10 Byte Floating Point Wert und damit &quot;praktisch&quot; ein POD.</p>
</blockquote>
<p>Viel inbteressanter ist allerdings, WIE der Parameter übergeben wird. const macht eigentlich nur bei by-reference <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="🙂"
    /> Sinn. Deshalb hab ich mich gefragt, ob die by-value Deklaration unter C++ überhaupt richtig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/899227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/899227</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Sun, 23 Oct 2005 11:34:26 GMT</pubDate></item><item><title><![CDATA[Reply to Funktion &amp;quot;erstellen&amp;quot; on Sun, 23 Oct 2005 12:17:13 GMT]]></title><description><![CDATA[<p>Delphi entscheidet selbst ob const Parameter als Referenz übergeben werden oder nicht.</p>
<p>Der Grund warum man Parameter als const und by-Value deklariert, ist zu dokumentieren, dass innerhalb der Funktion der Wert nicht geändert wird (für den Leser der Funktion, nicht für den Aufrufer). Bei hinreichend kurzen Funktionen wird das natürlich wieder überflüssig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/899247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/899247</guid><dc:creator><![CDATA[niemand]]></dc:creator><pubDate>Sun, 23 Oct 2005 12:17:13 GMT</pubDate></item></channel></rss>