<?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[Templates in C möglich machen?]]></title><description><![CDATA[<p>Hallo allerseits,</p>
<p>ich würde mich gerne informieren was ich für eine Möglichkeit habe C++ Templates<br />
in C nutzbar zu machen.</p>
<p>*\ Ich habe einen funktionsfähigen Code der von jemandem anderen programmiert wurde und der über C kompiliert wird. Also rein C ist. Nennen wir diesen CODE_OTHER</p>
<p>*\ Dann habe ich meinen Code der C++ basiert ist und Templates verwendet.<br />
Nennen wir diesen CODE_MY</p>
<p>*\ Jetzt möchte ich innerhalb CODE_OTHER meinen code also CODE_MY nutzbar machen.</p>
<p>Ich habe angenfangen in CODE_OTHER funktionen zu schreiben die ein Mapping zwischen den Datenstrukturen schafft. Jetzt komme ich aber an eine Stelle wo ich<br />
eine Template-basierte klasse aus CODE_MY instantiieren will/muss.</p>
<p>Ich weiß hier nicht was ich tun kann/soll: Ich habe mich informiert es aber nicht genau verstanden:<br />
-&gt; Irgendwie gibt es eine Möglichkeit in CODE_MY über extern C interface funktionen an CODE_MY zu bieten. Dann CODE_MY als shared library zu kompilieren<br />
und anschließend das Object-file von CODE_OTHER gegen das Object-file von CODE_MY zu linken.</p>
<p>Klappt das so oder kann mir jemand noch genauere angaben geben? Ich finde auch keine Minimalbeispiele diesbezüglich. ich würde mich sehr freuen wenn mir hier jemand helfen könnte.</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/259051/templates-in-c-möglich-machen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 23:59:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/259051.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 18 Jan 2010 14:26:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Templates in C möglich machen? on Mon, 18 Jan 2010 14:26:17 GMT]]></title><description><![CDATA[<p>Hallo allerseits,</p>
<p>ich würde mich gerne informieren was ich für eine Möglichkeit habe C++ Templates<br />
in C nutzbar zu machen.</p>
<p>*\ Ich habe einen funktionsfähigen Code der von jemandem anderen programmiert wurde und der über C kompiliert wird. Also rein C ist. Nennen wir diesen CODE_OTHER</p>
<p>*\ Dann habe ich meinen Code der C++ basiert ist und Templates verwendet.<br />
Nennen wir diesen CODE_MY</p>
<p>*\ Jetzt möchte ich innerhalb CODE_OTHER meinen code also CODE_MY nutzbar machen.</p>
<p>Ich habe angenfangen in CODE_OTHER funktionen zu schreiben die ein Mapping zwischen den Datenstrukturen schafft. Jetzt komme ich aber an eine Stelle wo ich<br />
eine Template-basierte klasse aus CODE_MY instantiieren will/muss.</p>
<p>Ich weiß hier nicht was ich tun kann/soll: Ich habe mich informiert es aber nicht genau verstanden:<br />
-&gt; Irgendwie gibt es eine Möglichkeit in CODE_MY über extern C interface funktionen an CODE_MY zu bieten. Dann CODE_MY als shared library zu kompilieren<br />
und anschließend das Object-file von CODE_OTHER gegen das Object-file von CODE_MY zu linken.</p>
<p>Klappt das so oder kann mir jemand noch genauere angaben geben? Ich finde auch keine Minimalbeispiele diesbezüglich. ich würde mich sehr freuen wenn mir hier jemand helfen könnte.</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840767</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840767</guid><dc:creator><![CDATA[Testo]]></dc:creator><pubDate>Mon, 18 Jan 2010 14:26:17 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Mon, 18 Jan 2010 14:43:12 GMT]]></title><description><![CDATA[<blockquote>
<p>*\ Jetzt möchte ich innerhalb CODE_OTHER meinen code also CODE_MY nutzbar machen.</p>
</blockquote>
<p>Schreibe einen C-Wrapper von CODE_MY, kompiliere ihn mit einem C++ Compiler und linke ihn zum C-Projekt dazu. Soweit die Theorie. Das Problem sind natuerlich Datentypen, Objekte und Klassen. Templates muessen ja erstmal instanziiert werden. Deswegen bricht man komplexe Daten auf Standardtypen wie int, char (oder Arrays von diesen) herunter, um einen konfliktfreien Austausch zu ermoeglichen.</p>
<blockquote>
<p>Dann CODE_MY als shared library zu kompilieren</p>
</blockquote>
<p>Muss keine shared library sein.</p>
<blockquote>
<p>in CODE_OTHER funktionen zu schreiben</p>
</blockquote>
<p>Wenn du sowieso den Code zur Verfuegung hast, warum nutzt du nicht die weitreichende Kompatibilitaet von C und C++ aus und uebersetzt den C Code mit einem C++ Kompiler?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840775</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 18 Jan 2010 14:43:12 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Mon, 18 Jan 2010 14:39:13 GMT]]></title><description><![CDATA[<blockquote>
<p>Schreibe einen C-Wrapper von CODE_MY, kompiliere ihn mit einem C++ Compiler und linke ihn zum C-Projekt dazu.</p>
</blockquote>
<p>Bitte nicht böse sein wegen meiner dummen fragerei:<br />
* Ist das die einzige Möglichkeit?<br />
* Wo finde ich gute Links um so etwas zu tun bzw. wie kann ich so etwas bewerkstelligen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840780</guid><dc:creator><![CDATA[Testo]]></dc:creator><pubDate>Mon, 18 Jan 2010 14:39:13 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Mon, 18 Jan 2010 14:46:32 GMT]]></title><description><![CDATA[<p>Danke für die weitere Antwort</p>
<blockquote>
<p>Das Problem sind natuerlich Datentypen, Objekte und Klassen. Templates muessen ja erstmal instanziiert werden. Deswegen bricht man komplexe Daten auf Standardtypen wie int, char (oder Arrays von diesen) herunter, um einen konfliktfreien Austausch zu ermoeglichen.</p>
</blockquote>
<p>Ja. ich habe jetzt in CODE_OTHER schon viel arbeit reingesteckt und die ganzen umrechnungen der daten hinbekommen. Jetzt fehlt nur noch eine methode in der dann sozusagen der ganze transfer stattfindet bzw. z.B. eine templatebasiertes Objekt aufgerufen wird. War das alles jetzt umsonst?</p>
<blockquote>
<p>Wenn du sowieso den Code zur Verfuegung hast, warum nutzt du nicht die weitestgehende Kompatibilitaet von C und C++ aus und uebersetzt den C Code mit einem C++ Kompiler.</p>
</blockquote>
<p>Naja...weil CODE_OTHER eben von jedem runterladbar ist und standardmässig einen c-compiler drin hat. Ich würde gerne denjenigen dann anbieten meine integration zu nutzen will ihnen aber nicht aufzwingen auch ihre makefiles umzuschreiben....<br />
oder wäre das gar kein aufwand?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840787</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840787</guid><dc:creator><![CDATA[Testo]]></dc:creator><pubDate>Mon, 18 Jan 2010 14:46:32 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Mon, 18 Jan 2010 15:10:39 GMT]]></title><description><![CDATA[<p>du müsstest so oder so in der DLL das Template instantiieren, und zwar auf jede art, die du in dem anderen Code benutzen willst. Im Grunde erzeugst du dadurch aus dem Klassentemplate den Code für die Instantiierungen, d.h. für die einzelnen Templateklassen.<br />
Da es in C keine Klassen gibt, müsstest du zusätzlich C-Funktionen bereitstellen, die die Benutzung der Klassen kapseln. Wie genau das dann erfolgt ist dir überlassen. Eine möglichkeit wäre was in der Art:</p>
<pre><code class="language-cpp">//foo.hpp, das C++-Template

template &lt;class T&gt;
class Foo
{
public:
  Foo f(T const&amp; i) : i(i) {}
  int bar() {return i;}
private:
  T i;
};

//foowrap.h, C/C++-Header
#ifdef __cplusplus
extern &quot;C&quot;
{
#endif 

#define FOOWRAP(type)                          \
                                               \
typedef struct { void* ptr; } FOO_##type;      \
                                               \
FOO_##type create_foo_##type( const type* pi); \
type call_bar_foo_##type(FOO_##type foo);      \
void destroy_foo_##type(FOO_##type foo)

FOOWRAP(int);
FOOWRAP(short);
FOOWRAP(float);
#undef FOOWRAP

#ifdef __cplusplus
} /*end extern &quot;C&quot;*/
#endif 

//foowrap.cpp - implementierung auf C++-Seite
#include &quot;foowrap.h&quot;
#include &quot;foo.hpp&quot;

#define FOOWRAPIMPL(type)                      \
                                               \
FOO_##type create_foo_##type( const type* pi)  \
{                                              \
  FOO_##type t;                                \
/*hiermit wird das temlate auch instantiiert:*/\
  t.ptr = new Foo&lt;type&gt;(*pi);                  \
  return t;                                    \
}                                              \
                                               \
type call_bar_foo_##type(FOO_##type foo)       \
{                                              \
  Foo&lt;type&gt;* pf                                \
    = static_cast&lt;Foo&lt;type&gt;*&gt;(foo.ptr);        \
  return pf-&gt;bar();                            \
}                                              \
                                               \
void destroy_foo_##type(FOO_##type foo)        \
{                                              \
  Foo&lt;type&gt;* pf                                \
    = static_cast&lt;Foo&lt;type&gt;*&gt;(foo.ptr);        \
  delete pf; pf = NULL;                        \
}                                              

FOOWRAPIMPL(int);
FOOWRAPIMPL(float);
FOOWRAPIMPL(short);

#undef FOOWRAPIMPL

//main.c - C-Datei!
#include &quot;foowrap.h&quot;
int main()
{
  FOO_int fi = create_foo_int(14);
  int i = call_bar_foo_int(fi);
  printf(&quot;Foos i: %d\n&quot;, i);
  destroy_foo_int(fi);
}
</code></pre>
<p>ungetestet und ohne gewähr, aber templates gegen C-Code ist ne ziemliche schweinigelei, wie man sieht <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840802</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 18 Jan 2010 15:10:39 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Mon, 18 Jan 2010 15:11:38 GMT]]></title><description><![CDATA[<p>Probleme hast du sowieso nur zu erwarten, wenn der C Teil Funktionen aus dem C++ Teil aufrufen willst.<br />
Dazu kannst du im C++ Teil einfach 'extern &quot;C&quot;' Wrapper schreiben.<br />
Das können natürlich nur einfache Funktionen sein, keine Templates. Du kannst aber natürlich diese einfachen Funktionen so implementieren, dass sie nichts weiter tun als ein Template aufzurufen.</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">extern&quot;C&quot; int MyFunctionChar(char c)
{
    return MyNamespace::MyFunction(c);
}

extern&quot;C&quot; int MyFunctionInt(int i)
{
    return MyNamespace::MyFunction(i);
}

// etc.
</code></pre>
<p>Dazu schreibst du ein passendes C-kompatibles Header-File, damit du aus dem C-Teil auch an die Prototypen drankommst.</p>
<p>Das kann man z.B. so machen:</p>
<pre><code class="language-cpp">#ifdef __cplusplus
#define MY_FOO_EXTERN_C extern &quot;C&quot;
#else
#define MY_FOO_EXTERN_C 
#endif

MY_FOO_EXTERN_C int MyFunctionChar(char c);
MY_FOO_EXTERN_C int MyFunctionInt(int i);
</code></pre>
<p>So ein Header-File kann dann sowohl von C als auch von C++ Programmen verwendet werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840811</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 18 Jan 2010 15:11:38 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Mon, 18 Jan 2010 15:13:37 GMT]]></title><description><![CDATA[<p>Testo schrieb:</p>
<blockquote>
<p>Naja...weil CODE_OTHER eben von jedem runterladbar ist und standardmässig einen c-compiler drin hat.</p>
</blockquote>
<p>ich bezweifle dass der Code einen eingebauten COmpiler hat <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="😉"
    /></p>
<blockquote>
<p>Ich würde gerne denjenigen dann anbieten meine integration zu nutzen will ihnen aber nicht aufzwingen auch ihre makefiles umzuschreiben....<br />
oder wäre das gar kein aufwand?</p>
</blockquote>
<p>wenn die Makefiles ordentlich gemacht wurden steht da an einer Stelle drin wie der Compiler aufzurufen ist. Das wäre also eine Zeile zu ändern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840813</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 18 Jan 2010 15:13:37 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Mon, 18 Jan 2010 16:23:21 GMT]]></title><description><![CDATA[<p>puh...also erstmal danke für eure zahlreichen antworten.<br />
Ich bin mir nicht sicher ob ich euch verstehe. Vielleicht könnte ich mal ein Minimalbeispiel aufsetzen:</p>
<p>Hier mal meine main.c</p>
<pre><code class="language-cpp">/*
 * This is my C-Program
 * */

#include &quot;stdlib.h&quot;

int main()
{
        double * mydata = NULL; 
        /* Here i want to use the MyB.foo(MyC&lt;double&gt;* myC) but 
         * i dont have any myC object because i cannot create it
         * here because its template based*/
        /* ?????????? */
        MyC&lt;double&gt;* mtx = new MyC&lt;double&gt;();
}
</code></pre>
<p>Und hier mein main.cpp</p>
<pre><code class="language-cpp">// This is my C++ Programm
#include &lt;iostream&gt;
#include &lt;string.h&gt;

template&lt;class T&gt; class MyC
{
    public:
        MyC&lt;T&gt;() {
                data = NULL;
                memset(data, 0, 10*sizeof(T));
        }

        ~MyC&lt;T&gt;() { delete [] data; }
        T* data;
};

template&lt;class T&gt; class MyB
{
        public:
                MyB&lt;T&gt;() {
                        mydata = NULL;
                }

                void foo(MyC&lt;T&gt;* mtx) {
                        memcpy(mtx-&gt;data,mydata,10*sizeof(T));
                }
                T* mydata;
};

int main()
{
        MyC&lt;int&gt;* mtx = new MyC&lt;int&gt;();

        MyB&lt;int&gt;* myB = new MyB&lt;int&gt;();

        myB-&gt;foo(mtx);

        delete mtx;
        delete myB;
}
</code></pre>
<p>Das main.c programm ist CODE_OTHER und main.cpp ist CODE_MY. Mein Problem ist ich habe in CODE_MY eigene datenstrukturen die templatebasiert sind. Wenn in CODE_OTHER jetzt wieder andere datenstrukturen sind muss ich ja irgendwie ein mapping machen oder? Ich meine ich muss doch dann CODE_MY ein wenig abändern weil ich ja ganz andere datenstrukturen einspeisen werde...<br />
oder soll ich jetzt für jede template-klasse einen wrapper schreiben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840870</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840870</guid><dc:creator><![CDATA[Testo]]></dc:creator><pubDate>Mon, 18 Jan 2010 16:23:21 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Mon, 18 Jan 2010 16:36:53 GMT]]></title><description><![CDATA[<p>oder anders ausgedrückt in worten:</p>
<p>CODE_OTHER hat eine stuktur *data z.B.</p>
<p>in CODE_MY steht dann</p>
<pre><code class="language-cpp">int main()
{
    MyC&lt;T&gt;* mtx = NULL;
    mtx = readMatrix();
    Algorithm(mtx);
}
</code></pre>
<p>Wie schaffe ich es Algorithm statt auf mtx auf *data laufen zu lassen?</p>
<p>Ich muss doch dazu in CODE_MY eine funktion schreiben die *data entgegennimmt und die umwandlung macht? und dann ncoh eine zusätzliche funktion um Algorithm aufzurufen. Aber dazu musss ich ja die main() in CODE_MY verändern oder nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840875</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840875</guid><dc:creator><![CDATA[Testo]]></dc:creator><pubDate>Mon, 18 Jan 2010 16:36:53 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Mon, 18 Jan 2010 17:22:32 GMT]]></title><description><![CDATA[<p>Und nochmal code :</p>
<p>Hier mal CODE_MY wo ich eben templatebasiert bin.</p>
<pre><code class="language-cpp">// This is my C++ Programm
#include &lt;iostream&gt;
#include &lt;string.h&gt;
template&lt;class T&gt; class MyC
{
    public:
        MyC&lt;T&gt;() {
                data = new T[10];
                memset(data, 0, 10*sizeof(T));
        }
        ~MyC&lt;T&gt;() { delete [] data; }
        void print(MyC&lt;int&gt;* mtx);
        T* data;
};
template &lt;&gt; void
MyC&lt;int&gt;::print(MyC&lt;int&gt;* mtx)
{
   // Hier z.B. mtx ausgeben oder andere
   // Dinge mit mtx tun...
     for (int i = 0; i &lt;10; i++)
        std::cout &lt;&lt; i &lt;&lt; std::endl;
}
template&lt;class T&gt; class MyB
{
        public:
                MyB&lt;T&gt;() {
                        mydata = new T[10];
                }

                void Algorithm(MyC&lt;T&gt;* mtx) {
                        // do something with mtx
                        mtx-&gt;print(mtx);
                        memcpy(mtx-&gt;data,mydata,10*sizeof(T));
                }
                T* mydata;
};
int main()
{
        MyC&lt;int&gt;* mtx = new MyC&lt;int&gt;();
        MyB&lt;int&gt;().Algorithm(mtx);
        delete mtx;
}
</code></pre>
<p>Hier mal das C programm CODE_OTHER welches eben z.B. die data struktur hat.</p>
<pre><code>/*
 * This is my C-Program
 * */

#include &quot;stdlib.h&quot;

int main()
{
        double* data = calloc(10, sizeof(double));

        free(mydata);
}
</code></pre>
<p>Und wie schaffe ich es jetzt eine verbindung zwischen beiden herzustellen.<br />
Also <em>data über<br />
MyC&lt;int&gt;::print(MyC&lt;int&gt;</em> mtx)<br />
auszugeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1840897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1840897</guid><dc:creator><![CDATA[Testo]]></dc:creator><pubDate>Mon, 18 Jan 2010 17:22:32 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Mon, 18 Jan 2010 23:28:00 GMT]]></title><description><![CDATA[<p>Puh....<br />
seh ich das richtig dass ich diesen code via c++-compiler übersetze:</p>
<pre><code class="language-cpp">//foo.hpp, das C++-Template

template &lt;class T&gt;
class Foo
{
public:
  Foo f(T const&amp; i) : i(i) {}
  int bar() {return i;}
private:
  T i;
};

//foowrap.h, C/C++-Header
#ifdef __cplusplus
extern &quot;C&quot;
{
#endif

#define FOOWRAP(type)                          \
                                               \
typedef struct { void* ptr; } FOO_##type;      \
                                               \
FOO_##type create_foo_##type( const type* pi); \
type call_bar_foo_##type(FOO_##type foo);      \
void destroy_foo_##type(FOO_##type foo)

FOOWRAP(int);
FOOWRAP(short);
FOOWRAP(float);
#undef FOOWRAP

#ifdef __cplusplus
} /*end extern &quot;C&quot;*/
#endif

//foowrap.cpp - implementierung auf C++-Seite
#include &quot;foowrap.h&quot;
#include &quot;foo.hpp&quot;

#define FOOWRAPIMPL(type)                      \
                                               \
FOO_##type create_foo_##type( const type* pi)  \
{                                              \
  FOO_##type t;                                \
/*hiermit wird das temlate auch instantiiert:*/\
  t.ptr = new Foo&lt;type&gt;(*pi);                  \
  return t;                                    \
}                                              \
                                               \
type call_bar_foo_##type(FOO_##type foo)       \
{                                              \
  Foo&lt;type&gt;* pf                                \
    = static_cast&lt;Foo&lt;type&gt;*&gt;(foo.ptr);        \
  return pf-&gt;bar();                            \
}                                              \
                                               \
void destroy_foo_##type(FOO_##type foo)        \
{                                              \
  Foo&lt;type&gt;* pf                                \
    = static_cast&lt;Foo&lt;type&gt;*&gt;(foo.ptr);        \
  delete pf; pf = NULL;                        \
}                                              

FOOWRAPIMPL(int);
FOOWRAPIMPL(float);
FOOWRAPIMPL(short);

#undef FOOWRAPIMPL
</code></pre>
<p>und diesen code nur mit c - wie sieht dann aber das linking aus??</p>
<pre><code class="language-cpp">//main.c - C-Datei!
#include &quot;foowrap.h&quot;
int main()
{
  FOO_int fi = create_foo_int(14);
  int i = call_bar_foo_int(fi);
  printf(&quot;Foos i: %d\n&quot;, i);
  destroy_foo_int(fi);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1841075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841075</guid><dc:creator><![CDATA[Testo]]></dc:creator><pubDate>Mon, 18 Jan 2010 23:28:00 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Tue, 19 Jan 2010 01:12:31 GMT]]></title><description><![CDATA[<p>Freund Testo, dir ist schon klar dass es in C auch keine Klassen gibt, ja?<br />
Was du willst hat erstmal mit Templates nichts zu tun, sondern damit, dass es eben in C keine Klassen gibt.<br />
Ob es sich dabei C++ seitig um Templates handelt oder um &quot;normale&quot; Klassen, ist C seitig komplett egal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1841112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841112</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 19 Jan 2010 01:12:31 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Tue, 19 Jan 2010 09:44:36 GMT]]></title><description><![CDATA[<p>Danke erneut.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a>. Ja du hast recht - ich sehe jetzt mein Problem etwas klarer.<br />
Das Beispiel von pumuckl ist ein wenig &quot;zu schwer&quot; für mich im Moment.<br />
Ich würde mich freuen wenn mir jemand mit meinem minimalbeispiel weiterhelfen könnte - in diesem möchte ich den c++ code in dem c-code verwenden. Ich hoffe sehr dass ich ein korrektes minimalbeispiel aufzeige dass mein problem beschreibt. Ich bin über andere Hilfe jedesmal dankbar....:</p>
<p>Der C++ code</p>
<pre><code class="language-cpp">// This is my C++ Programm
#include &lt;iostream&gt;
#include &lt;string.h&gt;

template&lt;class T&gt; class MyC
{
    public:
	MyC&lt;T&gt;() { 
		data = new T[10];
		memset(data, 0.0, 10*sizeof(T));
	}
	~MyC&lt;T&gt;() { delete [] data; }
	void print(MyC&lt;int&gt;* mtx);
	T* data;
};

template &lt;&gt; void
MyC&lt;int&gt;::print(MyC&lt;int&gt;* mtx)
{
   // Hier z.B. mtx ausgeben oder andere
   // Dinge mit mtx tun...
     int a;
     for (int i = 0; i &lt;10; i++)
     	std::cout &lt;&lt; mtx-&gt;data[i] &lt;&lt; std::endl;
}

template&lt;class T&gt; class MyB
{
	public:
		MyB&lt;T&gt;() {
			mydata = new T[10];
		}
        // do something with mtx
		void Algorithm(MyC&lt;T&gt;*&amp; mtx) {
            for (int i= 0; i &lt; 10; i++)
                mtx-&gt;data[i] = i;

            mtx-&gt;print(mtx);
			memcpy(mtx-&gt;data,mydata,10*sizeof(T));
		}
		T* mydata;
};

int main()
{
	MyC&lt;int&gt;* mtx = new MyC&lt;int&gt;();
	MyB&lt;int&gt;().Algorithm(mtx);
	delete mtx;
}
</code></pre>
<p>Der C - Code</p>
<pre><code class="language-cpp">/*
 * This is my C-Program
 * */

#include &quot;stdlib.h&quot;

int main()
{
	int* data = calloc(10, sizeof(int));

    for (int i = 10; i &gt; 0; i--)
        data[10-i] = i;

    // Hier würde ich gern data über die C++ Klasse
    // so ändern dass in data in aufsteigender 
    // art die i's gespeichert sind.

    for (int i = 0; i &lt; 10; i++)
        printf(&quot;data[%d] = %d\n&quot;, i, data[i]);

	free(data);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1841198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841198</guid><dc:creator><![CDATA[Testo]]></dc:creator><pubDate>Tue, 19 Jan 2010 09:44:36 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Tue, 19 Jan 2010 10:01:53 GMT]]></title><description><![CDATA[<p>Die erste Sache ist schonmal: entscheide dich in welchem Codeteil die main() überhaupt sein soll. Schreib mal deinen Code komplett so wie du ihn schreiben würdest wenn du in C die Teplates benutzen <em>könntest</em>. Was du da hast, nämlich zwei main()-Funktionen ist sinnfrei und machts extrem schwer zu erkennen was du eigentlich willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1841215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841215</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 19 Jan 2010 10:01:53 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Tue, 19 Jan 2010 10:38:18 GMT]]></title><description><![CDATA[<p>Entschuldigung. Ich möchte die main von C benutzen also main.c.<br />
Also main soll im letzteren code-teil sein.</p>
<p>Ich versuche mal (wie vorgeschlagen) den code so zu schreiben wie wenn ich die templates in c verwenden könnte:</p>
<pre><code class="language-cpp">/*
 * This is my C-Program
 * */

#include &quot;stdlib.h&quot;

int main()
{
    int* data = calloc(10, sizeof(int));

    for (int i = 10; i &gt; 0; i--)
        data[10-i] = i;

    // Hier würde ich gern data über die C++ Klasse
    // so ändern dass in data in aufsteigender 
    // art die i's gespeichert sind.

    // Ich habe schwierigkeiten mich richtig auszudrücken:
    // Ich habe hier in meinem C-code eine struktur data
    // (vereinfacht ein array) die eben anders ist als
    // Objekte vom Typ MyC. Ich möchte aber über Algorithm
    // mein hieriges data so ändern wie wenn ich MyB.Algorithm()
    // aufrufen würde. Dazu brauche ich wohl erstmal sowas wie
    // eine methode die mir mein data in ein MyC Objekt verändert
    // oder? ALso so ein Mapping zwischen den Datenstrukturen.
    //
    // Im Prinzip sind es zwei dinge die ich nicht ganz verstehe.
    // 1. Wie verbinde ich beide codes so das ich aus c die c++
    // sachen aufrufen kann. das wäre dann so ein aufruf wie:
    MyC&lt;int&gt; * mtx = new MyC&lt;int&gt;();
    MyB&lt;int&gt;().Algorithm(mtx);

    // UND 2. habe ich hier in meinem c-programm ja andere datenstrukturen
    // (hier ist es jetzt nur vereinfacht ein array aber es könnte
    // ja auch eine komplexe structure sein). Und hier verstehe ich 
    // eben auch nicht wie ich denn ausgehend von meinen hierigen
    // datenstrukturen (data) den c++ code nutzen könnte also so in 
    // etwa:
    MyC&lt;int&gt;* mtx = convert_data_to_MyC(data);
    MyB&lt;int&gt;().Algorithm(mtx);
    *data = convert_MyC_to_data(mtx);

    // Es wäre sehr schön wenn letzteres gehen würde. Im Prinzip
    // sollte dann ja die folgende ausgabe wieder aufsteigende 
    // i's ausgeben innerhalb data.  

    for (int i = 0; i &lt; 10; i++)
        printf(&quot;data[%d] = %d\n&quot;, i, data[i]);

    free(data);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1841254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841254</guid><dc:creator><![CDATA[Testo]]></dc:creator><pubDate>Tue, 19 Jan 2010 10:38:18 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Tue, 19 Jan 2010 12:05:12 GMT]]></title><description><![CDATA[<p>dann mal (beispielsweise) hier den Code, wie du ihn schreiben könntest:</p>
<pre><code class="language-cpp">//main.c
#include &quot;myc_wrapper.h&quot;
#include &quot;myb_wrapper.h&quot;

int main()
{
    /*...*/
    //MyC&lt;int&gt; * mtx = new MyC&lt;int&gt;();
    WrapMyC_int mtx = myc_int_create(); //konstruktor

    //MyB&lt;int&gt;().Algorithm(mtx);        
    WrapMyB_int tmp = myb_int_create(); //konstruktor
    myb_int_algorithm(tmp, mtx);        //methode

    myc_int_delete(mtx);                //destruktor
    myb_int_delete(tmp);                //destruktor

    /*...*/
    //MyC&lt;int&gt;* mtx = convert_data_to_MyC(data);
    WrapMyC_int mtx = myc_int_create_1(data); //anderer konstruktor

    //MyB&lt;int&gt;().Algorithm(mtx);
    WrapMyB_int tmp = myb_int_create(); //konstruktor
    myb_int_algorithm(tmp, mtx);        //methode
    myc_int_writetobuffer(mtx, data);   

    myc_int_delete(mtx);                //destruktor
    myb_int_delete(tmp);                //destruktor
}
</code></pre>
<p>C/C++-Header, ich hab mal beide zusammengeschmissen:</p>
<pre><code class="language-cpp">//myc_wrapper.h, myb_wrapper.h
#ifdef __cplusplus
extern &quot;C&quot;
{
#endif

typedef struct WrapMyB_int_
{ 
  void* ptr;
} WrapMyB_int;

typedef struct WrapMyC_int_
{ 
  void* ptr;
} WrapMyC_int;

WrapMyB_int myb_int_create(void);
void myb_int_algorithm(WrapMyB_int this_, WrapMyC_int arg);
void myb_int_delete(WrapMyB_int this_); 

WrapMyC_int myc_int_create(void);
WrapMyC_int myc_int_create_1(int* data);
void myc_int_writetobuffer(WrapMyC_int this_, int* buffer);
void myc_int_delete(WrapMyC_int this_); 

#ifdef __cplusplus
} /*end extern &quot;C&quot;*/
#endif
</code></pre>
<p>C++-Definition:</p>
<pre><code class="language-cpp">#include &quot;myc_wrapper.h&quot;
#include &quot;myb_wrapper.h&quot;
#include &quot;myc.hpp&quot; //MyC&lt;T&gt;
#include &quot;myb.hpp&quot; //MyB&lt;T&gt;

WrapMyB_int myb_int_create(void)
{
  WrapMyB_int tmp;
  tmp.ptr = new MyB&lt;int&gt;();
  return tmp;
}
void myb_int_algorithm(WrapMyB_int this_, WrapMyC_int arg)
{
  MyB&lt;int&gt;* mb = static_cast&lt;MyB&lt;int&gt;*&gt; this_.ptr;
  mb-&gt;Algorithm(arg);
}
void myb_int_delete(WrapMyB_int this_)
{
  MyB&lt;int&gt;* mb = static_cast&lt;MyB&lt;int&gt;*&gt; this_.ptr;
  delete mb;
  this_.ptr = NULL;
}

//der Rest sei dir zur Übung überlassen ;)
WrapMyC_int myc_int_create(void)
{
  /* ... */
}
WrapMyC_int myc_int_create_1(int* data)
{
  /* ... */
}
void myc_int_writetobuffer(WrapMyC_int this_, int* buffer)
{
  /* ... */
}
void myc_int_delete(WrapMyC_int this_)
{
  /* ... */
}
</code></pre>
<p>Der Clou ist: du kanns in C keine Klassen oder Poitner darauf rumreichen, weil C nicht weiß was das ist. Du reichst stattdessen einen voidpointer rum und nur der C++-Code weiß dass er das Ding auf eine Klasse umcasten kann und wie der zu benutzen ist.<br />
Aus jedem Konstruktor machst du eine Funktion, die ein entsprechendes wrapper-struct zurückliefert.<br />
Aus allen anderen Methoden inklusive Destruktoren machst du Funktionen, die die gleichen Rückgabewerte haben und zusätzlich zu den normalen Parametern noch das Wrapperstruct als this-Parameter übernehmen.</p>
<p>Da Templates keine Klassen sind sondern nur ihre Instantiierungen Klassen sind, musst du das Ganze für jede Template-Instantiierung machen, die du vom C-Code aus benutzen willst. Oben habe ich das bei MyC und MyB jeweils nur für int gemacht.<br />
Da das immer wieder das selbe ist, hab ich in meinem ersten Beispiel ein langes Makro draus gemacht, das mir die Funktionsdeklarationen udn -definitionen jeweils für int, short und float generiert hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1841325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841325</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 19 Jan 2010 12:05:12 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Tue, 19 Jan 2010 12:19:10 GMT]]></title><description><![CDATA[<p>Wobei mir immer noch schleierhaft ist, WARUM du das machst.<br />
Sobald du in der main von CODE_OTHER rumfummelst, ist das nicht mehr das, was jeder User runterlädt.<br />
Andererseits hast du auch ne main in CODE_MY, den du ohne weiteres auch mit C-Code füttern kannst und vor allem abändern.</p>
<p>Was ist eigentlich der Hintergrund, dass du dich genötigt siehst fremden Code in C zu verwenden und zu ändern, nur damit du deinen eigenen C++-Code einfügen kannst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1841339</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841339</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 19 Jan 2010 12:19:10 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Tue, 19 Jan 2010 13:03:21 GMT]]></title><description><![CDATA[<blockquote>
<p>Was ist eigentlich der Hintergrund, dass du dich genötigt siehst fremden Code in C zu verwenden und zu ändern, nur damit du deinen eigenen C++-Code einfügen kannst?</p>
</blockquote>
<p>Naja: Wenn ich meinen Code nutzbar machen will in CODE_OTHER geht das doch nicht anders. Ich will dass die algorithmen innerhalb CODE_OTHER auf CODE_MY zurückgreifen können. Wäre das so nicht der richtige weg?</p>
<p>@ Pumuckl:<br />
Herzlichen Dank für das Beispiel. Mir wird vieles klarer. Ich versuche gerade das Beispiel zu kompilieren. Sehe ich das richtig dass ich aus dem C++ code erstmal eine library (static) erstellen muss. Ich mache das unter linux im moment so:</p>
<pre><code>ar rcs libmaincpp.a MyB.o MyC.o
</code></pre>
<p>Anschließend gehe ich zu dem &quot;neuen&quot; C-code der dne c++ code nutzen. Sehe ich das richtig dass ich hier dann gegn die library linken muss:</p>
<pre><code>gcc -o mainnew mainnew.c -L lmaincpp.a
</code></pre>
<p>oder so ählnich?</p>
<p>Aufgrund der undefined refeerences vermute ich dass beim linken etwas faul wird...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1841365</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841365</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Tue, 19 Jan 2010 13:03:21 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Tue, 19 Jan 2010 13:23:59 GMT]]></title><description><![CDATA[<p>Ich bin weiterhin verwirrt wie ich eine LIbrary erstellen soll die nur aus headern besteht !? Bei der benutzung von templates kann ich doch nur header erstellen...ich habe keine *.cpp file für MyC.h ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1841380</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841380</guid><dc:creator><![CDATA[Testo]]></dc:creator><pubDate>Tue, 19 Jan 2010 13:23:59 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Tue, 19 Jan 2010 13:40:00 GMT]]></title><description><![CDATA[<p>Testo schrieb:</p>
<blockquote>
<p>Ich bin weiterhin verwirrt wie ich eine LIbrary erstellen soll die nur aus headern besteht !? Bei der benutzung von templates kann ich doch nur header erstellen...ich habe keine *.cpp file für MyC.h ?</p>
</blockquote>
<p>Dann hast du pumuckl &amp; Co nicht verstanden.</p>
<p>Du musst für deinen C++ Code einen Wrapper schreiben, und dort musst du die Templates auch auf konkrete Typen festlegen. Anders geht es nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1841385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841385</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 19 Jan 2010 13:40:00 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Tue, 19 Jan 2010 13:44:37 GMT]]></title><description><![CDATA[<p><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="😞"
    /> Jetzt versteh ich nur noch Bahnhof.<br />
Ich dachte den wrapper hat pumuckl mir schon geschrieben. Da sind doch die cpp wrapper oder nicht? MIr istklar dass ich da in den leeren wappern noch was füllen muss...sehe ihc das falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1841387</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841387</guid><dc:creator><![CDATA[Testo]]></dc:creator><pubDate>Tue, 19 Jan 2010 13:44:37 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Tue, 19 Jan 2010 13:48:49 GMT]]></title><description><![CDATA[<p>Testo schrieb:</p>
<blockquote>
<p><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="😞"
    /> Jetzt versteh ich nur noch Bahnhof.<br />
Ich dachte den wrapper hat pumuckl mir schon geschrieben. Da sind doch die cpp wrapper oder nicht? MIr istklar dass ich da in den leeren wappern noch was füllen muss...sehe ihc das falsch?</p>
</blockquote>
<p>Also ich sehe in seinem Wrapper durchaus cpp-Dateien. Und eben diese bilden deine Schnittstelle für C (Sprich: Sind Teil der C++ Bibliothek, und nicht etwa des C-Programmes).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1841391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841391</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 19 Jan 2010 13:48:49 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Tue, 19 Jan 2010 13:59:52 GMT]]></title><description><![CDATA[<p>Es tut mir echt leid aber ich schaffe es aus eigener Kraft nicht.<br />
Ich beschreibe es nochmal was ich tue:</p>
<p>Ich habe C++ code:<br />
// MyC.h</p>
<pre><code class="language-cpp">#ifndef MyC_
#define MyC_

#include &lt;iostream&gt;

template&lt;class T&gt; class MyC
{
    public:
    MyC&lt;T&gt;() { 
        data = new T[10];
        memset(data, 0, 10*sizeof(T));
    }
    ~MyC&lt;T&gt;() { delete [] data; }
    void print(MyC&lt;int&gt;* mtx);
    T* data;
};

template &lt;&gt; void
MyC&lt;int&gt;::print(MyC&lt;int&gt;* mtx)
{
   // Hier z.B. mtx ausgeben oder andere
   // Dinge mit mtx tun...
     int a;
     for (int i = 0; i &lt;10; i++)
        std::cout &lt;&lt; mtx-&gt;data[i] &lt;&lt; std::endl;
}

#endif
</code></pre>
<p><a href="//MyB.h">//MyB.h</a></p>
<pre><code class="language-cpp">#ifndef MyB_
#define MyB_

#include &quot;MyC.h&quot;

template&lt;class T&gt; class MyB
{
    public:
        MyB&lt;T&gt;() {
            mydata = new T[10];
        }
        // do something with mtx
        void Algorithm(MyC&lt;T&gt;*&amp; mtx) {
            for (int i= 0; i &lt; 10; i++)
                mtx-&gt;data[i] = i;

            mtx-&gt;print(mtx);
            memcpy(mtx-&gt;data,mydata,10*sizeof(T));
        }
        T* mydata;
};

#endif
</code></pre>
<p>Und so wie ich es vertanden habe brauche ich für diese Klassen jetz wrapper:<br />
Also cpp-wrapper:<br />
// myb_wrapper.h</p>
<pre><code class="language-cpp">#ifdef __cplusplus
extern &quot;C&quot;
{
#endif

    typedef struct WrapMyB_int_
    {
        void* ptr;
    } WrapMyB_int;

    WrapMyB_int myb_int_create(void);
    void myb_int_algorithm(WrapMyB_int this_, WrapMyC_int arg);
    void myb_int_delete(WrapMyB_int this_);

#ifdef __cplusplus
} /*end extern &quot;C&quot;*/
#endif
</code></pre>
<p>die myb_wrapper.cpp</p>
<pre><code class="language-cpp">#include &quot;myb_wrapper.h&quot;
#include &quot;myc_wrapper.h&quot;
#include &quot;C++/MyB.h&quot; //MyB&lt;T&gt;

WrapMyB_int myb_int_create(void)
{
    WrapMyB_int tmp;
    tmp.ptr = new MyB&lt;int&gt;();
    return tmp;
}
void myb_int_algorithm(WrapMyB_int this_, WrapMyC_int arg)
{
    MyB&lt;int&gt;* mb = static_cast&lt;MyB&lt;int&gt;*&gt; (this_.ptr);
    //mb-&gt;Algorithm(arg);
}
void myb_int_delete(WrapMyB_int this_)
{
    MyB&lt;int&gt;* mb = static_cast&lt;MyB&lt;int&gt;*&gt; (this_.ptr);
    delete mb;
    this_.ptr = NULL;
}
</code></pre>
<p>und analog:<br />
//myc_wrapper.h</p>
<pre><code class="language-cpp">#ifdef __cplusplus
extern &quot;C&quot;
{
#endif

    typedef struct WrapMyC_int_
    {
        void* ptr;
    } WrapMyC_int;

    WrapMyC_int myc_int_create(void);
//     WrapMyC_int myc_int_create_1(int* data);
//     void myc_int_writetobuffer(WrapMyC_int this_, int* buffer);
    void myc_int_delete(WrapMyC_int this_);

#ifdef __cplusplus
} /*end extern &quot;C&quot;*/
#endif
</code></pre>
<p>und die cpp myc_wrapper.cpp</p>
<pre><code class="language-cpp">#include &quot;myc_wrapper.h&quot;
#include &quot;C++/MyC.h&quot; //MyC&lt;T&gt;

WrapMyC_int myc_int_create(void)
{
    WrapMyC_int tmp;
    tmp.ptr = new MyC&lt;int&gt;();
    return tmp;
}
// WrapMyC_int myc_int_create_1(int* data)
// {
// 
// }
// void myc_int_writetobuffer(WrapMyC_int this_, int* buffer)
// {
//         /* ... */
// }
void myc_int_delete(WrapMyC_int this_)
{
    MyC&lt;int&gt;* mc = static_cast&lt;MyC&lt;int&gt;*&gt; (this_.ptr);
    delete mc;
    this_.ptr = NULL;
}
</code></pre>
<p>Jetzt kompiliere ich folgendes:</p>
<pre><code>g++ -c myb_wrapper.cpp
g++ -c myc_wrapper.cpp
</code></pre>
<p>und erhalte objekte davon.<br />
Ich baue mir eine statische library über</p>
<pre><code>ar -r libmyLib.a myc_wrapper.o myb_wrapper.o
</code></pre>
<p>Jetzt habe cih meinen C-Code:<br />
<a href="//mainnew.c">//mainnew.c</a></p>
<pre><code class="language-cpp">//main.c
#include &quot;myc_wrapper.h&quot;
#include &quot;myb_wrapper.h&quot;

#include &quot;stdlib.h&quot;

int main()
{
    int i;
    int* data = calloc(10, sizeof(int));

    for (i = 10; i &gt; 0; i--)
        data[10-i] = i;

    /*...*/
    //MyC&lt;int&gt; * mtx = new MyC&lt;int&gt;();
    WrapMyC_int mtx = myc_int_create(); //konstruktor

    //MyB&lt;int&gt;().Algorithm(mtx);        
    WrapMyB_int tmp = myb_int_create(); //konstruktor
    //myb_int_algorithm(tmp, mtx);        //methode

    myc_int_delete(mtx);                //destruktor
    myb_int_delete(tmp);                //destruktor

    /*...*/
//     //MyC&lt;int&gt;* mtx = convert_data_to_MyC(data);
//     WrapMyC_int mtx2 = myc_int_create_1(data); //anderer konstruktor
//    
//     //MyB&lt;int&gt;().Algorithm(mtx);
//     WrapMyB_int tmp2 = myb_int_create(); //konstruktor
//     myb_int_algorithm(tmp2, mtx2);        //methode
//     myc_int_writetobuffer(mtx2, data);  
//    
//     myc_int_delete(mtx2);                //destruktor
//     myb_int_delete(tmp2);                //destruktor
//     
//     for (i = 0; i &lt; 10; i++)
//         printf(&quot;data[%d] = %d\n&quot;, i, data[i]);

    free(data);
}
</code></pre>
<p>Den ich kompiliere über:</p>
<pre><code>gcc -o mainnew mainnew.c -L lmyLib.a
</code></pre>
<p>Ich erhalte aber folgende Probleme:</p>
<pre><code>/tmp/cc0e4n2e.o: In function `main':
mainnew.c:(.text+0x57): undefined reference to `myc_int_create'
mainnew.c:(.text+0x6b): undefined reference to `myb_int_create'
mainnew.c:(.text+0x7f): undefined reference to `myc_int_delete'
mainnew.c:(.text+0x8a): undefined reference to `myb_int_delete'
collect2: ld gab 1 als Ende-Status zurück
</code></pre>
<p>Was mache ich falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1841399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841399</guid><dc:creator><![CDATA[Testo]]></dc:creator><pubDate>Tue, 19 Jan 2010 13:59:52 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Tue, 19 Jan 2010 15:15:14 GMT]]></title><description><![CDATA[<p>Du mußt ein kleines 'l' für das Linken verwenden (das große 'L' bezeichnet den Pfad zu den Linkerdateien):</p>
<pre><code>gcc -o mainnew mainnew.c -lmyLib
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1841459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841459</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Tue, 19 Jan 2010 15:15:14 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Tue, 19 Jan 2010 15:16:04 GMT]]></title><description><![CDATA[<p>fällt dir was auf?</p>
<pre><code>ar -r libmyLib.a myc_wrapper.o myb_wrapper.o
</code></pre>
<pre><code>gcc -o mainnew mainnew.c -L lmyLib.a
</code></pre>
<p>Wie heißt die Lib denn nu wirklich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1841460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841460</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 19 Jan 2010 15:16:04 GMT</pubDate></item><item><title><![CDATA[Reply to Templates in C möglich machen? on Tue, 19 Jan 2010 15:26:11 GMT]]></title><description><![CDATA[<blockquote>
<p>und dort musst du die Templates auch auf <strong>konkrete</strong> Typen festlegen.</p>
</blockquote>
<p>was irgendwo die Templates sinnlos macht... Aber scheint mir auch die einzige vernünftige Lösung zu sein. Wobei mir der Sinn des Ganzen immernoch nicht klar ist. Sollen die &quot;User&quot; halt nen C++-Compiler benutzen. Man kann nunmal nicht alles haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1841466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1841466</guid><dc:creator><![CDATA[it0101@loggedoff]]></dc:creator><pubDate>Tue, 19 Jan 2010 15:26:11 GMT</pubDate></item></channel></rss>