2013-03-01 1 views
-1

Alors ... J'ai un petit morceau de code que je travaille sur la majeure partie de la matinée. C'est juste un petit projet pour m'aider à me souvenir de la syntaxe et ainsi de suite. J'ai évidemment manqué une sorte d'erreur massive comme le code renvoie une faute de segmentation pour des raisons que je ne comprends pas.C - Honnêtement à une perte de ce comportement étrange

#include <stdio.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <time.h> 
#include <getopt.h> 

struct cards 
{ 
int card_value[99]; 
char card_name[99]; 
char card_suit[99]; 
int card_tally; 
}; 

struct cards hand[2]; 

void tally (int a) 
{ 
int k, j; 
for (k=0; k<5; k++) 
{ 
    j = j + hand[a].card_value[k]; 
} 
hand[a].card_tally = j; 
} 

void check_for_ace (int a) 
{ 
int d; 
for (d=0; d>5; d++) 
    { 
    if (hand[a].card_name[d] =='A') 
     { 
      int y; 
      int z = 10; 
      for (y=0; y<5; y++) 
      z = z + hand[a].card_value[y]; 
      if (z < 22) 
      hand[a].card_value[d]=10; 
      else 
      hand[a].card_value[d]=1; 
     } 

    } 
} 

void draw_card (int a) 
{ 
int z = 1 + rand() % 13; 
int x=0; 

while (hand[a].card_value[x] != 0) 
    { x++; } 

if ((z > 1) && (z < 10)) 
    { 
     hand[a].card_value[x]=z; 
     hand[a].card_name[x]=((char) '0' + z); 
    } 
else if (z == 10) 
    { 
     hand[a].card_value[x]=z; 
     hand[a].card_name[x]='T'; 
    } 
else if (z == 11) 
    { 
     hand[a].card_value[x]=10; 
     hand[a].card_name[x]='J'; 
    } 
else if (z == 12) 
    { 
     hand[a].card_value[x]=10; 
     hand[a].card_name[x]='Q'; 
    } 
else if (z == 13) 
    { 
     hand[a].card_value[x]=10; 
     hand[a].card_name[x]='K'; 
    } 
else if (z == 1) 
    { 
     /*Function 'check_for_ace' deals with this more properly*/ 
     hand[a].card_value[x]=1; 
     hand[a].card_name[x]='A'; 
    } 
check_for_ace(a); 
tally(a); 
} 



void display_hands() 
{ 
int x; 
printf("\nDealer's Hand Shows: "); 
for (x=0; hand[0].card_name[x]!=0; x++) 
    { 
     printf("%c ", hand[0].card_name[x]); 
    } 

printf("\nPlayer's Hand Shows: "); 
for (x=0; hand[1].card_name[x]!=0; x++) 
    { 
     printf("%c ", hand[1].card_name[x]); 
    } 
} 

void dealer_turn() 
{ 
    while (hand[0].card_tally < 17) 
    draw_card(0); 
} 

void player_turn() 
{ 
int op=0; 
while (op != 2) 
    { 
    printf("What would you like to do?\n"); 
    printf("(1)it or (2)tand\n"); 
    scanf("%d", &op); 
    if (op == 1) 
    draw_card(1); 

    } 
} 

int main(int argc, char **argv) 
{ 
srand(time(NULL)); 


    draw_card(0); 
    draw_card(1); 
    draw_card(1); 
    display_hands(); 
    player_turn(); 

    dealer_turn(); 
    display_hands(); 

return 0; 
} 

Maintenant, la chose vraiment étrange est, voir cette ligne vide entre player_turn et dealer_turn? Si je mets un display_hands là-dedans le code s'exécute sans erreur.

Des idées?

Aussi, je me rends compte que je l'ai fait utiliser les en-têtes Je ne ont pas besoin. Je prévois de les utiliser plus tard et je les ai juste laissés pour ce poste, de sorte que j'aurais tout laissé exactement comme il est avec l'erreur.

+1

Lire les avertissements du compilateur! –

+1

Vouliez-vous inclure deux fois ? Ne devrait-on pas être ? – Inisheer

+0

Armin: Tout ce que je reçois est un avertissement de déclaration de fonction implicite à propos de rand mais rand retournera des nombres dans une boucle jusqu'à ce que j'en ai marre de les voir sans causer d'erreur. Y a-t-il une erreur qui me manque? – cwm

Répondre

5

Vous n'initialisez pas j avant d'exécuter cette ligne.

j = j + hand[a].card_value[k]; 

Lorsque j'ai ajouté une initialisation j=0 à votre code, il ne plante plus.

E.g.

void tally (int a) 
{ 
int k, j; 
j=0; /* <----- added this line */ 
for (k=0; k<5; k++) 
{ 
    j = j + hand[a].card_value[k]; 
} 
hand[a].card_tally = j; 
} 
+0

Vous avez absolument raison, cela le corrige en fait. Je pensais que tous les entiers déclarés mais non initialisés ont commencé avec une valeur de 0, pour une raison quelconque. Une erreur que je ne ferai plus. Merci, je l'apprécie vraiment. – cwm

+0

Seulement les globales, mais il est préférable de ne pas compter dessus ... – twalberg

+0

une habitude simple qui peut sauver des heures de débogage ... – Mike