[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