2016-12-30 5 views
0

Je suis un noob essayant d'apprendre C++ et allegro et suivait un tutoriel qui est la façon dont je suis arrivé avec ce code. Mon problème est sur la ligne:allegro/C++ ne peut pas convertir l'argument 3 de 'const char *' en 'char *'

"textout_centre_ex (écran, font1, Draw.c_str(), scrW/2, scrH/2, eBlue, -1);"

En ce qui concerne 'Draw.c_str()', j'obtiens Erreur: l'argument de type "const char *" est incompatible avec le paramètre de type "char *".

Si j'essaie de construire, j'obtiens l'erreur C2664: 'void textout_centre_ex (BITMAP *, FONT *, char *, int, int, int, int)': impossible de convertir l'argument 3 de 'const char *' en ' char * '"

Comment puis-je résoudre ce problème?

// Set variables 
int counter = 0; 
std::string Word = "SuperAwesomeTrivia"; 
std::string Draw = ""; 

FONT *font1 = load_font("font1.pcx", NULL, NULL); 

while (!closeWindow){ 

// Update 
    Draw += Word[counter]; 
    counter++; 

    if (counter > Word.length() - 1) 
    { 
     closeWindow = true; 
    } 

    // Draw 
    textout_centre_ex(screen, font1, Draw.c_str(), scrW/2, scrH/2, eBlue, -1); 
    if (!closeWindow) 
     rest(200); 
    else 
     rest(2000); 
    clear_bitmap(screen); 
} 
destroy_font(font1); 
allegro_exit(); 

return 0; 
+3

Quelle implémentation d'Allegro utilisez-vous? Selon [documentation] (http://liballeg.org/stabledocs/en/alleg018.html#textout_centre_ex), le troisième argument est un 'const char *', pas un 'char *'. Et cela a du sens puisque la fonction ne doit pas modifier la chaîne. – Jack

+0

J'utilise allegro 4.4.2 – billybrian

+0

Je suppose que quelque chose ne va pas dans votre bibliothèque alors. – Jack

Répondre

0

(heads up: Mon expérience C++ est un peu rouillé, je pourrais rappeler quelques détails C++ inexactement)

Vous démontrez une fonction un autre type de données que l'on vous demande. Il demande quelque chose de mutable et tu lui donnes quelque chose d'immuable.

Je pense en termes pratiques, la fonction reçoit toujours une copie du pointeur char (donc cela n'aurait pas d'importance si elle changeait la valeur du pointeur en interne), mais le compilateur a probablement raison de se plaindre quand même.

Pour résoudre un tel problème, vous pouvez copier tout le texte (char * pointe vers un tableau de caractères, terminé par \ 0, droit?) Vers un nouveau tableau char et le fournir à la fonction. Peut-être qu'il y a une version plus récente de l'API qui a changé la signature pour incorporer le "const" pour le paramètre.

+2

La différence entre' char * 'et' const char * 'ne concerne pas le pointeur immuable ou non, mais sur quoi est pointé vers. Oui, la fonction reçoit une copie du pointeur, mais à travers un pointeur const, elle ne peut pas muter ce qui est pointé vers un pointeur non constant. Donc le compilateur DOIT se plaindre. – Unimportant

4

Vous pouvez utiliser const_cast pour lancer l'argument char* si la fonction est garantie de ne pas muter verniau aux données:

textout_centre_ex(screen, font1, const_cast<char*>(Draw.c_str()), scrW/2, scrH/2, eBlue, -1); 
           ^~~~~~~~~~~~~~~~~~   ~ 

Une meilleure solution serait de compiler avec GCC/Clang ou#define AL_CONST const vous-même avant d'inclure tous les en-têtes Allegro, de sorte que vous obtenez const dans les endroits où il devrait être, et ne pas avoir à jeter votre code avec des moulages laids.

+0

Génial, merci beaucoup, c'est ce qu'il a fait ... – billybrian

+1

@billybrian: Vous devriez vraiment regarder de plus près l'avance que Jack vous a donnée dans le message initial.Selon la documentation, la fonction est censée prendre un 'const char *', ce qui est logique car il ne devrait pas modifier les données lors de l'impression. Je découvrirais pourquoi la tienne ne le fait pas, et trouverais le vrai problème, ne pas appliquer un pansement laid. – Unimportant

+1

@ user1320881 Allegro 4.4 n'utilise 'const' que si la bibliothèque a été compilée avec GCC. Voir mon commentaire ci-dessus sur le post original. – emlai