Dopo aver compilato il codice, senza alcun errore o warning , eseguo il programma ma si blocca, dove si richiama la funzione inizzializza subito dopo arev stampato a video la scritta help.
quale potrebbe essere il problema???
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* descrizione di una casa della scacchiera */
typedef struct {
int Colore;
int Pezzo;
} Casella;
struct nodo_Casella
{
Casella dato;
struct nodo_Casella *next;
};
/* descrizione di una mossa per una determinata posizione */
typedef struct {
int Da;
int A;
} Mossa;
struct nodo_Mossa
{
Mossa dato;
struct nodo_Mossa *next;
};
/* costanti */
#define NUMEROCASE 64
#define CASExRIGA 8
#define NUMEROPEZZI 6
#define MAXMOSSE 1024
/* contenuto case */
#define BIANCO 0
#define NERO 1
#define PEDONE 0
#define CAVALLO 1
#define ALFIERE 2
#define TORRE 3
#define REGINA 4
#define RE 5
#define VUOTO 6
#define RIGA(x) (x >> 3)
#define COLONNA(x) (x & 7)
/* generali */
#define BOOL int
#define TRUE 1
#define FALSE 0
/* posizione iniziale della scacchiera */
const int ColoriIniziali[NUMEROCASE] = {
NERO, NERO, NERO, NERO, NERO, NERO, NERO, NERO,
NERO, NERO, NERO, NERO, NERO, NERO, NERO, NERO,
VUOTO, VUOTO, VUOTO, VUOTO, VUOTO, VUOTO, VUOTO, VUOTO,
VUOTO, VUOTO, VUOTO, VUOTO, VUOTO, VUOTO, VUOTO, VUOTO,
VUOTO, VUOTO, VUOTO, VUOTO, VUOTO, VUOTO, VUOTO, VUOTO,
VUOTO, VUOTO, VUOTO, VUOTO, VUOTO, VUOTO, VUOTO, VUOTO,
BIANCO, BIANCO, BIANCO, BIANCO, BIANCO, BIANCO, BIANCO, BIANCO,
BIANCO, BIANCO, BIANCO, BIANCO, BIANCO, BIANCO, BIANCO, BIANCO
};
const int PezziIniziali[NUMEROCASE] = {
TORRE, CAVALLO, ALFIERE, REGINA, RE, ALFIERE, CAVALLO, TORRE,
PEDONE, PEDONE, PEDONE, PEDONE, PEDONE, PEDONE, PEDONE, PEDONE,
VUOTO, VUOTO, VUOTO, VUOTO, VUOTO, VUOTO, VUOTO, VUOTO,
VUOTO, VUOTO, VUOTO, VUOTO, VUOTO, VUOTO, VUOTO, VUOTO,
VUOTO, VUOTO, VUOTO, VUOTO, VUOTO, VUOTO, VUOTO, VUOTO,
VUOTO, VUOTO, VUOTO, VUOTO, VUOTO, VUOTO, VUOTO, VUOTO,
PEDONE, PEDONE, PEDONE, PEDONE, PEDONE, PEDONE, PEDONE, PEDONE,
TORRE, CAVALLO, ALFIERE, REGINA, RE, ALFIERE, CAVALLO, TORRE
};
void trova_e_sostituisci_casella (struct nodo_Casella* head, int c, int p, int index){
int i=0;
while ((head != NULL) && (i<index)){
//scorro la lista
head = head->next;
i++;
}
(head->dato).Colore = c;
(head->dato).Pezzo = p;
}
int case_x_colore (struct nodo_Casella* head, int index){
int i=0;
int c=0;
while ((head != NULL) && (i<index)){
//scorro la lista
head = head->next;
i++;
}
c=(head->dato).Colore;
return c;
}
int case_x_pezzo (struct nodo_Casella* head, int index){
int i=0;
int p=0;
while ((head != NULL) && (i<index)){
//scorro la lista
head = head->next;
i++;
}
p=(head->dato).Pezzo;
return p;
}
void trova_e_sostituisci_mossa (struct nodo_Mossa* head, int d, int a, int index){
int i=0;
while ((head != NULL) && (i<index)){
//scorro la lista
head = head->next;
i++;
}
(head->dato).Da = d;
(head->dato).A = a;
}
int mossa_x_da (struct nodo_Mossa* head, int index){
int i=0;
int d=0;
while ((head != NULL) && (i<index)){
//scorro la lista
head = head->next;
i++;
}
d=(head->dato).Da;
return d;
}
int mossa_x_a (struct nodo_Mossa* head, int index){
int i=0;
int a=0;
while ((head != NULL) && (i<index)){
//scorro la lista
head = head->next;
i++;
}
a=(head->dato).A;
return a;
}
void inizializza_lista_mosse (struct nodo_Mossa** mossa){
int i;
for(i=0; i<MAXMOSSE; i++){
//alloco il nuovo nodo
struct nodo_Mossa* head;
head = (struct nodo_Mossa*)malloc(sizeof(struct nodo_Mossa));
//lui diventa il primo nodo e quindi deve puntare all'attuale testa
head->next = *mossa;
//la testa adesso deve puntare a lui
*mossa = head;
//tutto e' andato a buon fine
}
}
struct nodo_Casella* B=NULL;
/* stack delle mosse generate */
struct nodo_Mossa* StackMosse=NULL;
//inizializza_lista_mosse (&StackMosse);
/* contatore mosse generate */
int NumeroMosse;
int ChiMuove; /* colore che deve muovere */
FILE *LogFile = NULL; /* id log file */
/* Indica se un pezzo puo' muovere di piu' case alla volta
0 PEDONE, 1 CAVALLO, 2 ALFIERE, 3 TORRE, 4 REGINA, 5 RE
Il pedone e' trattato separatamente */
BOOL Trascina[NUMEROPEZZI] = {FALSE, FALSE, TRUE, TRUE, TRUE, FALSE};
/* Numero delle direzioni in cui un pezzo puo' muovere
0 PEDONE, 1 CAVALLO, 2 ALFIERE, 3 TORRE, 4 REGINA, 5 RE
Il pedone e' trattato separatamente */
const int NumeroDirezioni[NUMEROPEZZI] = {0, 8, 4, 4, 8, 8};
/* SalvaMossa() inserisce una mossa nello stack */
void SalvaMossa(int Da, int A) {
trova_e_sostituisci_mossa(StackMosse,(char)Da,(char)A,NumeroMosse);
NumeroMosse++;
}
/* Inizializza() inizializza la scacchiera */
void Inizializza() {
int i;
struct nodo_Casella* casa=B;
for(i=0;i < NUMEROCASE; i++){
struct nodo_Casella* p;
//alloco il nuovo nodo
struct nodo_Casella* new_node;
new_node = (struct nodo_Casella*)malloc(sizeof(struct nodo_Casella));
//popolo il nuovo nodo con i dati
(new_node->dato).Colore=ColoriIniziali[i];
(new_node->dato).Pezzo=PezziIniziali[i];
//lui sara' l'ultimo quindi deve puntare a NULL
new_node->next = NULL;
//se la lista e' vuota lui sara' anche il primo quindi la testa deve puntare a lui
if(casa==NULL){
casa=new_node;
}
//inizio a scorrere partendo dalla testa
p = casa;
//scorro tutta la lista
while (p->next != NULL)
p = p->next;
//inserisco in coda
p->next = new_node;
}
ChiMuove = BIANCO;
}
/* lettere dei pezzi bianchi per la VisualizzaScacchiera()
in accordo con i define in Common.h */
char SimboliPezziBianco[NUMEROPEZZI] = "PNBRQK";
/* lettere dei pezzi neri per la VisualizzaScacchiera()
in accordo con i define in Common.h */
char SimboliPezziNero[NUMEROPEZZI] = "pnbrqk";
void VisualizzaScacchiera() {
int i;
printf("\n8 ");
for (i = 0; i < NUMEROCASE; i++) {
switch (case_x_colore(B,i)) {
case BIANCO:
printf(" %c", SimboliPezziBianco[case_x_pezzo(B,i)]);
break;
case NERO:
printf(" %c", SimboliPezziNero[case_x_pezzo(B,i)]);
break;
case VUOTO:
printf(" .");
break;
}
if ((i + 1) % CASExRIGA == 0 && i != (NUMEROCASE - 1))
printf("\n%d ", 7 - RIGA(i));
}
printf("\n\n a b c d e f g h\n\n");
}
int main(int argc, char **argv) {
int i;
struct nodo_Mossa* mossa=StackMosse;
for(i=0; i<MAXMOSSE; i++){
//alloco il nuovo nodo
struct nodo_Mossa* head;
head = (struct nodo_Mossa*)malloc(sizeof(struct nodo_Mossa));
//lui diventa il primo nodo e quindi deve puntare all'attuale testa
head->next = mossa;
//la testa adesso deve puntare a lui
mossa = head;
//tutto e' andato a buon fine
}
char Command[256]; /* riga di comando */
if (argc > 1)
if (!strcmp(argv[1],"log")) {
LogFile=fopen("File.txt","w+");
if (LogFile) fprintf(LogFile, "SCACCHI File\n");
else printf("Impossibile aprire il file di log\n");
}
printf("\n");
printf("SCACCHI\n");
printf("\n");
printf("\"help\" mostra la lista dei comandi.\n");
Inizializza();
VisualizzaScacchiera();
while (TRUE) {
/* prende l'input da consolle */
printf("sc> ");
if (scanf("%s", Command) == EOF)
return 0;
/* interpreta l'input come comando */
if (!strcmp(Command, "help")) {
printf("new - nuova partita\n");
printf("quit - fine del programma\n");
printf("d - visualizza la scacchiera\n");
continue;
}
if (!strcmp(Command, "new")) {
Inizializza();
VisualizzaScacchiera();
continue;
}
if (!strcmp(Command, "d")) {
VisualizzaScacchiera();
continue;
}
if (!strcmp(Command, "quit")) {
printf("sc> Ciao!\n");
if (LogFile)
fclose(LogFile);
return 0;
}
}
}