Ver Mensaje Individual
  #1  
Antiguo 13-09-2015
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Reputación: 14
aguml Va por buen camino
Problemas con memoria dinamica

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?
Este es el codigo:
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 **mint filasint columnas) {
    
int ij;

    for (
0filasi++)
        for (
0columnasj++)
            
m[i][j] = '\0';
}

void PedirPalabras(char **palabrasint nPalabras){
   
int i,x;

   for (
0nPalabrasi++){
      
printf("Introduce una palabra: ");
      
scanf("%s"palabras[i]);
      for (
0LARGOMAXx++){
         
palabras[i][x]=toupper(palabras[i][x]);
      }
   }
}

// Llena los espacios vacíos con caracteres al azar
void rellena(char **mint filasint columnas) {
    
int ij;

    for (
0filasi++)
        for (
0columnasj++)
            if (
m[i][j] == '\0')
                
m[i][j] = rand() % 26 65;
}

// Muestra la sopa de letras
void muestra(char **mint filasint columnas) {
    
int ij;

    
printf("\n\n");
    for (
0filasi++) {
        for (
0columnasj++)
            
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 **mint filasint columnas, const char *sint xint yint dxint dy) {
    
int i1;

    for (
0< (int)strlen(s); i++, += dx+= dy){
        if (
|| || >= columnas || >= filas || (m[y][x] != s[i] && m[y][x] != '\0')){
            
0;
            break;
        }
    }
    if(
v==1)
      
printf("\n%s puede agregarse (x%d, y%d, dx%d, dy%d): %d"sxydxdyv);

    return 
v;
}

// Agrega la palabra s a la sopa de letras
void agrega(char **mint filasint columnas, const char *s) {
    
int ixydxdy;

    
dx rand() % 1;
    
dy rand() % 1;
    
dx dx == dx;
    while (!
valida(mfilascolumnassrand() % columnasrand() % filasdxdy)) ;
    for (
0< (int)strlen(s); i++, += dx+= 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 filascolumnasnPalabras;
    
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 (( mallocfilas*sizeofchar* ))) == NULL )
    {
      
/* error */
    
}else{

      for ( 
0filasi++ )
      {
         if (( 
m[i] = malloccolumnas )) == 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 mallocnPalabras*sizeofchar* ))) == NULL )
            {
               
/* error */
            
}else{
               for ( 
0nPalabrasi++ )
               {
                  if (( 
palabras[i] = mallocLARGOMAX )) == NULL )
                  {
                     
/* error */
                  
}else{
                     
//Obtengo las palabras y las almaceno en el array
                     
PedirPalabras(palabrasnPalabras);

                     
//Lleno la sopa de letra con \0's
                     
inicializa(m,filas,columnas);

                     
//Coloco las palabras en la sopa de letra
                     
for (0nPalabrasi++)
                        
agrega(mfilascolumnaspalabras[i]);

                     
//Muestro como quedan las palabras
                     
muestra(mfilascolumnas);
                     
getchar();

                     
//Relleno los huecos de la sopa de letra
                     
rellena(mfilascolumnas);
                     
getchar();

                     
//Muestro como queda la sopa de letra
                     
muestra(mfilascolumnas);
                     
getchar();
                  }
               }
            }
         }
      }
    }

    
//Libero la memoria de la matriz de la sopa de letras
    
if( != NULL ){
      for ( 
0filasi++ )
      {
         if (
m[i] != NULL)
         {
            
free(m[i]);
         }
      }
    }
    
free(m);

    
//Libero la memoria de la matriz de las palabras
    
if( palabras != NULL ){
      for ( 
0nPalabrasi++ )
      {
         if (
palabras[i] != NULL)
         {
            
free(palabras[i]);
         }
      }
    }
    
free(palabras);
    return 
0;

Responder Con Cita