Comment passer un std::string en glShaderSource?
J'ai le code suivant:
glShaderSource(shader, 1, (const char **)data.c_str(), NULL);
Mais il rend mon programme crash. Comment puis-je convertir des std::string
en const char **
?
J'ai aussi essayé (const char **)&
, mais il a dit "exige l-valeur" dont je ne comprends pas. Il fonctionne très bien lorsque j'utilise ce code:
const char *data = "some code";
glShaderSource(shader, 1, &data, NULL);
Mais je ne peux pas le faire fonctionner directement à partir d'un std::string
. Je peut allouer une nouvelle char
tableau pour cela, mais ce n'est pas bon code.
J'ai aussi essayé avec const GLchar
mais évidemment, il ne fait aucune différence.
- Jetez un oeil à cette fonction documentation. Il doit y avoir une raison, il prend un pointeur vers un pointeur. Soi-disant c'est un paramètre de sortie, et la fonction écrit un
char*
à la déréférencéchar**
. Dans ce cas, vous devez passer l'adresse d'un vrai pointeur, et non pas de certains temporaire retourné parstd::string::c_str()
. - Ce n'est pas un paramètre de sortie, il s'attend à un tableau de c-strings.
- Ah, oui, j'ai oublié à propos de cette possibilité.
- Je pense que cette question est encore un autre de "pourquoi je ne peux pas le faire..." alors que la vraie question devrait être: "pourquoi voudriez-vous?". Vous êtes un casting pour un incompatible type de pointeur. Il n'est pas toujours censé fonctionner. Je pense qu'il est censé faire de vous arrêter et de réfléchir qu'est-ce que vous ne comprenez pas sur
glShaderSource
. 15 secondes de google aurait dit que le 3ème argument "Spécifie un tableau de pointeurs sur des chaînes de caractères contenant le code source pour être chargé dans le shader.". Le titre de votre question est totalement trompeuse: vous vous ne pouvez pas faire une telle conversion.
Vous devez vous connecter pour publier un commentaire.
data.c_str()
renvoie uneconst char*
, donc cela:c_str
quelque part:const char*c_str;
. Puis, au moment de l'utilisation, essayez ceci:glShaderSource(shader, 1, &(c_str=data.c_str()), NULL);
glShaderSource
attend un tableau de chaînes de caractères (const char**
= array deconst char*
), et votrestd::string
vous donne juste un string. Il faut ajouter un niveau d'indirection de sorte queglShaderSource
obtient un pointeur, il est possible de référence pour récupérer la chaîne de caractères.const char* c_str;
est un definition, pas une déclaration.glShaderSource
indique explicitement à vous d'utiliser un tableau deconst char*
.&
est pour.La valeur de retour de
std::string::c_str()
est une valeur de type pointeur (c'est à dire, une adresse) pour un tableau de chaînes statique tenues à l'intérieur des données-structures de lastd::string
objet. Depuis le retour valeur est juste temporaire de la valeur de r (c'est à dire, c'est juste un numéro stocké dans un registre CPU), il n'est pas une l-value et, par conséquent, il ne dispose pas d'une adresse de mémoire que vous pouvez réellement prendre l'adresse de et casting pour un pointeur de pointeur. Vous devez d'abord enregistrer le retour de la valeur du pointeur dans une adresse mémoire. Mémoire-lieux sont la l-valeurs, et peut avoir l'adresse de l'opérateur appliqué à eux. C'est pourquoi votre deuxième méthode (ou Sombre Falcon méthode fonctionne, mais gardez à l'esprit que la valeur du pointeur retourné n'est que temporaire, ce qui signifie que si vous effectuez l'une des opérations sur lestd::string
objet, il pourrait invalider le pointeur depuis lestd::string
objet gère la mémoire de ses données-structures. Donc, juste parce que vous avez enregistré le retour de la valeur du pointeur dans un emplacement de mémoire ne signifie pas que le pointeur ne sera pas invalidé quelque temps plus tard, et à un point que vous ne pouvez pas être capable de la conception déterministe de choix.std::string::c_str()
.Vous pouvez obtenir un raisonnable-recherche appel à l'aide d'une classe d'assistance. Définir cette classe:
Puis, quand vous avez besoin d'appeler
glShaderSource
, faire de cette façon:glShaderSource
signature est, selon glShaderSource doc:où
string
"Spécifie un tableau de pointeurs sur des chaînes de caractères contenant le code source pour être chargé dans le shader". Ce que vous essayez de passer un pointeur vers une chaîne terminée par NULL (qui est un pointeur vers unconst char*
).Malheureusement, je ne suis pas familier avec
glShaderSource
, mais je suppose qu'il n'est pas prévu un pointeur vers "code", mais quelque chose comme ceci à la place:De opengl-redbook, vous pouvez lire un exemple (je l'ai raccourcie, elle en but):
+1
pour en fait en regardant la documentation des fonctions!Je veux seulement souligner que le pointeur retourné par
c_str()
n'est valable que tant que vous ne faites pas quelque chose qui exige de la redistribution de la mémoire tampon interne de std::string. Qui invalide le pointeur que vous avez obtenu.Mais depuis que vous avez vraiment besoin d'un
**
je voudrais faire cela:Qui devraient fonctionne bien aussi longtemps que vous ne laissez pas à la portée de mychararr.
Shader.cpp
Shader.php
Essayez d'utiliser l' .c_str (), il vous donne un char * que vous pouvez utiliser comme il a travaillé pour vous b4
À l'aide de la chaîne de l'adresse et de la coulée, il travaille également dans une seule ligne:
glShaderSource(vertexShader, 1, (const char* const*)&vertexSource, NULL);