[...]has no member named[...] Load OpenGL Functions



  • Hallo.
    Ich kann recht gut in jave programmieren, wollte aber mal etwas neues ausprobieren. C++. Also habe ich einfach mal angefangen, learning by doing.

    mein problem ist, dass momentan meine member function in einer klasse nicht erkannt werden.
    Hier der Header:

    #include <GL/glext.h>
    class GLF {
    public:
    	GLF();
    	PFNGLATTACHSHADERPROC	attachShader;
    	PFNGLCOMPILESHADERPROC	compileShader;
    	PFNGLCREATEPROGRAMPROC	createProgram;
    	PFNGLCREATESHADERPROC	createShader;
    	PFMGLGETSHADERIVPROC	getShaderiv;
    	PFNGLLINKPROGRAMPROC	linkProgram;
    	PFNGLSHADERSOURCEPROC	shaderSource;
    };
    

    Hier die klasse:

    #include <GLF.h>
    
    GLF::GLF(){
    	attachShader	= (PFNGLATTACHSHADERPROC)	glfwGetProcAddress("glAttachShader");
    	compileShader	= (PFNGLCOMPILESHADERPROC)	glfwGetProcAddress("glCompileShader");
    	createProgram	= (PFNGLCREATEPROGRAMPROC)	glfwGetProcAddress("glCreateProgram");
    	createShader	= (PFNGLCREATESHADERPROC)	glfwGetProcAddress("glCreateShader");
    	getShaderiv		= (PFMGLGETSHADERIVPROC)	glfwGetProcAddress("glGetShaderiv");
    	linkProgram		= (PFNGLLINKPROGRAMPROC)	glfwGetProcAddress("glLinkProgram");
    	shaderSource	= (PFNGLSHADERSOURCEPROC)	glfwGetProcAddress("glShaderSource");
    }
    

    (ich benutze http://www.glfw.org/)

    Allerdings habe ich scheinbar noch nicht ganz verstanden, wie ich jetzt die function pointer zugreif und sie aufrufe.

    (Auszug aus Test.ccp)
    So mache ich es im moment:

    GLF* glf = (GLF*)pointer;
               int vertexShader = glf->createShader(GL_VERTEX_SHADER);
    

    Allerdings bekomme ich dan noch beim Compilen diesen Fehler:

    [apply] [...]Test.cpp:16:35: error: 'class GLF' has no member named 'createShader'

    Kann mir da jemand helfen?
    Viele Grüße 0:08



  • Willst Du wirklich versuchen C++ zu programmieren ohne Dich mit der Sprache vorher vertraut zu machen?



  • Ich wollte mich mit der Sprache vertraut machen, indem ich C++ programmiere.
    Im Wissen, dass google mein Freund ist.

    Das hat bis jetzt gut Funktioniert.



  • Damit wirst du bei C++ auf die Fresse fallen. Viel Glueck.



  • Hm, das scheint mir ein subtiler Hinweis zu sein, eventuell doch mal nach einem umsteiger Tutorial zu suchen.

    Aber mag noch mal jemand auf meine Ursprungsfrage zurueckkommen, oder habe ich da etwas so verhutzelt, dass das Ganze erstmal mit einem nah zur Seite geschoben werden sollte?



  • int vertexShader = (glf->createShader)(GL_VERTEX_SHADER);
    ~Bashar hat recht.~

    Sieht aber schon seltsam aus...



  • Caligulaminus schrieb:

    int vertexShader = (glf->createShader)(GL_VERTEX_SHADER);
    

    Sieht aber schon seltsam aus...

    Ist auch überflüssig.

    Der vom OP gepostete Code ist eigentlich (soweit man das anhand der Ausschnitte beurteilen kann) korrekt. Insbesondere ist die Fehlermeldung, createShader sei kein Member der Klasse, offensichtlich falsch. Also muss wohl der gepostete Code ein anderer sein als der, der das Problem verursacht.



  • Ich sehe jetzt auch nix, was diesen Fehler verursacht.
    Aber eigentlich sollte der Compiler noch darueber stolpern:

    PFMGLGETSHADERIVPROC heißt PFNGLGETSHADERIVPROC



  • Oh, ein purer tip Fehler.
    Ich habe das M durch ein N ersetzt und jetzt geht alles.
    (Wenn ich das N jetzt wider zum M mache heißt es wieder

    'class GLF' has no member named 'createShader'

    . Achja... Ursache und Wirkung ?)

    Es tut mir leid, dass ich euch jetzt wegen so einem M genervt habe.

    Ein schönes Wochenende:
    0:08



  • Nochmal eine Nachfrage: Ist die Fehlermeldung (no member named createShader) die erste vom Compiler gemeldete?

    Falls ja Frage an alle: Wie ist das zu erklären?

    (Falls nein: Die erste Fehlermeldung ist immer relevant und oft die einzige relevante.)



  • Fehler oder Warnungen?



  • 0_08 schrieb:

    Fehler oder Warnungen?

    Fehler im Output des Compilers, nicht aus irgendeiner Liste der IDE.



  • Das ist mir durchaus bewusst.
    Aber ich habe ja auch noch z.B. sowas hier:

    [apply] [...]Shader.cpp:10:15: warning: unused variable 'isCompiled' [-Wunused-variable]
    

    Aber es stimmt, gefuelte tausend Zeilen darueber habe ich das hier gefunden:

    [apply] The ' characters around the executable and arguments are
    [apply] not part of the command.
    [apply] In file included from [...]Shader.cpp:7:0:
    [apply] cjgPack/src/GLF.h:12:2: error: 'PFMGLGETSHADERIVPROC' does not name a type
    [apply] PFMGLGETSHADERIVPROC getShaderiv;
    [apply] ^

    o.o Muss man aber auch erstmal nach suchen, wenn man nur ein (no member named createShader) sieht.



  • Da muss man nicht nach suchen, das ist einfach von oben der erste Fehler... falls man den vor lauter Warnungen nicht findet, macht man vorher die Warnungen weg (sollte man sowieso).

    edit: Man beseitigt die Ursachen für die Warnungen mein ich natürlich, nicht einfach das Warnlevel runtersetzen 😉



  • Achtung bei der Formulierung: Warning sollten prinzipiell aktiviert sein, damit sie entfernt werden können.

    Umgekehrt hast du natürlich Recht, dass man, um solche Fehler zu suchen, die Warnungen ruhig abschalten kann/soll.

    Aber mal grad eine Story aus meinem Leben: Hatte jetzt die Tage einen Fehler in einem Lambda-Ausdruck für std::accumulate. Und die ersten 200 Zeilen des Compilerfehlers (MSVC2013) bezogen sich nur auf den STL Code, bis endlich mal auf meinen Code referenziert wurde. 😉
    Man kann aber dazu sagen, dass die alleroberste Meldung sowas sagte wie "Das Ding passt hier nicht hin".


Anmelden zum Antworten