El cual tiene q leer los parametros desde un fichero y la matriz desde el fichero tambien las reglas supongo que ya las conocereis si no las puedo volver a poner.
os adjunto mi codigo y las dudas q tengo q hace q no me funciones espero vuestra ayuda.
Código:
#include <stdio.h>
#include <stdlib.h>
#define X 25
#define Y 25
typedef struct _coords{
int y,x;
int my,mx;
} coords;
typedef struct _Parametros{
coords pos_inicial;
int num_gen;
char campo[X][Y];
} parametros;
parametros miNuevaStruct()
{
parametros tmp;
tmp.num_gen=0;
tmp.pos_inicial.y=0;
tmp.pos_inicial.y=0;
return tmp;
}
parametros leer_parametros (char* cfg_frame)
{
int a,i;
char buffer [2048];
char tableA[X][Y];
parametros parms= miNuevaStruct();
FILE* f=fopen("entrada1.txt", "r");
if (f==NULL) // <stdlib.h>
{
fprintf(stderr, "el fichero %s no ha podido ser abierto\n");
exit(1); //<stdlib.hZ
}
fgets(buffer, 2048, f);
sscanf(buffer,"%d", &(parms.num_gen));
fgets(buffer, 2048, f);
sscanf(buffer, "%d %d", &(parms.pos_inicial.x), &(parms.pos_inicial.y));
for(a=0; a<=parms.pos_inicial.x; a++)
{
for(i=0; i<parms.pos_inicial.y; i++)
{
fscanf(f, "%c", &parms.campo[a][i]);
}
}
fclose(f);
return parms;
}
void reglasEvo(char tableA[X][Y], char tableB[X][Y])
{
int vecinos;
int x;
int y;
parametros parms;
for (x = 0; x <= parms.pos_inicial.x; x++)
{
for (y = 0; y < parms.pos_inicial.y; y++)
{
vecinos = 0;
if (parms.campo[x-1][y-1]=='*')
{
vecinos++;
}
if (parms.campo[x-1][y]=='*')
{
vecinos++;
}
if (parms.campo[x-1][y+1]=='*')
{
vecinos++;
}
if (parms.campo[x][y-1]=='*')
{
vecinos++;
}
if (parms.campo[x][y + 1] == '*')
{
vecinos++;
}
if (parms.campo[x + 1][y - 1] == '*')
{
vecinos++;
}
if (parms.campo[x + 1][y] == '*')
{
vecinos++;
}
if (parms.campo[x + 1][y + 1] == '*')
{
vecinos++;
}
if (parms.campo[x][y] == '*' && vecinos < 2)
{
tableB[x][y] = '-';
}
else if (parms.campo[x][y] == '*' && vecinos > 3)
{
tableB[x][y] = '-';
}
else if (parms.campo[x][y] == '*' && (vecinos == 2 || vecinos == 3))
{
tableB[x][y] = '*';
}
else if (parms.campo[x][y] == '-' && vecinos == 3)
{
tableB[x][y] = '*';
}
}
}
}
void intercambio(char tableA[X][Y], char tableB[X][Y])
{
int x;
int y;
parametros parms;
for (x = 0; x <= parms.pos_inicial.x; x++)
{
for (y = 0; y < parms.pos_inicial.y; y++)
parms.campo[x][y] = tableB[x][y];
}
}
void dibujartable(char tableA[X][Y])
{
int x;
int y;
parametros parms;
for (x = 0; x <= parms.pos_inicial.x; x++)
{
for (y = 0; y < parms.pos_inicial.y; y++)
{
if(parms.campo[x][y]=='*')
printf("*");
else
printf("-");
}
}
}
int main(int argc, char** argv)
{
char tableB[X][Y];
int gen=0, x, y;
parametros parms;
parms=leer_parametros(argv[1]);
while (gen < parms.num_gen)
{
reglasEvo(parms.campo, tableB);
intercambio(parms.campo, tableB);
dibujartable(parms.campo);
gen++;
}
return 0;
}
aqui os adjunto el contenido del ficehro de texto
Código:
100
15 30
------------------------------
---***------------------------
--*---*-----------------------
--*---*-----------------------
--*---*-----------------------
---***------------------------
------------------------------
------------------------------
------------------------**----
-----**----------------*--*---
----*--*----------------**----
----*--*----------------------
-----**-----------------------
------------------------------
------------------------------
En la funcion leer parametros tras leer el num_gen y las coordenadas procedo a leer la matriz mediante esto
for(a=0; a<=parms.pos_inicial.x; a++)
{
for(i=0; i<parms.pos_inicial.y; i++)
{
fscanf(f, "%c", &parms.campo[a]);
}
}
antes le ponia el salto de linea al cerrar el segundo for y en el primer for ponia a<parms.pos_inicial sin el igual. Pero no me lo guardaba bien.
En la funcion reglasEvo con dos fors para que recorra la matriz. Hago que cuando vea un asterisco el contador vecinos aumente en 1 para poder tener el numero de vecinos. luego evaluo las condicones de vida o muerte. y hago q lo guarde en una tabla llamada tableB.
en la funcion intercanbio hago que guarde los cambios hechos en tableB en parms.campo.
en la funcion dibujartable hago que dibuje la matriz
for (x = 0; x <= parms.pos_inicial.x; x++)
{
for (y = 0; y < parms.pos_inicial.y; y++)
{
if(parms.campo
- [y]=='*')
else
printf("-");
}
}
como antes no le pongo el salto de linea y pongo el = en el primer for porq sino lo imprimia desestructurado.
luego en el main llamo a la funcion leerparametros y abro un while el cual seguira activo hasta que se llegue al num_gen dentro del while llamo a las funciones
reglasEvo(parms.campo, tableB);
intercambio(parms.campo, tableB);
dibujartable(parms.campo);
gen++;
pero al compilar y ejecutar no hace nada me sale pulse cualquier tecla para terminar.
el problema es que no llamo bien a las funciones diria.
mis dudas son el hecho de no llamar bien a las funciones y en la funcion de leer la matriz y dibujar el hecho de no ponder el salto de linea y poner el =.