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


 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Consulta sobre punteros y memoria dinámica
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Consulta sobre punteros y memoria dinámica  (Leído 413 veces)
ing_maipu

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Consulta sobre punteros y memoria dinámica
« en: 12 Octubre 2017, 22:13 »

Hola! Estoy intentando implementar una función en C que me arme una trama (cadena de caracteres) que luego será mandada a través de un canal de comunicación.

Para esto, primero tengo que crear la trama, la cual está compuesta de sus respectivos encabezados, campos de información, indicadores de fin de trama y finalmente el checksum.

Mi problema es que la longitud de la trama (cantidad de caracteres que poseerá) nunca será fija. Esto es, dependiendo de la trama que deseo enviar, varía la longitud de la misma, ya que ni la cantidad de campos es fija, ni la cantidad de caracteres lo es.

Para esto, se me ocurrió que podía hacer una función cuya declaración sea la siguiente:
Código:
char *armar_trama(char **campos, int cant_campos);//Funcion que devuelve una trama ya armada lista para enviar.

En donde **campos vendría a ser un vector de <cant_campos> cadenas de caracteres, en donde cada una de estas es de longitud distinta. Cada uno de estas cadenas representará un campo disitinto.

La idea es que la función concatene cada uno de estos campos dentro de una misma cadenas de caracteres y luego esta cadena de caracteres (trama) sea devuelta por la función.

Mi pregunta es: ¿Es necesario pedir memoria dinámica cada vez que concateno un campo dentro de la cadena de caracteres (trama) que será devuelta?

Muchas gracias por su ayuda


En línea

Gallu

Desconectado Desconectado

Mensajes: 234



Ver Perfil
Re: Consulta sobre punteros y memoria dinámica
« Respuesta #1 en: 13 Octubre 2017, 13:16 »

Si la "trama"(cadena de caracteres) es un puntero a char es seguro que necesitas reservar memoria para incluir todo lo que deseas incluir en ella, si es un array de char pues deberás inicializarlo también.

Yo lo que haría es crear una estructura que represente la trama que quiero devolver, algo como:

Código
  1. struct Trama{
  2.   char  * headers;
  3.   char  * info;
  4.   char  * indicators;
  5.   char *checksum;
  6. };
  7.  

Luego en la función debes calcular la longitud de cada uno de los elementos de la trama para reservar la memoria necesaria que deberás reservar.

Espero haberme explicado y que te sirva.

Saludos


En línea

Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.
ing_maipu

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Consulta sobre punteros y memoria dinámica
« Respuesta #2 en: 13 Octubre 2017, 15:35 »

Muchas gracias por tu respuesta Didacso.

Había pensado en hacer algo de ese tipo pero sucede que la función que me envía las tramas al canal de comunicación recibe únicamente variables del tipo char*. Por esta razón estaba necesitando una función que me devuelva la trama como cadena de caracteres.

Sucede que para ese puntero doble que recibirá la función (char **campos), ya habré pedido memoria dinámica.

Entonces el procedimiento dentro de mi función consistirá en volver a pedir memoria dinámica y liberar la que ya habia pedido cuando creé el puntero doble?

Saludos
En línea

Gallu

Desconectado Desconectado

Mensajes: 234



Ver Perfil
Re: Consulta sobre punteros y memoria dinámica
« Respuesta #3 en: 13 Octubre 2017, 16:16 »

Entiendo que el puntero doble lo creas tú, correcto  ??

lo que te proponía es algo asi:

Código
  1. char * getData(Trama trama){
  2.    int sizeofheader = sizeOf(trama->header);
  3.    int sizeofInfo = ...
  4. ..
  5.  
  6.  
  7.    char * data = malloc(sizeofheader  + sizeofInfo  ); etc etc
  8.  
  9.   //luego tienes que copiar los diferentes valores de los campos de la trama en tu puntero de char
  10.  
  11.   return data;
  12. }
  13.  

En resumen calculas el tamaño de cada uno de los campos de tu Trama y luego  reservas la memoria necesaria para poder copiar toda la información en el puntero de char que la función devolverá.

Saludos
« Última modificación: 13 Octubre 2017, 16:20 por Didacso » En línea

Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.
Gallu

Desconectado Desconectado

Mensajes: 234



Ver Perfil
Re: Consulta sobre punteros y memoria dinámica
« Respuesta #4 en: 13 Octubre 2017, 23:29 »

Hola, estaba aburrido y decidí escribir una implementación de lo comentado, espero te sirva.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. typedef struct {
  6. char * headers;
  7. char * info;
  8. char * checksum;
  9. }Trama;
  10.  
  11.  
  12. char * dataFromTrama(Trama * trama);
  13. char checksum(char* s);
  14.  
  15.  
  16. int main(int argc, char **argv)
  17. {
  18. char* header = "the header";
  19. char* info = "the info";
  20.  
  21.  
  22. Trama * trama = (Trama *) malloc(sizeof(Trama));
  23. (*trama).headers = (char *) malloc(sizeof(header));
  24. (*trama).info = (char *) malloc(sizeof(info));
  25.  
  26. strcpy((*trama).headers, header);
  27. strcpy((*trama).info, info);
  28.  
  29. char * result = dataFromTrama(trama);
  30.  
  31. printf ("%s\n" , result );
  32.  
  33. return 0;
  34.  
  35. }
  36.  
  37.  
  38. char * dataFromTrama(Trama * trama){
  39.  
  40. char* tmpData;
  41.  
  42. int sizeTotal = sizeof((*trama).headers) + sizeof((*trama).info) + sizeof(char);
  43.  
  44. tmpData = (char *) malloc(sizeTotal);
  45.  
  46. memset(tmpData, '\0', sizeTotal);
  47.  
  48. strcpy(tmpData, (*trama).headers);
  49.  
  50. strcat(tmpData , (*trama).info);
  51.  
  52. char checksumdata = checksum(tmpData);
  53.  
  54. printf ("Checksum %d \n" , checksumdata );
  55.  
  56. tmpData = strcat(tmpData , &checksumdata);
  57.  
  58. return tmpData;
  59. }
  60.  
  61.  
  62. char checksum(char* s){
  63. signed char sum = -1;
  64. while (*s != 0) {
  65. sum += *s;
  66. s++;
  67. }
  68. return sum;
  69. }
  70.  
  71.  
En línea

Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.
ing_maipu

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Consulta sobre punteros y memoria dinámica
« Respuesta #5 en: 18 Octubre 2017, 19:21 »

Hola Gallu

Muchas gracias por tu respuesta. La misma me ha sido de gran ayuda para la implementación puesto que he hecho algo similar. La unica diferencia es que los campos los guardo en una  una matriz de cantidad de columnas variable (i.e, puntero doble) para así poder poner correctamente los separadores de campos cuando corresponda.

Saludos

En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines