elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  (Problema)Matrices Dinámicas de Caracteres!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: (Problema)Matrices Dinámicas de Caracteres!  (Leído 4,807 veces)
Reynega

Desconectado Desconectado

Mensajes: 2


Ver Perfil
(Problema)Matrices Dinámicas de Caracteres!
« en: 5 Marzo 2015, 16:59 pm »

 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?


En línea

avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: (Problema)Matrices Dinámicas de Caracteres!
« Respuesta #1 en: 5 Marzo 2015, 17:12 pm »

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í:
Código
  1. asignar(&matriz, filas, columnas);

Y modificar la función asignar en consecuencia:

Código
  1. void asignar(char ***matriz, int filas, int columnas)
  2. {
  3.   //ASIGNAR MEMORIA PARA EL ARRAY DE PUNTEROS
  4.   *matriz = ((char **)malloc(sizeof(char*)*filas));
  5.   //ASIGNAR MEMORIA PARA CADA FILA
  6.   for(int i=0;i<filas;i+=1)
  7.   {  
  8.      **matriz = ((char *)malloc(sizeof(char*)*columnas));
  9.   }
  10. }


Saludos.


« Última modificación: 5 Marzo 2015, 17:14 pm por avesudra » En línea

Regístrate en
Reynega

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: (Problema)Matrices Dinámicas de Caracteres!
« Respuesta #2 en: 5 Marzo 2015, 18:14 pm »

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.
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: (Problema)Matrices Dinámicas de Caracteres!
« Respuesta #3 en: 6 Marzo 2015, 03:37 am »

Modifique 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:
Código
  1. void asignar(char ***matriz, int filas, int columnas)
  2. {
  3.   *matriz = malloc(filas * sizeof *matriz);
  4.  
  5.   for (int i = 0; i < filas; i++)
  6.      (*matriz)[i] = malloc(columnas * sizeof *(*matriz)[i]);
  7. }

Otro error se encuentra en la función que libera la memoria, la sentencia:
Código
  1. free(matriz + i);
Hay que cambiarla a:
Código
  1. 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
En línea

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


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: (Problema)Matrices Dinámicas de Caracteres!
« Respuesta #4 en: 6 Marzo 2015, 18:33 pm »

Ups, craso error, gracias por corregirme rir3760.

Saludos.
En línea

Regístrate en
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
duda matrices dinámicas multidimencionales
Programación Visual Basic
:matux: 1 1,900 Último mensaje 20 Agosto 2007, 14:03 pm
por :matux:
Matrices dinámicas en C
Programación C/C++
thekill01 3 4,822 Último mensaje 22 Mayo 2012, 02:06 am
por icoheed
Matrices dinámicas
Programación C/C++
MPLS 3 2,236 Último mensaje 4 Noviembre 2015, 04:31 am
por crack81
suma de dos matrices dinamicas con punteros
Programación C/C++
piyor6 2 5,613 Último mensaje 6 Mayo 2018, 17:27 pm
por piyor6
Problema en C que no puedo resolver, Malloc y matrices dinámicas
Programación C/C++
i7Savage 3 2,467 Último mensaje 29 Junio 2019, 12:08 pm
por K-YreX
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines