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

Re: Bug gcc?



aparte de que el mail es totalmente offtopic, y un codigo con goto es in-depurable, intentare contestar

no es por declarar z en otra linea
si no por no declarar longitud justo antes de coords, en algun momento usas algun indice mas sobre coords y sobre escribes z, no pasa nada porque en el for de z la inicializas, pero si pones longitud como ultima variable antes de coords, al acceder a coords[4] machacas longitud, no se en que punto (quiza en if(longitud==4) coords[3-j] = num; --> coords[-1] = num...), y ya el bucle da una vuelta menos y no rellena las variables ultimas del vector.


mis consejos:

no uses goto, please
manda estas dudas a listas de programacion en c
depura tu codigo en busca de tus bugs, mas corrientes que los del gcc...


--
Rober Morales Chaparro
http://roberinworld.blogspot.com


MurDoK escribió:
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: