Blocco del file .exe

di il
1 risposte

Blocco del file .exe

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;
		}

		
	}
}


1 Risposte

  • Re: Blocco del file .exe

    Metti delle printf capire dove si blocca. Comunque nella funzione inizializza manca un else.
    
    if(casa==NULL){  
            casa=new_node;
        	} 
        	else{
       	//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;
        	}
        }
        B=casa; //importante!! 
    
    Una matrice 8x8 anziché la lista sarebbe stata più comoda.
    Poi ovviamente metterai nell'help delle istruzioni su come si gioca
Devi accedere o registrarti per scrivere nel forum
1 risposte