[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug gcc?



Buenas, hace tiempo que empece a programar en ncurses un juego tipo hundir la 
flota y descubrí que depende de si declaraba la variable "z" en una línea 
junto a más integers o en otra solo ella, el programa funcionaba o no :| 
¿Esto es un fallo mío o del compilador?

(No hace falta que leáis ni entendáis el código pero es la parte en la que la 
cpu elige donde situar sus barquitos aleatoriamente)

En el código explico cómo cambiarlo para que funcione y no funcione, fijaos en 
el final, si no funciona las dos ultimas cifras siempre son ceros en vez de 
una letra seguido de un número. Es muy raro :S

¿Alguna idea?
// BUG DEL COMPILADOR??
//
// Si definimos el integer z despues del k=0 en la misma linea -->    int pos, num, i, j, k=0, z, longitud;
// La ultima coordenada no sale :| hay que definir aparte la z

// BIEN: 
//	int pos, num, i, j, k=0, longitud;
//	int z;
//
#include <stdio.h>
#include <stdlib.h>

int main()
{
	int pos, num, i, j, k=0, z, longitud;  // <---------
	char coords[4];
	char coordenadas_remote[15][2];
	char ch;
	srand(time(NULL));

	for(i=0; i<15; i++) {
		coordenadas_remote[i][0] = 0;
		coordenadas_remote[i][1] = 0;
	}

		for(i=0; i<6; i++) {
			repeat:
			switch(i) {
			case 0:		longitud=4;
					z=0;
					break;
			case 1:		
			case 2:		longitud=3;
					z=4;
					break;
			case 3:		
			case 4:		longitud=2;
					z=10;
					break;
			case 5:		longitud=1;
					z=14;
					break;
			}
			
			ch = (rand()%7);    // A-H
			num = (rand()%8)+1; // 1-8
			pos = (rand()%2);   // 0:horizontal - 1:vertical
			
			switch(ch) {
			case 0:		ch='A';
					break;
			case 1:		ch='B';
					break;
			case 2:		ch='C';
					break;
			case 3:		ch='D';
					break;
			case 4:		ch='E';
					break;
			case 5:		ch='F';
					break;
			case 6:		ch='G';
					break;
			case 7:		ch='H';
					break;
			}
			pos=0; //debug
			printf("%c%d %d -->  ", ch, num, pos);

			for(j=0; j<4; j++)
				coords[i] = 0;
	
			if(!pos) { //horizontal
			
				switch(num) {
				case 1:
				case 2:
				case 3:
				case 4:
				case 5:
					for(j=0; j<longitud; j++, num++) {
						printf("%c%d ", ch, num);
						coords[j] = num;
					}
					break;
				case 6:
					if((longitud+4)>7) num--;
					
					for(j=0; j<longitud; j++, num++) {
						printf("%c%d ", ch, num);
						coords[j] = num;
					}
					break;
				case 7:
					if((longitud+4)>7) num=num-2;
					else if((longitud+5)>7) num--;
					
					for(j=0; j<longitud; j++, num++) {
						printf("%c%d ", ch, num);
						coords[j] = num;
					}
					break;
				case 8:
					for(j=0; j<longitud; j++, num--) {
						if(longitud==4) 
							coords[3-j] = num;
						else if(longitud==3) 
							coords[2-j] = num;
						else if(longitud==2) 
							coords[1-j] = num;
						else 
							coords[j] = num;
							
						printf("%c%d ", ch, num);
					}
					break;
				}
	
				printf(".. ");
				
				for(j=0; j<longitud; j++)
				for(z=0; z<k; z++)
					if((ch == coordenadas_remote[z][0]) && \
					(coords[j] == coordenadas_remote[z][1])) {
						printf("REPE!:%c%d\n", ch, coords[j]);
						goto repeat;
					}
						
				for(j=0; j<longitud; j++) {
					printf("%d ", coords[j]);
					sprintf(coordenadas_remote[k], "%c%c", ch, coords[j]);
					k++;
				}
				printf("k=%d ", k);

			}
			printf("\n\n");
		}
		printf("coordenadas: ");
		for(i=0; i<15; i++)
			printf("%c%d  ", coordenadas_remote[i][0], coordenadas_remote[i][1]);
		printf("\n             ^^^^^^^^^^^^^^  ^^^^^^^^^^  ^^^^^^^^^^  ^^^^^^  ^^^^^^  ^^");
		printf("\n                    4            3            3        2       2      1\n\n");
return 1;
}

Reply to: