<?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[GSL Routine als Klassenfunktion]]></title><description><![CDATA[<p>Hi,</p>
<p>angestoßen durch meinen <a href="http://www.c-plusplus.net/forum/301501" rel="nofollow">anderen Thread</a> über Funktionen habe ich nun versucht eine <a href="http://www.gnu.org/software/gsl/manual/html_node/Numerical-integration-examples.html" rel="nofollow">GSL Routine zur Integration</a> als Klassenfunktion zu programmieren. Das Beispiel habe ich ganz gut nachvollziehen können und habe es auch geschafft meine Funktion integrieren zu lassen.</p>
<p>Der Knackpunkt bei der GSL Vorlage ist wohl, dass eine Funktion f definiert wird, in der die Funktionsvorschrift steht. Später wird diese mittels F.function &amp; f übergeben, sodass gsl_integration_qags( &amp; F, ...) loslegen kann.</p>
<p>Also dachte ich mir, dass ich schlau bin und so eine Struktur f als Klassenfunktion schreibe:</p>
<pre><code>double IonizationCsDistr::f(double x, void* params)
{
	double T = *(double*) params;
	double f = ionization(T,x);
	return f;
}
</code></pre>
<p>Dabei ist ionization (T,x) eben meine zu integrierende Funktion, die ich über den operator() in einer Klasse definiert habe.</p>
<p>Insgesamt sieht das ganze dann so aus - ich habe gleich versucht eine Initialisierungsliste einzubauen, hoffe das ist so richtig:</p>
<pre><code class="language-cpp">// ionization_cs_distr.h
#ifndef IONIZATION_CS_DISTR_H_
#define IONIZATION_CS_DISTR_H_

#include &lt;math.h&gt;
#include &lt;gsl/gsl_integration.h&gt;

#include &quot;/home/klaus/Cpp/Water/Ionization/ionization_cs.h&quot;

class IonizationCsDistr{
public:
	IonizationCsDistr(const double &amp; I) : ionization(I), r_I(I) {}
	double operator() (double T, double W);

private:
	IonizationCS ionization;
	double f(double x, void* params);
	const double &amp; r_I;
};

double IonizationCsDistr::operator() (double T, double W)
{
	gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000);	

	double result, error;
	double a = 0;								// lower boundary
	double b = 0.5 * (T - r_I);	// max energy
	gsl_function F;
	F.function = &amp; f;
	F.params = &amp; T;	

	double result_max = gsl_integration_qags (&amp;F, a, b, 0, 1e-7, 1000, w, &amp; result, &amp; error);	

	gsl_integration_qags (&amp;F, a, W, 0, 1e-7, 1000, w, &amp; result, &amp; error);

	return result / result_max;

}

double IonizationCsDistr::f(double x, void* params)
{
	double T = *(double*) params;
	double f = ionization(T,x);
	return f;
}

#endif
// End of File
</code></pre>
<p>Wenn ich diese header Datei dann aber in meine Hauptdatei include knirscht es beim kompilieren:</p>
<pre><code>/home/klaus/Cpp/Water/Ionization/ionization_cs_distr.h:29: error: ISO C++ forbids taking the address
of an unqualified or parenthesized non-static member function to form a pointer to member function.
Say ‘&amp;IonizationCsDistr::f’

/home/klaus/Cpp/Water/Ionization/ionization_cs_distr.h:29: error: cannot convert ‘double
(IonizationCsDistr::*)(double, void*)’ to ‘double (*)(double, void*)’ in assignment
</code></pre>
<p>Ich habe dann versucht wie wild die Klassenfunktion umzubennen oder die Übergabe F.function &amp; f mittels der Angabe der Fehlermeldung <em>Say &amp;IonizationCsDistr::f</em>.</p>
<p>Aber ich würde ja gerne verstehen was da knirscht. Ich schätze mal, dass es darum geht, dass die Klassenfunktion nicht Anforderungen erfüllt, welche F.function &amp; erwartet? Also der Prototype?</p>
<p>Gruß,<br />
Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/301567/gsl-routine-als-klassenfunktion</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 03:12:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/301567.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 30 Mar 2012 06:42:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to GSL Routine als Klassenfunktion on Fri, 30 Mar 2012 06:42:18 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>angestoßen durch meinen <a href="http://www.c-plusplus.net/forum/301501" rel="nofollow">anderen Thread</a> über Funktionen habe ich nun versucht eine <a href="http://www.gnu.org/software/gsl/manual/html_node/Numerical-integration-examples.html" rel="nofollow">GSL Routine zur Integration</a> als Klassenfunktion zu programmieren. Das Beispiel habe ich ganz gut nachvollziehen können und habe es auch geschafft meine Funktion integrieren zu lassen.</p>
<p>Der Knackpunkt bei der GSL Vorlage ist wohl, dass eine Funktion f definiert wird, in der die Funktionsvorschrift steht. Später wird diese mittels F.function &amp; f übergeben, sodass gsl_integration_qags( &amp; F, ...) loslegen kann.</p>
<p>Also dachte ich mir, dass ich schlau bin und so eine Struktur f als Klassenfunktion schreibe:</p>
<pre><code>double IonizationCsDistr::f(double x, void* params)
{
	double T = *(double*) params;
	double f = ionization(T,x);
	return f;
}
</code></pre>
<p>Dabei ist ionization (T,x) eben meine zu integrierende Funktion, die ich über den operator() in einer Klasse definiert habe.</p>
<p>Insgesamt sieht das ganze dann so aus - ich habe gleich versucht eine Initialisierungsliste einzubauen, hoffe das ist so richtig:</p>
<pre><code class="language-cpp">// ionization_cs_distr.h
#ifndef IONIZATION_CS_DISTR_H_
#define IONIZATION_CS_DISTR_H_

#include &lt;math.h&gt;
#include &lt;gsl/gsl_integration.h&gt;

#include &quot;/home/klaus/Cpp/Water/Ionization/ionization_cs.h&quot;

class IonizationCsDistr{
public:
	IonizationCsDistr(const double &amp; I) : ionization(I), r_I(I) {}
	double operator() (double T, double W);

private:
	IonizationCS ionization;
	double f(double x, void* params);
	const double &amp; r_I;
};

double IonizationCsDistr::operator() (double T, double W)
{
	gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000);	

	double result, error;
	double a = 0;								// lower boundary
	double b = 0.5 * (T - r_I);	// max energy
	gsl_function F;
	F.function = &amp; f;
	F.params = &amp; T;	

	double result_max = gsl_integration_qags (&amp;F, a, b, 0, 1e-7, 1000, w, &amp; result, &amp; error);	

	gsl_integration_qags (&amp;F, a, W, 0, 1e-7, 1000, w, &amp; result, &amp; error);

	return result / result_max;

}

double IonizationCsDistr::f(double x, void* params)
{
	double T = *(double*) params;
	double f = ionization(T,x);
	return f;
}

#endif
// End of File
</code></pre>
<p>Wenn ich diese header Datei dann aber in meine Hauptdatei include knirscht es beim kompilieren:</p>
<pre><code>/home/klaus/Cpp/Water/Ionization/ionization_cs_distr.h:29: error: ISO C++ forbids taking the address
of an unqualified or parenthesized non-static member function to form a pointer to member function.
Say ‘&amp;IonizationCsDistr::f’

/home/klaus/Cpp/Water/Ionization/ionization_cs_distr.h:29: error: cannot convert ‘double
(IonizationCsDistr::*)(double, void*)’ to ‘double (*)(double, void*)’ in assignment
</code></pre>
<p>Ich habe dann versucht wie wild die Klassenfunktion umzubennen oder die Übergabe F.function &amp; f mittels der Angabe der Fehlermeldung <em>Say &amp;IonizationCsDistr::f</em>.</p>
<p>Aber ich würde ja gerne verstehen was da knirscht. Ich schätze mal, dass es darum geht, dass die Klassenfunktion nicht Anforderungen erfüllt, welche F.function &amp; erwartet? Also der Prototype?</p>
<p>Gruß,<br />
Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2196848</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2196848</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Fri, 30 Mar 2012 06:42:18 GMT</pubDate></item><item><title><![CDATA[Reply to GSL Routine als Klassenfunktion on Fri, 30 Mar 2012 14:07:28 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe noch im Netz gesucht und bin dann wiederum hier im Forum fündig geworden: <a href="http://www.c-plusplus.net/forum/230614" rel="nofollow">Link</a>.</p>
<p>Dabei scheint die Antwort des Users auf seine Problematik folgendes zu sein:</p>
<blockquote>
<p>Jetzt fang ich doch wieder an die RefCon-Pointer runterzucasten und auf den daraus hervorgehenden Objekten rumzumachen.</p>
</blockquote>
<p>Ist das auch die Antwort auf meine Problematik? Immerhin sieht die Situation ähnlich aus, dass nämlich laut Fehlermeldung</p>
<pre><code>‘double (*)(double, void*)’
</code></pre>
<p>gewünscht ist, ich allerdings mit</p>
<pre><code>‘double (IonizationCsDistr::*)(double, void*)’
</code></pre>
<p>Ich habe also noch die Umgebung der Klasse <em>IonizationCsDistr::</em> mit drin. <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>
<p>Und was meint der User dann mit <em>RefCon-Pointer runtercasten</em> ? Ich google mal...</p>
<p>Gruß,<br />
Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197002</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Fri, 30 Mar 2012 14:07:28 GMT</pubDate></item><item><title><![CDATA[Reply to GSL Routine als Klassenfunktion on Fri, 30 Mar 2012 14:39:09 GMT]]></title><description><![CDATA[<p>Argh!!</p>
<p>Also ich jetzt im Netz gefunden, dass man solch eine Konstruktion möglichst vermeiden soll, also versuche ich jetzt eine Funktion vor der Klasse zu definieren und dieser Funktion dann über void* param die Klasse zu übergeben, doch jetzt kriege ich die Fehlermeldung</p>
<pre><code>‘void*’ is not a pointer-to-object type
</code></pre>
<p>Ja was denn nun? Ich dachte das tolle an void wäre gerade, dass kein Datentyp vorher deklariert sein muss? Oder ist ein Datentyp jetzt wieder was anderes als ein Objekt?</p>
<p>Ich dachte ich könnte dann folgendes machen.</p>
<pre><code class="language-cpp">// ionization_cs_distr.h
#ifndef IONIZATION_CS_DISTR_H_
#define IONIZATION_CS_DISTR_H_

#include &lt;math.h&gt;
#include &lt;gsl/gsl_integration.h&gt;

#include &quot;/home/klaus/Cpp/Water/Ionization/ionization_cs.h&quot;

double f(double x, void* params)
{
	double T = params-&gt;T;
	double f = params-&gt;ionization(T,x);
	return f;
}

class IonizationCsDistr{
public:
	IonizationCsDistr(const double &amp; I) : ionization(I), r_I(I) {}
	double operator() (double T, double W);

private:
	IonizationCS ionization;
	const double &amp; r_I;
};

double IonizationCsDistr::operator() (double T, double W)
{
	gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000);	

	double result, error;
	double a = 0;								// lower boundary
	double b = 0.5 * (T - r_I);	// max energy
	gsl_function F;
	F.function = &amp; f;
	F.params = &amp; ionization;	

	double result_max = gsl_integration_qags (&amp;F, a, b, 0, 1e-7, 1000, w, &amp; result, &amp; error);	

	gsl_integration_qags (&amp;F, a, W, 0, 1e-7, 1000, w, &amp; result, &amp; error);

	return result / result_max;

}
#endif
// End of File
</code></pre>
<p>Gruß,<br />
Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197012</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Fri, 30 Mar 2012 14:39:09 GMT</pubDate></item><item><title><![CDATA[Reply to GSL Routine als Klassenfunktion on Fri, 30 Mar 2012 17:34:01 GMT]]></title><description><![CDATA[<p>So,</p>
<p>ich denke ich habe das Typcasten jetzt hinbekommen, ich habe jetzt:</p>
<pre><code class="language-cpp">// ionization_cs_distr.h
#ifndef IONIZATION_CS_DISTR_H_
#define IONIZATION_CS_DISTR_H_

#include &lt;math.h&gt;
#include &lt;gsl/gsl_integration.h&gt;

#include &quot;/home/klaus/Cpp/Water/Ionization/ionization_cs.h&quot;

double f(double x, void* params)
{
	double T = ((IonizationCS*)params) -&gt; T ;
	double f = ((IonizationCS*)params) -&gt; ionization(T,x);
	return f;
}

class IonizationCsDistr{
public:
	IonizationCsDistr(const double &amp; I) : ionization(I), r_I(I) {}
	double operator() (double T, double W);

private:
	IonizationCS ionization;
	const double &amp; r_I;
};

double IonizationCsDistr::operator() (double T, double W)
{
	gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000);	

	double result, error;
	double a = 0;								// lower boundary
	double b = 0.5 * (T - r_I);	// max energy
	gsl_function F;
	F.function = &amp; f;
	F.params = &amp; ionization;	

	double result_max = gsl_integration_qags (&amp;F, a, b, 0, 1e-7, 1000, w, &amp; result, &amp; error);	

	gsl_integration_qags (&amp;F, a, W, 0, 1e-7, 1000, w, &amp; result, &amp; error);

	return result / result_max;

}
#endif
// End of File
</code></pre>
<p>Jetzt bekomme ich nur die Fehlermeldung</p>
<pre><code>ionization_cs_distr.h:13: error: ‘ionization’ was not declared in this scope
ionization_cs_distr.h:13: error: ‘(IonizationCS*)params’ cannot be used as a function
</code></pre>
<p>Jo, weil mir immer noch nicht klar ist, wie ich operator() mittels -&gt; aurufen? Ich finde es schön, dass mir gezeigt wurde, dass ich Klassen quasie auch als Funktionen aufrufen kann, doch wenn ich einen Pointer habe, dann kann operator() nicht aufrufen, weil es keine Memberfunktion ist? Es wäre eine Art Memberoperator, aber wie kriege ich das hin?</p>
<p>Hier noch die ionization class</p>
<pre><code class="language-cpp">// ionization_cs.h

#ifndef IONIZATION_CS_H
#define IONIZATION_CS_H

class IonizationCS
{
public:
	IonizationCS(double ionization_potential);
	IonizationCS(double T, double ionization_potential);
	double operator() (double T);
	double operator() (double T, double W);
	double T;
private:
	const double A1, A2, B1, B2, a0, Ry, N;
	double S, F1, F2, I;
};

// constructor
inline IonizationCS::IonizationCS(double ionization_potential):
	A1(0.94), A2(1.13), B1(2.3), B2(22.0), // Liquid
//	A1(1.31), A2(0.37), B1(0.0), B2(0.0),	// Inner shells
        a0(5.3e-9),                            // Bohrradius [a0] = cm
	Ry(13.6),                              // Rydberg energy [Ry] = eV
	N(2),				       // number of electrons per shell
	I(ionization_potential)
{
	S = 4 * M_PI * N * pow(a0,2)*pow(Ry/I,2);
}

inline IonizationCS::IonizationCS(double T, double ionization_potential):
	T(T),
	A1(0.94), A2(1.13), B1(2.3), B2(22.0), // Liquid
//	A1(1.31), A2(0.37), B1(0.0), B2(0.0),	// Inner shells
	a0(5.3e-9),                             // Bohrradius [a0] = cm
	Ry(13.6),                               // Rydberg energy [Ry] = eV
	N(2),					// number of electrons per shell
	I(ionization_potential)

{
	S = 4 * M_PI * N * pow(a0,2)*pow(Ry/I,2);
}

double IonizationCS::operator() (double T)
{
	const double t = T/I;
	F1 = A1 * log(t)/(t + B1);
	F2 = A2 / (t + B2);
	return //
	1e16 * // for better plotting and fitting because of the little numbers	
	S * F1 * (t-1)/(2*pow(t,2)) * (t + 1 - (4 * sqrt(t))/(3 + t))	//
	+ S * F2 * (1 - 1/t - log(t)/(t+1));	
}

double IonizationCS::operator() (double T, double W)
{
	const double t = T/I;
	const double w = W/I;
	F1 = A1 * log(t)/(t + B1);
	F2 = A2 / (t + B2);	
	return 
	1e16 * // for better plotting and fitting because of the little numbers
	0.5 * (// according to the Rudd Paper
	S*F1*(0.5 - 1/(2*pow(w+1,2)) - 1/(2*pow(t,2)) //
	+ 1/(2*pow(t-w,2)) //
	+ 2*(t-2*w-1)/(pow(t+1,2)*sqrt(w+1)*sqrt(t-w)) //
	- 2*(t-1) / ( pow(t+1,2)*sqrt(t) ) )
	+
	S*F2*( 1 - 1/(w+1) - 1/t + 1/(t-w) //
	+ 1/(w+1) * log((t-w)/(t*(w+1))) ));
}

#endif
</code></pre>
<p>Ich bin doch jetzt soooo kurz davor, oder nicht? <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="😞"
    /> <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="😞"
    /> <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>
<p>Gruß,<br />
Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197083</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Fri, 30 Mar 2012 17:34:01 GMT</pubDate></item><item><title><![CDATA[Reply to GSL Routine als Klassenfunktion on Fri, 30 Mar 2012 17:43:45 GMT]]></title><description><![CDATA[<p>So,</p>
<p>jetzt habe ich es: Derefernzieren ist das Zauberwort:</p>
<pre><code>double f(double x, void* params)
{
	double T = ((IonizationCS*)params) -&gt; T ;
	double f = (*(IonizationCS*)params)(T,x);
	return f;
}
</code></pre>
<p>Auch wenn ich mir jetzt gerne anhöre was für ein Spaghetti Programmierer ich bin - es funzt! <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>
<p>Gruß,<br />
Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197087</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Fri, 30 Mar 2012 17:43:45 GMT</pubDate></item><item><title><![CDATA[Reply to GSL Routine als Klassenfunktion on Fri, 30 Mar 2012 18:01:37 GMT]]></title><description><![CDATA[<p>Wenn T eine Membervariable von IonizationCS ist, warum braucht operator() dann T als Parameter?</p>
<p>Falls T nur in IonizationCS steht, um die Callback-Schnittstelle befriedigen zu können, dann wäre es im Zweifel sinnvoller, etwas wie</p>
<pre><code class="language-cpp">struct IonizationCallbackData {
  double T;
  Ionization *ionization;
};

double callback_f(double x, void *context_raw) {
  IonizationCallbackData *context = static_cast&lt;IonizationCallbackData*&gt;(context_raw);

  return (*context-&gt;ionization)(context-&gt;T, x);
}
</code></pre>
<p>zu schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2197093</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2197093</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Fri, 30 Mar 2012 18:01:37 GMT</pubDate></item><item><title><![CDATA[Reply to GSL Routine als Klassenfunktion on Wed, 25 Apr 2012 10:24:39 GMT]]></title><description><![CDATA[<p>Hm,</p>
<p>ich glaube diese Schnittstelle hilft mir bei meinem Vorhaben alles in eine Klasse zu packen.</p>
<p>Im Folgenden will ich die Klassenfunktion</p>
<pre><code>double cs(double I, double T, double W)
</code></pre>
<p>nach W integrieren. Und die Integration bis zur oberen Grenze W soll als Funktion in die Klassenfunktion</p>
<pre><code>cs_distr(double I, double T, double W)
</code></pre>
<p>Also wenn ich das ganze in die GSL reinpacken möchte, dann benötige ich anhand des <a href="http://www.gnu.org/software/gsl/manual/html_node/Numerical-integration-examples.html" rel="nofollow">gegebenen Beispiels</a> grob folgende Funktion:</p>
<pre><code>double f(double W, void * params)
{
  return cs(I,T,W);
}
</code></pre>
<p>Wobei mir jetzt nicht ganz klar ist, wie ich über Params die beiden Variablen I und T weitergeben soll.<br />
Ich würde mir ja gerne lokal in der Klassenfunktion eine Struktur params und eine Funktion f definieren, aber das darf ich ja nicht.<br />
Ich könnte das auch außerhalb machen, doch benötige ich für spätere Anwendungen der GSL die Bezeichnungen noch.<br />
Oder ich fange an das ganze params 1, params 2 und die Funktionen f,g,h ... zu nennen.</p>
<p>Gruß,<br />
Klaus.</p>
<pre><code class="language-cpp">// ionization.cs - class to coup with all processes belonging to ionization
#ifndef IONIZATION_H_
#define IONIZATION_H_

#include &lt;math.h&gt;
#include &lt;gsl/gsl_integration.h&gt;

using namespace std;

class IONIZATION
{
public:
	IONIZATION();
	double cs(double I, double T, double W);
	double cs_distr(double I, double T, double W);
private:
	const double A1,A2,B1,B2,a0,Ry,N;
	gsl_function F;
//	F.function &amp; f;
//	F.params = &amp;

};

IONIZATION::IONIZATION() : 
A1(0.94), A2(1.13), B1(2.3), B2(22.0),a0(5.3e-9),
Ry(13.6),N(2) {}

double IONIZATION::cs(double I, double T, double W)
{
	if(T &lt; I)
	{
		cout &lt;&lt; &quot;IONIZATION IMPOSSIBLE!&quot; &lt;&lt; endl;
		return 0;
	}
	else
	{
		const double t = T/I;
		const double w = W/I;
		double S = 4 * M_PI * N * pow(a0,2)*pow(Ry/I,2);		
		double F1 = A1 * log(t)/(t + B1);
		double F2 = A2 / (t + B2);	
		return 
		1e16 * // for better plotting and fitting because of the little numbers
		0.5 * (// according to the Rudd Paper
		S*F1*(0.5 - 1/(2*pow(w+1,2)) - 1/(2*pow(t,2)) //
		+ 1/(2*pow(t-w,2)) //
		+ 2*(t-2*w-1)/(pow(t+1,2)*sqrt(w+1)*sqrt(t-w)) //
		- 2*(t-1) / ( pow(t+1,2)*sqrt(t) ) )
		+
		S*F2*( 1 - 1/(w+1) - 1/t + 1/(t-w) //
		+ 1/(w+1) * log((t-w)/(t*(w+1))) ));
	}
}

double IONIZATION::cs_distr(double I, double T, double W)
{

}

#endif
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2205474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2205474</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Wed, 25 Apr 2012 10:24:39 GMT</pubDate></item><item><title><![CDATA[Reply to GSL Routine als Klassenfunktion on Wed, 25 Apr 2012 16:02:20 GMT]]></title><description><![CDATA[<p>Also ich denke meine Funktion müsste ungefähr so aussehen:</p>
<pre><code class="language-cpp">double f(double x, void * params)
{
	return ((IONIZATION*)params)-&gt;cs(I,T,x);
}
</code></pre>
<p>Nur wie kriege ich dann die Information über I und T da rein?</p>
<p>Ist das der Grund für diese Callback Schnittstelle?</p>
<p>Gruß,<br />
Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2205592</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2205592</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Wed, 25 Apr 2012 16:02:20 GMT</pubDate></item><item><title><![CDATA[Reply to GSL Routine als Klassenfunktion on Fri, 27 Apr 2012 11:12:48 GMT]]></title><description><![CDATA[<p>Also ich habe mir jetzt eine Struktur gebastelt als Vermittler, aber ich verstehe den Fehler der Kompilierung nicht - ich denke es hängt irgendwie mit der Vorwärtsdeklaration zusammen. <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>
<p>Hier der Codeschnippsel:</p>
<pre><code class="language-cpp">// ionization.cs - class to coup with all processes belonging to ionization
#ifndef IONIZATION_H_
#define IONIZATION_H_

using namespace std;

class IONIZATION;

struct NECESSARY_EVIL;

double f(double x, void * params);

class IONIZATION
{
public:
	double cs_distr(double I, double T, double W);
// ..
};

double IONIZATION::cs_distr(double I, double T, double W)
{
	NECESSARY_EVIL ne(I,T,this);
  // ...

}

struct NECESSARY_EVIL
{
	NECESSARY_EVIL(double I, double T, IONIZATION * p_io) : I(I), T(T), p_io(p_io) {}
	const double I,T;
	IONIZATION * p_io;
};

double f(double x, void * params)
{
	double I = ((NECESSARY_EVIL*)params)-&gt;I;
	double T = ((NECESSARY_EVIL*)params)-&gt;T;
	return ((NECESSARY_EVIL*)params)-&gt;p_io-&gt;cs(I,T,x);
}

#endif
</code></pre>
<p>Und die Fehlermeldung ist jetzt eben:</p>
<pre><code>Header_Files/ionization.h:118: error: variable ‘NECESSARY_EVIL ne’ has initializer but incomplete type
</code></pre>
<p>Aber rein vom Syntax ist die doch sauber initialisiert, oder nicht?</p>
<p>Gruß,<br />
Klaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2206072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2206072</guid><dc:creator><![CDATA[Klaus82]]></dc:creator><pubDate>Fri, 27 Apr 2012 11:12:48 GMT</pubDate></item></channel></rss>