2016-12-30 6 views
0

Я не хочу учиться C++ и allegro и следовал учебному пособию, так как я придумал этот код. Моя проблема находится на линии:allegro/C++ не может преобразовать аргумент 3 из 'const char *' в 'char *'

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

Когда дело доходит до 'Draw.c_str()' Я получаю Error: аргумент типа "const char *" несовместим с параметром типа "char *".

Если я пытаюсь построить, я получаю сообщение об ошибке C2664: 'void textout_centre_ex (BITMAP *, FONT *, char *, int, int, int, int)': не может преобразовать аргумент 3 из 'const char *' в ' char * '"

Как это разрешить?

// 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

Какую реализацию Allegro вы используете? Согласно [документации] (http://liballeg.org/stabledocs/en/alleg018.html#textout_centre_ex), третий аргумент - это 'const char *', а не 'char *'. И это имеет смысл, поскольку функция не должна изменять строку. – Jack

+0

Я использую allegro 4.4.2 – billybrian

+0

Я думаю, что что-то не так с вашей библиотекой. – Jack

ответ

0

(ХА: Мой C++ опыт немного ржавый, я мог бы вспомнить некоторые C++ подробности неаккуратно)

Вы доказав функцию, другой тип данных, чем просит. Он просит что-то изменчивое, и вы даете ему что-то неизменное.

Я думаю, что с практической точки зрения функция все равно получает копию указателя char (при этом не имеет значения, изменило ли значение указателя внутри), но компилятор, вероятно, прав, чтобы жаловаться в любом случае.

Чтобы решить эту проблему, вы можете скопировать весь текст (char * указывает на массив символов, заканчивающийся на \ 0, справа?) В новый массив символов и предоставить это функции. Возможно, есть более новая версия API, которая изменила подпись, чтобы включить параметр «const» для параметра.

+2

. Различия между символами' char * 'и' const char * 'не касаются указателя beeing неизменяемым или нет, но о том, что на что указывает. Да, функция получает копию указателя, но через указатель const она не может мутировать то, на что указывает указатель, в то время как с помощью указателя, не являющегося константой, он может. Поэтому компилятор ДОЛЖЕН жаловаться. – Unimportant

4

Вы можете использовать const_cast бросить аргумент char* если функция гарантированно не мутировать заостренный к данным:

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

Лучшим решением было бы скомпилировать с помощью GCC/Clang или#define AL_CONST const перед тем, как включить какие-либо заголовки Allegro, так что вы получите const в тех местах, где он должен находиться, и не нужно мутировать ваш код уродливыми приведениями.

+0

Удивительный, спасибо, что это было ... – billybrian

+1

@billybrian: Вам следует по-настоящему взглянуть на ведущий, который Джек дал вам в первом посте.Согласно документации, функция должна принимать 'const char *', что имеет смысл, так как не должно изменять данные при ее печати. Я бы узнал, почему у вас нет, и найти настоящую проблему, а не применять уродливую литую повязку. – Unimportant

+1

@ user1320881 Allegro 4.4 не использует 'const', если библиотека не была скомпилирована с помощью GCC. См. Мой комментарий выше на исходное сообщение. – emlai

 Смежные вопросы

  • Нет связанных вопросов^_^