double pointer an template Funktion übergeben



  • Hallo, ich möchte meien 2D Matrix mit einer Funktion allokieren, dazu wollte ich neben der Funktion für den DAtentyp int auch eine für die anderen haben, also ein template...

    Mein VS 13 zeigt mir auch keine Fehler an im Code und als normale Funktion geht das Progamm auch, wenn es allerdings als template ist, bekomme ich diesen Fehler beim compilieren:

    1>main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""void __cdecl reservieren<int *>(int * *,int,int)" (??$reservieren@PAH@@YAXPAPAHHH@Z)" in Funktion "_main".

    1>C:\Users\Rarebit\Documents\Visual Studio 2013\Projects\OOP\oop_a8\Debug\oop_a8.exe : fatal error LNK1120: 1 nicht aufgelöste Externe

    Mein Code:

    int** Mi;
    
    	// Speicher fuer Matrizen reservieren
    reservieren(Mi, zeilen, spalten);
    
    template<typename T> void reservieren(T** pointerHolder, int zeilen, int spalten)
    {
    	pointerHolder = new T* [zeilen];
    	for (size_t i = 0; i < zeilen; i++)
    	{
    		pointerHolder[i] = new T[spalten];
    	}
    }
    

    Ich hoffe ich war nicht blind als ich die Suchfunktion befragt habe und danke schon mal,
    Rarebit



  • Hallo, bin selbst noch nicht so firm in templates.

    Aber müsste es nicht so sein:

    Edit: Vergiss es...

    int** Mi;
    
        // Speicher fuer Matrizen reservieren
    reservieren<int**>(Mi, zeilen, spalten);
    

    Vielleicht hilfts...

    dirkski

    Edit: bei mir funzt das (g++ 4.9), aber alles in einer Datei:

    #include <cstddef>
    
    template<typename T> void reservieren(T** pointerHolder, int zeilen, int spalten)
    {
        pointerHolder = new T* [zeilen];
        for (size_t i = 0; i < zeilen; i++)
        {
            pointerHolder[i] = new T[spalten];
        }
    }
    
    int main() {
      int** Mi, zeilen = 1, spalten = 1;
    
          // Speicher fuer Matrizen reservieren
      reservieren(Mi, zeilen, spalten);
    
      return 0;
    }
    


  • Sieht eher nach "Funktionstemplate in der cpp Datei statt im Header definiert" aus. Dazu brauchst du noch mindestens einen Pointer oder Referenz extra weil dein Aufruf den Wert von Mi ändern soll.



  • #include <cstddef> war nicht drinnen.
    Das etwas zusätzlich inkludiert werden muss habe sie nicht in der Vorlesung oder auf dem Übungsblatt erwähnt...

    danke an dirkski 🙂



  • Rarebit schrieb:

    #include <cstddef> war nicht drinnen.
    Das etwas zusätzlich inkludiert werden muss habe sie nicht in der Vorlesung oder auf dem Übungsblatt erwähnt...

    danke an dirkski 🙂

    Hmm Danke, aber das kann es eigentlich nicht gewesen sein,
    das hätte eine andere Fehlermeldung gegeben.

    Und Dank geht an STackoverflow, ich musste auch erst suchen wo
    size_t definiert ist 😃

    Normalerweise ist das schon mit drin wenn man <string> o.ä.
    includiert....



  • das ist nur seltsam da ich die Funktion fest für eine int Matrix geschrieben habe und es lief


  • Mod

    dirkski schrieb:

    Normalerweise ist das schon mit drin wenn man <string> o.ä.
    includiert....

    Kann und sollte man sich nicht drauf verlassen. Wo etwas genau definiert ist, kann man in Referenzen nachlesen:
    http://www.cplusplus.com/
    http://en.cppreference.com/w/

    Für std::size_t:
    http://en.cppreference.com/w/cpp/types/size_t
    http://www.cplusplus.com/reference/cstring/size_t/

    Oha! Hier widersprechen sich die Referenzen sogar 😮
    Die erste sagt cstddef, cstdio, cstring (nicht zu verwechseln mit string!), ctime und cstdlib (seit C++11); die zweite sagt zusätzlich noch cwchar. Da muss man dann also tatsächlich mal den Sprachstandard zu rate ziehen (oder eben nicht cwchar nehmen). Der Sprachstandard sagt, dass cwchar tatsächlich eine Definition von size_t enthalten sollte. Der Header ist wohl zu obskur und wurde daher in der ersten Referenz vergessen. Ein Glück ist es eine Wiki und ich kann es ergänzen 🙂



  • Rarebit schrieb:

    #include <cstddef> war nicht drinnen.
    Das etwas zusätzlich inkludiert werden muss habe sie nicht in der Vorlesung oder auf dem Übungsblatt erwähnt...

    danke an dirkski 🙂

    Der Fehler lag sicher nicht am fehlenden cstddef Header. Außerdem: Wenn size_t dann bitte nicht mit anderen Typen mischen. In deinem Fall vergleichst du ein size_t und ein int in deiner Bedingung für die for Schleife.



  • das ist mir ein wenig peinlich, es geht doch nicht, ich muss aus Versehen in der main was auskommentiert haben... auf jeden Fall besteht das Problem weiter. Ich habe das size_t durch int ersetzt.

    Es muss an dem Template liegen, wenn die Funktion fest schreibe mit einem Datentyp angegeben, dann läuft es.

    Wenn ich aber die Funktion bzw in dem Fall das template in der main Datei erstelle klappt es, habe es ausprobiert, so wie dirkski es schon gemacht hat.

    Was ist der Unterschied der beiden Methoden das es einmal geht und einmal nicht?



  • @Rarebit

    sebi707 schrieb:

    Sieht eher nach "Funktionstemplate in der cpp Datei statt im Header definiert" aus.

    Also: Wo steht die Definition (Implementierung) deines Funktions-Tempaltes?



  • Rarebit Loginfaul schrieb:

    Wenn ich [...] klappt es, habe es ausprobiert, so wie dirkski es schon gemacht hat.

    Da klappt gar nichts.
    Evtl. kompiliert das, aber das einzige, was das Programm macht, ist, ein Speicherleck produzieren.

    Ausserdem müssen wir wissen, wie das Programm ganz aussieht. Auch, wie der Quellcode auf verschiedene Dateien aufgeteilt ist. siehe: Wie man Probleme nachstellbar und nachvollziehbar macht Ach, sieh an: da ist sogar ein Link auf ein FAQ zum Thema "undefined references" drin! https://www.c-plusplus.net/forum/246875

    Ausserdem siehe noch diesen Thread: https://www.c-plusplus.net/forum/335401

    Ich schlage vor: Du löst die Aufgabe erstmal konkret für int, und wenn das funktioniert machste ein Template draus.


Log in to reply