2016-06-30 8 views
2

Ich benutze eine Funktion von SDL, und einer der Parameter ist vom Typ const GLchar* const*, also um es aufzurufen, würde ich übergeben müssen eine Referenz einer C-Zeichenfolge wie folgt:C++ Übergabe von std :: string in Pointer-zu-C-String Parameter

const char *str = "test"; 
glShaderSource(... , &str, ...); 

ich habe jedoch ein std::string, die ich in übergeben will, und so etwas zu tun gibt einen Fehler:

std::string str = "test"; 
glShaderSource(... , &str.c_str(), ...); 

ich weiß, dass ich kann einfach eine neue const char* Variable erstellen und die std::string dazu speichern e dies:

const char *cstr = str.c_str(); 

Aber gibt es einen Weg um dies? Ich mag es nicht, eine neue Variable zu machen. Ich habe versucht, ein Lambda zu verwenden, aber das hat nicht funktioniert.

+0

Ups, es ist ein Betrogener. –

Antwort

5

Nein, daran ist kein Weg vorbei.

Die Funktion glShaderSource einen Zeiger auf einen Zeiger auf einen Zeichenpuffer braucht (weil es Sie will ein oder mehr C-Strings übergeben), und Sie können die Adresse eines rvalue nicht nehmen (was, was das ist Ausdruck str.c_str() ist).

Aber das ist nicht wirklich ein Problem, da Sie in Ihrem letzten Beispiel nur einen Zeiger auf einen Zeiger zuweisen. Das ist extrem billig und einfach.

Haben Sie keine Angst vor "eine neue Variable zu machen" — Benennung der Dinge ist sowieso gut.

+0

Okay, danke! –

0

Ich denke, die Frage ist: Warum benötigt die Funktion einen Zeiger auf einen Zeiger? In vielen Fällen mit C-Style-Funktionen stellen sie diese Art von Schnittstelle bereit, da sie den Zielzeiger so modifizieren möchten, dass er auf etwas anderes zeigt (z. B. etwas, das intern von der Funktion erstellt wurde). Wenn das der Fall ist, dann ist das Zuweisen des Ergebnisses von string::c_str() zu einer Variablen und das anschließende Eingeben sinnlos, da es neu zugewiesen würde, um auf etwas anderes zu verweisen.

Ich empfehle Ihnen, die Dokumentation dieser Funktion genauer zu überprüfen, um sicherzustellen, dass dies nicht der Fall ist (was es wahrscheinlich ist).

+0

Aus der Frage: _ "Einer der Parameter ist vom Typ" const GLchar * const * '" _. Wenn Sie die Funktion nachschlagen, werden Sie feststellen, dass sie ein _array_ von Zeigern an Zeichenfolgen erwartet. –

+0

Das heißt, wenn Sie die Dokumentation überprüft hätten, hätten Sie gesehen, dass diese Antwort die Frage überhaupt nicht behandelt. :) –

+0

Aber hängen Sie auf eine Sekunde hier @LightnessRacesinOrbit. Nach deinem Kommentar habe ich die Dokumentation überprüft und es zeigt, dass ich genau richtig bin. Der Parameter * ist * tatsächlich ein Ausgabeparameter, wie ich es vermutete (siehe [hier] (https://www.opengl.org/sdk/docs/man/html/glShaderSource.xhtml)). Was ist das Problem mit meiner Antwort? – Smeeheey