2016-12-30 20 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()'に関しては、 "const char *"型のエラー:引数が "char *"型のパラメータと互換性がありません。 "void char *、int、int、int、int)":引数3を 'const char *'から '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の実装を使用していますか? [documentation](http://liballeg.org/stabledocs/en/alleg018.html#textout_centre_ex)によると、3番目の引数は 'char * 'ではなく' const char * 'です。関数は文字列を変更すべきではないので、意味があります。 – Jack

+0

私はallegroを使用しています4.4.2 – billybrian

+0

あなたのライブラリに何か問題があると思います。 – Jack

答えて

0

(ヘッドアップ:私のC++の経験が少し錆びている、私は不正確にいくつかのC++の詳細を覚えているかもしれません)

それが求めているよりも、あなたは関数にデータの異なるタイプを証明しています。それは何か変えることを求めており、あなたはそれを不変のものにします。

実際には、関数はcharポインタのコピーを受け取ります(したがって、ポインタの値を内部的に変更しても問題はありません)が、コンパイラはおそらく、

このような問題を解決するには、テキスト全体(char *は\ 0で終了したcharの配列をポイントします)を新しいchar配列にコピーして関数に渡すことができます。おそらく、パラメータの「const」を組み込むようにシグネチャを変更した、新しいバージョンのAPIがあります。

+2

' char * 'と' const char * 'の違いは、ポインタが不変かどうかではなく、 beeingに指されています。はい、関数はポインタのコピーを受け取りますが、constポインタを使用してポインタをコピーします。したがって、コンパイラは文句を言わなければなりません。 – Unimportant

4

機能が保証されている場合は、尖った-にデータ変異していないためにchar*に引数をキャストするconst_castを使用することができます。

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

は、より良い解決策は、GCCでコンパイルすることです/クランを#define AL_CONST const Allegroヘッダをインクルードする前に自分自身であるべき場所にconstを入れ、醜いキャストでコードを捨てる必要はありません。

+0

素晴らしい、ありがとう、それはそれをしました... – billybrian

+1

@billybrian:最初の投稿であなたがリードしたリードを実際に詳しく見てください。ドキュメントによると、関数は 'const char *'を取るこ​​とになっています。これは、印刷時にデータを変更すべきではないので意味があります。私はあなたの理由がわからず、本当の問題を見いだし、醜いキャスト包帯を適用しません。 – Unimportant

+1

@ user1320881 Allegro 4.4は、ライブラリがGCCでコンパイルされていない限り、 'const'を使用しません。元の投稿に私のコメントを参照してください。 – emlai

関連する問題