(Problema)Matrices Dinámicas de Caracteres!

Iniciado por Reynega, 5 Marzo 2015, 16:59 PM

0 Miembros y 2 Visitantes están viendo este tema.

Reynega

 Espero no estar infringiendo alguna regla del foro, de ser así, pido disculpas de antemano.

Leí las reglas para poder publicar un nuevo tema. Busque sobre temas relacionados y lo que encontré no me fue de mucha ayuda, espero puedan ayudarme en este tema.

Estoy elaborando un proyecto, dicho proyecto es elaborar una sopa de letras con matrices dinámicas(que el jugador pueda elegir el tamaño de la sopa de letras). Mi problema radica a la hora de modificar, imprimir e insertar en la matriz dinámica.

Probé en menor escala el siguiente código para tratar de hallar solución a mi problema y logre que realizara perfectamente todas las operaciones en el main, pero, si separo las operaciones en diferentes funciones, genera un error en tiempo de ejecución.

Citar
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

void asignar(char **matriz, int filas, int columnas);
void iniciar(char **matriz, int filas, int columnas);
void imprimir(char **matriz, int filas, int columnas);
void liberar(char **matriz, int filas, int columnas);

int main()
{   
   char **matriz = NULL;
   int columnas, filas;
   
   printf("\n\t CREANDO MATRIZ DINAMICA!");
   printf("\n\n\t# de filas: ");
   scanf("%d",&filas);
   printf("\n\t# de Columnas: ");
   scanf("%d",&columnas);
   
   asignar(matriz, filas, columnas);
   iniciar(matriz, filas, columnas);
   imprimir(matriz, filas, columnas);
   liberar(matriz, filas, columnas);
   
   getch();
   return 0;
   }
   
void asignar(char **matriz, int filas, int columnas)
{
   //ASIGNAR MEMORIA PARA EL ARRAY DE PUNTEROS
   matriz = ((char **)malloc(sizeof(char*)*filas));
      
   
   //ASIGNAR MEMORIA PARA CADA FILA
   for(int i=0;i<filas;i+=1)
   {   
      matriz = ((char *)malloc(sizeof(char*)*columnas));
      }
   }
   
void iniciar(char **matriz, int filas, int columnas)
{
   //INICIAR LOS ELEMENTOS DE LA MATRIZ DINAMICA
   for(int i=0;i<filas;i+=1)
   {   
      for(int j=0;j<columnas;j+=1)
      {   
         *(*(matriz+i)+j)='.';
         }
      }
   }
   
void imprimir(char **matriz, int filas, int columnas)
{
   //IMPRIMIENDO MATRIZ EN PANTALLA
   system("cls");
   for(int i=0;i<filas;i+=1)
   {   
      puts("\n");
      for(int j=0;j<columnas;j+=1)
      {   
         printf(" %c", *(*(matriz+i)+j));
         }
      }
   }
   
void liberar(char **matriz, int filas, int columnas)
{
   //LIBERAR MEMORIA ASIGNADA A CADA FILA
   for(int i=0;i<filas;i+=1)
   {   
      free(matriz+i);
      }
      
   //LIBERAR LA MEMORIA ASIGNADA AL ARRAY DE PUNTEROS
   free(matriz);
   }

Acaso estoy enviando los parámetros de la matriz mal?

avesudra

#1
El post está mal colocado, solo eso, debería estar en la sección de Programación C/C++ que para eso está.

Tu error es que estás confundiendo los ámbitos de las variables, para asignarle memoria a la variable matriz desde otro ámbito, debes pasarle la dirección de memoria de la variable matriz a la función asignar, quedando así:
asignar(&matriz, filas, columnas);

Y modificar la función asignar en consecuencia:

void asignar(char ***matriz, int filas, int columnas)
{
  //ASIGNAR MEMORIA PARA EL ARRAY DE PUNTEROS
  *matriz = ((char **)malloc(sizeof(char*)*filas));
  //ASIGNAR MEMORIA PARA CADA FILA
  for(int i=0;i<filas;i+=1)
  {  
     **matriz = ((char *)malloc(sizeof(char*)*columnas));
  }
}



Saludos.
Regístrate en

Reynega

Primero que nada, agradecerte por tu pronta respuesta. Segundo, disculparme por la mala ubicación del tema, espero no cause problema alguno más que ese, y por ultimo quiero manifestar otro problema con el código.

Modifique la función 'asignar', siguiendo tu recomendación. como resultado surgio un error en //ASIGNAR MEMORIA PARA CADA FILA, el cuál fue éste


Removiendo uno de los '*', se soluciona el error y permite la compilación, pero!, surge otro inconveniente. Al dar valores para las variables 'filas' y 'columnas' mayores a 1, genera error en tiempo de ejecución.
Espero puedas volver a ayudarme.

rir3760

Cita de: Reynega en  5 Marzo 2015, 18:14 PMModifique la función 'asignar', siguiendo tu recomendación. como resultado surgio un error en //ASIGNAR MEMORIA PARA CADA FILA
Debes pasar un puntero de tipo "char ***" y dentro de la función aplicar indireccion utilizando paréntesis, esto porque los operadores sufijos como "[]" tienen mayor prioridad que los prefijos como "*".

De esta forma:
void asignar(char ***matriz, int filas, int columnas)
{
   *matriz = malloc(filas * sizeof *matriz);
   
   for (int i = 0; i < filas; i++)
      (*matriz)[i] = malloc(columnas * sizeof *(*matriz)[i]);
}


Otro error se encuentra en la función que libera la memoria, la sentencia:
free(matriz + i);
Hay que cambiarla a:
free(matriz[i]);

----

Algunas recomendaciones:
* Evita el uso de la biblioteca conio de Borland, mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|.
* Las conversiones explicitas del valor retornado por las funciones malloc, calloc y realloc NO son necesarias y no se recomiendan.
* Cuando publiques código fuente utiliza las etiquetas de código, si utilizas las etiquetas para citar no se puede revisar el código fuente correctamente.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

avesudra

Ups, craso error, gracias por corregirme rir3760.

Saludos.
Regístrate en