Hola amigos, esto es C pero no sabia donde ponerlo.
El caso es que estoy intentando crearme un pequeño codigo al que le diga el numero de columnas y filas y las palabras a colocar y que me cree una sopa de letras con ellas. El codigo lo encontre por internet pero no usaba memoria dinamica asi que lo he modificado y antes de modificarlo iba bien pero ahora me da errores al intentar añadir las palabras y al intentar rellenar la sopa de letras y estoy seguro de que estoy haciendo algo mal al trabajar con los punteros de la memoria que he obtenido pero no se que. ¿pueden ayudarme?
Código PHP:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define LARGOMAX 21
// Llena la matriz con caracteres /0
void inicializa(char **m, int filas, int columnas) {
int i, j;
for (i = 0; i < filas; i++)
for (j = 0; j < columnas; j++)
m[i][j] = '\0';
}
void PedirPalabras(char **palabras, int nPalabras){
int i,x;
for (i = 0; i < nPalabras; i++){
printf("Introduce una palabra: ");
scanf("%s", palabras[i]);
for (x = 0; x < LARGOMAX; x++){
palabras[i][x]=toupper(palabras[i][x]);
}
}
}
// Llena los espacios vacíos con caracteres al azar
void rellena(char **m, int filas, int columnas) {
int i, j;
for (i = 0; i < filas; i++)
for (j = 0; j < columnas; j++)
if (m[i][j] == '\0')
m[i][j] = rand() % 26 + 65;
}
// Muestra la sopa de letras
void muestra(char **m, int filas, int columnas) {
int i, j;
printf("\n\n");
for (i = 0; i < filas; i++) {
for (j = 0; j < columnas; j++)
printf("%c ", m[i][j]);
printf("\n");
}
}
// Valida que la palabra s se pueda agregar a la matriz m
// en la posición (x, y) y en la dirección (dx, dy)
int valida(char **m, int filas, int columnas, const char *s, int x, int y, int dx, int dy) {
int i, v = 1;
for (i = 0; i < (int)strlen(s); i++, x += dx, y += dy){
if (x < 0 || y < 0 || x >= columnas || y >= filas || (m[y][x] != s[i] && m[y][x] != '\0')){
v = 0;
break;
}
}
if(v==1)
printf("\n%s puede agregarse (x%d, y%d, dx%d, dy%d): %d", s, x, y, dx, dy, v);
return v;
}
// Agrega la palabra s a la sopa de letras
void agrega(char **m, int filas, int columnas, const char *s) {
int i, x, y, dx, dy;
dx = rand() % 3 - 1;
dy = rand() % 3 - 1;
dx = dx == 0 ? 1 : dx;
while (!valida(m, filas, columnas, s, x = rand() % columnas, y = rand() % filas, dx, dy)) ;
for (i = 0; i < (int)strlen(s); i++, x += dx, y += dy)
m[y][x] = s[i];
}
int main() {
// Las palabras que se van a agregar a la sopa de letras
// Deben ser tantas palabras como la definción de PAL
// Escritas en mayúsculas para que se vean bien
char **m, **palabras;
int i;
int filas, columnas, nPalabras;
srand(time(0));
printf("Introduce el numero de caracteres horizontales: ");
scanf("%d",&columnas);
printf("Introduce el numero de caracteres verticales: ");
scanf("%d",&filas);
//Obtengo la memoria suficiente para el array que contendrá la sopa de letras
if (( m = malloc( filas*sizeof( char* ))) == NULL )
{
/* error */
}else{
for ( i = 0; i < filas; i++ )
{
if (( m[i] = malloc( columnas )) == NULL )
{
/* error */
}else{
//Obtengo la memoria suficiente para el array que contendrá las palabras a colocar en sopa de letras
printf("Introduce el numero de palabras a colocar: ");
scanf("%d",&nPalabras);
if (( palabras = malloc( nPalabras*sizeof( char* ))) == NULL )
{
/* error */
}else{
for ( i = 0; i < nPalabras; i++ )
{
if (( palabras[i] = malloc( LARGOMAX )) == NULL )
{
/* error */
}else{
//Obtengo las palabras y las almaceno en el array
PedirPalabras(palabras, nPalabras);
//Lleno la sopa de letra con \0's
inicializa(m,filas,columnas);
//Coloco las palabras en la sopa de letra
for (i = 0; i < nPalabras; i++)
agrega(m, filas, columnas, palabras[i]);
//Muestro como quedan las palabras
muestra(m, filas, columnas);
getchar();
//Relleno los huecos de la sopa de letra
rellena(m, filas, columnas);
getchar();
//Muestro como queda la sopa de letra
muestra(m, filas, columnas);
getchar();
}
}
}
}
}
}
//Libero la memoria de la matriz de la sopa de letras
if( m != NULL ){
for ( i = 0; i < filas; i++ )
{
if (m[i] != NULL)
{
free(m[i]);
}
}
}
free(m);
//Libero la memoria de la matriz de las palabras
if( palabras != NULL ){
for ( i = 0; i < nPalabras; i++ )
{
if (palabras[i] != NULL)
{
free(palabras[i]);
}
}
}
free(palabras);
return 0;
}