[C con Clase] Dudas con realloc

Martin Strahd xaninverno en gmail.com
Jue Feb 10 14:23:24 CET 2011


Muchas gracias por la ayuda. He conseguido realizar el programa de ambas
maneras, con la versión de puntero a puntero de arrays de punteros y la
versión con estructuras

Escribo el códgio de la versión 2 por si a alguien le sirviese de ayuda
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct st_palabra
{
 char *pszPalabra;  /* Cadena dinámicamente adjudicada */
 int nHomologa;  /* Índice a la palabra traducida y asociada a ésta */
} palabra;

typedef struct st_diccionario
{
 palabra *pLista;                   /* Contendrá el array de estructuras con
las palabras escritas */
 unsigned long int nCantidad;       /* Tamaño del diccionario */
} diccionario;

/**** Prototipos de las funciones ****/
void crearDiccionario (diccionario *, diccionario* );
void traducir (diccionario, diccionario, char*);

void main(void)
{
    char bqda[40];         /* Para almacenar la palabra */

    diccionario ingles, espanhol;

    /* Se inicializan los punteros */
    ingles.pLista = NULL;
    espanhol.pLista = NULL;
    ingles.nCantidad = 0;
    espanhol.nCantidad = 0;


    crearDiccionario (&ingles, &espanhol);      /* Se pasan las estructuras
por referencia para que las modificaciones se guarden */

    printf("\nPara buscar una traducción introduce una palabra a buscar,
para finalizar pulsa <Enter> o EOF\n");
    do
    {
        printf("Introduce palabra: ");
        fgets(bqda, 40, stdin);
        bqda[strlen(bqda) - 1] = '\0';

        if (bqda[0] != '\0')
            traducir(ingles, espanhol, bqda);
    }
    while (bqda[0] != '\0');




}

void crearDiccionario (diccionario *ing, diccionario *esp)
{
    char pesp[40], ping[40];        /* Cadenas temporales para almacenar las
palabras introducidas */
    int longitud;                   /* Variable para reajustar el resultado
de fgets */
    int i = 0;                      /* Indice para bucle while */

    /* Preguntamos al usuario para que introduzca las parejas de palabras */
    printf("\nIntroduce las parejas de palabras\n");
    do
    {
        printf ("Introduce la palabra inglesa: ");
        fgets(ping, 40, stdin);
        printf ("Introduce la palabra española: ");
        fgets (pesp, 40, stdin);

        /* Ajustamos las cadenas para eliminar el carácter '\n' */
        longitud = strlen(ping);
        ping[longitud-1] = '\0';
        longitud = strlen(pesp);
        pesp[longitud-1] = '\0';

        if (ping[0] != 0 && pesp[0] != 0)       /* Si hay una pareja válida
en ping y pesp ejecuta el código de asginación */
        {
            /* Aumenta los contadores de tamaño de cada estructura */
            ing->nCantidad++;
            esp->nCantidad++;


            /* Se crea espacio para el nuevo elemento en cada diccionario */
            ing->pLista = (palabra*)realloc (ing->pLista, ing->nCantidad *
sizeof(palabra));
            esp->pLista = (palabra*)realloc (esp->pLista, esp->nCantidad *
sizeof(palabra));

            /* Se crea espacio para cada cadena de caracteres */
            ing->pLista[i].pszPalabra = (char*)realloc
(ing->pLista[i].pszPalabra, (strlen(ping)+1)); /* Se suma uno a strlen(ping)
para incluir el carácter nulo */
            esp->pLista[i].pszPalabra = (char*)realloc
(esp->pLista[i].pszPalabra, (strlen(pesp)+1));

            /* Se copian los valores temporales (ping, pesp) a los
definitivos */
            strcpy (ing->pLista[i].pszPalabra, ping);
            strcpy (esp->pLista[i].pszPalabra, pesp);

            /* Se asignan los índices de las homologas */
            ing->pLista[i].nHomologa = i;
            esp->pLista[i].nHomologa = i;
            i++;
        }

    }
    while(i < 100 && ping[0] != 0 && pesp[0] != 0);
}

void traducir (diccionario ing, diccionario esp, char* obj)
{
    int i = 0;      /* Indice */

    while (i < ing.nCantidad && strcmp(ing.pLista[i].pszPalabra, obj))i++;

    if (i < ing.nCantidad)
        printf("La traducción de %s es %s\n", obj,
esp.pLista[i].pszPalabra);
    else
        printf ("Palabra no encontrada\n");
}

La version 1 funciono simplemente con la modificación propuesta
     >*ing = (char**)realloc(*ing, tam * sizeof (char*));
     > *esp = (char**)realloc(*esp, tam * sizeof (char*));
     > (*ing)[tam-1] = (char*)realloc((*ing)[tam-1], strlen(palai)+1);
     >(*esp)[tam-1] = (char*)realloc((*esp)[tam-1], strlen(palae)+1);

Un saludo y nuevamente gracias
Xan.

-- 
Una vez le preguntaron al Buda que es lo que a él más le sorprendía de la
humanidad. El Buda respondió: "Los hombres, que pierden la salud para juntar
dinero, y luego pierden el dinero para recuperarla y que por pensar
ansiosamente en el futuro olvidan el presente de tal forma, que acaban por
no vivir ni el presente ni el futuro. Viven como si nunca fuesen a morir, y
mueren como si nunca hubiesen vivido".
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20110210/41a91442/attachment.html>


Más información sobre la lista de distribución Cconclase