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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda Punteros Dobles/Array de punteros
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda Punteros Dobles/Array de punteros  (Leído 4,861 veces)
MisterJava

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Duda Punteros Dobles/Array de punteros
« en: 20 Diciembre 2012, 19:52 pm »

Buenas tardes.

Tenía una duda sobre la creación de Un array de punteros. Os explico la idea: Tengo que hacer un programa que me devuelva las lineas de entrada en orden inverso, es decir, la ultima linea como la primera, y la primera como la última. Para ello he recurrido a crear lo que viene siendo un puntero doble. Me he tirado toda la tarde intentando buscar una solucion pero no doy con ella, No se que estoy haciendo mal en el código y me sale un Segmentation Fault.

Aqui os muestro el código:

Citar
void delreves(FILE* archivo){
        char string[100];
        char *pointer;
        char **array_pointers;
        int i=0;
        char **aux;
        array_pointers=(char**)malloc(sizeof(char*));
        if(array_pointers==NULL){
                exit(-1);
        }
        int size=1;
        while(!feof(archivo)){
                fgets(string,2048,archivo);
        aux=(char **)realloc(array_pointers,(sizeof(char)*size));
        if(aux!=NULL){
                array_pointers=aux;
        }
        pointer=pointer+i;
        array_pointers=array_pointers+i;
        pointer=strdup(string);
        array_pointers=&pointer;
        size++;
        i++;
        }
}

El problema me surge principalmente al usar el movimiento de punteros, que no se porque no me lo ejecuta bien.

Os agradecería que me ayudarais a entender como usar un puntero doble para que vaya apuntando a cada uno de los punteros con malloc y realloc.

Gracias por vuestro tiempo.


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Duda Punteros Dobles/Array de punteros
« Respuesta #1 en: 23 Diciembre 2012, 04:04 am »

El problema principal en esa función es el incremento de la variable "array_pointers", al hacerlo pierdes la dirección base. En su lugar:

1) Reservas el bloque de memoria principal, este lo utilizas para almacenar la dirección de memoria de cada cadena.

2) Utilizas un auxiliar para leer la linea. Para esta reservas un bloque de memoria del tamaño apropiado, copias ahí la cadena y guardas su dirección en el bloque principal.

3) Si el bloque principal se llena reajustas su tamaño con realloc.

La función con las correcciones:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define NUM_CHARS  4096
  6.  
  7. void delreves(FILE *entrada);
  8.  
  9. /* ... */
  10.  
  11. void delreves(FILE *entrada)
  12. {
  13.   char temp[NUM_CHARS];
  14.   char **linea;
  15.   int i;
  16.   int max_lineas = 16;
  17.  
  18.   linea = malloc(max_lineas * sizeof *linea);
  19.  
  20.   i = 0;
  21.   while (fgets(temp, NUM_CHARS, entrada) != NULL){
  22.      linea[i] = malloc(strlen(temp) + 1);
  23.      strcpy(linea[i], temp);
  24.      i++;
  25.  
  26.      if (i == max_lineas){
  27.         max_lineas *= 2;
  28.         linea = realloc(linea, max_lineas * sizeof *linea);
  29.      }
  30.   }
  31.  
  32.   linea = realloc(linea, i * sizeof *linea);
  33.  
  34.   /* Procesamiento de las lineas ... */
  35.  
  36.   /* Liberacion de la memoria utilizada */
  37.   while (i-- > 0)
  38.      free(linea[i]);
  39.   free(linea);
  40. }
Por cierto no hay validaciones para reducir en lo posible el código fuente, eso te toca a ti.

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
MisterJava

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Duda Punteros Dobles/Array de punteros
« Respuesta #2 en: 30 Diciembre 2012, 20:19 pm »

El problema principal en esa función es el incremento de la variable "array_pointers", al hacerlo pierdes la dirección base. En su lugar:

1) Reservas el bloque de memoria principal, este lo utilizas para almacenar la dirección de memoria de cada cadena.

2) Utilizas un auxiliar para leer la linea. Para esta reservas un bloque de memoria del tamaño apropiado, copias ahí la cadena y guardas su dirección en el bloque principal.

3) Si el bloque principal se llena reajustas su tamaño con realloc.

La función con las correcciones:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define NUM_CHARS  4096
  6.  
  7. void delreves(FILE *entrada);
  8.  
  9. /* ... */
  10.  
  11. void delreves(FILE *entrada)
  12. {
  13.   char temp[NUM_CHARS];
  14.   char **linea;
  15.   int i;
  16.   int max_lineas = 16;
  17.  
  18.   linea = malloc(max_lineas * sizeof *linea);
  19.  
  20.   i = 0;
  21.   while (fgets(temp, NUM_CHARS, entrada) != NULL){
  22.      linea[i] = malloc(strlen(temp) + 1);
  23.      strcpy(linea[i], temp);
  24.      i++;
  25.  
  26.      if (i == max_lineas){
  27.         max_lineas *= 2;
  28.         linea = realloc(linea, max_lineas * sizeof *linea);
  29.      }
  30.   }
  31.  
  32.   linea = realloc(linea, i * sizeof *linea);
  33.  
  34.   /* Procesamiento de las lineas ... */
  35.  
  36.   /* Liberacion de la memoria utilizada */
  37.   while (i-- > 0)
  38.      free(linea[i]);
  39.   free(linea);
  40. }
Por cierto no hay validaciones para reducir en lo posible el código fuente, eso te toca a ti.

Un saludo

Tío, no sé como darte las gracias rir3760.
Esa forma de usar el realloc no se me había ocurrido y llevabamos pillados 1 semana(porque los profesores no explican una m...) y el usar el tamaño de p como contador de aumento de memoria ni me había fijado.

De verdad, GRACIAS! Te debo mi aprobado, puto crack. :)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Array de punteros.
Programación C/C++
soyloqbuskas 3 9,404 Último mensaje 30 Enero 2012, 20:28 pm
por soyloqbuskas
Problema con iterador a lista de punteros
Programación C/C++
SrCooper 4 2,861 Último mensaje 24 Julio 2013, 15:43 pm
por Eternal Idol
[Ayuda] Vector de punteros a objectos
Programación C/C++
bemone 2 2,059 Último mensaje 24 Agosto 2013, 19:55 pm
por bemone
Punteros dobles / Punteros a puntero.
Programación C/C++
NOB2014 5 7,874 Último mensaje 13 Abril 2016, 16:00 pm
por MAFUS
Representación visual de punteros y punteros a punteros.. « 1 2 »
Programación C/C++
digimikeh 13 4,090 Último mensaje 4 Mayo 2019, 01:54 am
por RayR
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines