2017-02-26 46 views
1

コードを書くのはブラックジャックです。 コンパイルできません。警告が発生します。 暗黙の定数変換で複数文字の定数とオーバーフロー 何が起こっているか教えてください。 私はそれを長い時間の間PLZ助けてくれたと思っています。暗黙定数変換で複数文字の定数とオーバーフロー

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int flower; 
int k; 
int add [13]={1,2,3,4,5,6,7,8,9,10,10,10,10}; 
char flower_all [4]={'\3','\4','\5','\6'}; 
char number_all [13]={'A','2','3','4','5','6','7','8','9','10','J','Q','K'}; 
char player_f[13],player_n[13]; 
char com_f[13],com_n[13];    
int poker [52]={0};    
int i,j,y,num,ans; 
int player_p=0,com_p=0; 
void wash(){  
int k; 
k=rand()%52; 
while(poker[k]==1) 
{ 
    k=rand()%52; 
} 
poker[k]=1; 
} 
void give_card_p(){ 
char player_f[13],player_n[13]; 
int i,k; 
int ans; 
printf("請問是否要補牌? 1:要 2:不要"); 
scanf("%d",&ans); 
fflush(stdin); 
while (ans==1){ 
    wash(); 
    player_f[i]=flower_all[k/13]; 
    player_n[i]=number_all[k%13]; 
    player_p+=add[k%13]; 
    continue; 
    if (player_p>21) 
    break; 
} 
} 
int main(){ 
srand(time(0)); 
char player_f[13],player_n[13]; 
int k; 
for(i=0;i<2;i++){ 
    wash(); 
    player_f[i]=flower_all[k/13]; 
    player_n[i]=number_all[k%13]; 
    player_p+=add[k%13]; 
} 
for (i=0;i<2;i++){ 
    wash(); 
    com_f[i]=flower_all[k/13]; 
    com_n[i]=number_all[k%13]; 
    com_p+=add[k%13]; 
} 
printf("%c%c",player_f[i],player_n[i]); 
fflush(stdin); 
return 0; 
} 
+0

[mvce](http://stackoverflow.com/help/mcve)の作成を検討してください。また、エラーメッセージの全文を含めて、どの行が失敗しているのかを示してください。 –

答えて

4

単一引用符'は「文字定数」を意味する。次の行で

char number_all [13]={'A','2','3','4','5','6','7','8','9','10','J','Q','K'}; 

'10'は「複数文字定数」です。これは 'インプリメンテーション定義'です。つまり、異なるコンパイラは自由に異なる方法で解釈します。この場合、指定したエラーメッセージが表示された場合は、エラーの原因になっている可能性があります。私はあなたのカードを表現するためにenumerated typeを使用することをお勧めします。

私はあなたがこれらの2つのエラー

HC取得している願っています

+0

リテラルにはアドレスがあります。文字*定数*にはアドレスがありません。 – StoryTeller

+1

複数の文字を入力できますが、その意味は実装定義です。 –

+0

@IharobAlAsimiありがとうございます。編集しました。 –

0

:9:59:警告:複数文字定数

HC:9:警告:暗黙の定数変換でオーバーフロー

それが起こるのプログラムで、

チャーnumber_all [13] = { 'A'、 '2'、 '3'、 '4'、 '5'、 '6'、 '7'、 '8' なぜなら、 '9'、 '10'、 'J'、 'Q'、 'K'};あなたはマルチ文字定数である「10」を持って

、コンパイラは、単一の文字に変換することができません。ウィキペディアから

個々の文字定数は、例えば、単一引用符で囲まれています'A'であり、 型int(C++ではchar)です。相違点は、「A」は の2つの文字「A」と「\ 0」のヌル終端配列を表し、「A」 は文字値(ASCIIが使用されている場合は65)を直接表します。 同じバックスラッシュ・エスケープは( もちろん)「正当」に対し は今、エスケープする必要があり、エスケープされずに文字として使用することができます。

文字定数はできないことを除いて、文字列のとしてサポートされています は有効ではありませんが、複数の文字定数(例: 'xy')はあまり有効ではありません。文字は整数 (例えば、4つのASCII文字は32ビット整数に収まることができ、8ビットは64ビットの に収まることができます)。文字がpacのintにkedを指定しないと、複数文字定数を移植するのは難しく です。

関連する問題