Problema en Lenguaje C.

OniriK

Me explico es un diccionario que traduce del español al ingles, es mu simple. Pero al traducir no me muestra la 1 palabra correctamente, y si asigno mas de 2 palabras en el diccionario me peta la memoria, alguien con conocimientos de C, puede repasar el codigo y explicarme q pasa ?. Yo creo q es correcto ....

Codigo:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define N 40

typedef struct
{
char *esp;
char *ing;
}trad;

void creardic(trad **,int);
void traducir(trad **,int);

main()
{
trad **p;
int x,y,i;

printf("Cuantas palabras quieres introducir?");
scanf("%d",&y);
fflush(stdin);
p=(trad **)malloc(sizeof(trad )y);
clrscr();
do{
clrscr();
printf("\tMenu\n");
printf("1.-Crear Diccionario.\n");
printf("2.-Traducir.\n");
printf("3.-Salir.\n");
printf("Introduce una opcion:");
scanf("%d",&x);
fflush(stdin);
switch(x)
{
case 1:creardic(p,y);break;
case 2:traducir(p,y);break;
case 3:break;
}
}while(x!=3);
for(i=0;i<y;i++)
{
free(p->esp);
free(p->ing);
}
free(p);
}

void creardic(trad **p,int y)
{
int x,i;
char cadena[N];

clrscr();
for(x=0;x<y;x++)
{
clrscr();
printf("Introduce la paraula:");
gets(cadena);
i=strlen(cadena);
p[x]->esp=(char )malloc(sizeof(char)i);
if(p[x]->esp==NULL)
break;
else
strcpy(p[x]->esp,cadena);
printf("Introduce la traduccion:");
gets(cadena);
i=strlen(cadena);
p[x]->ing=(char )malloc(sizeof(char)i);
if(p[x]->ing==NULL)
break;
else
strcpy(p[x]->ing,cadena);
}
}


void traducir(trad **p,int y)
{
int x;
char cadena[N];

clrscr();
printf("Introduce la palabra:");
gets(cadena);
for(x=0;x<y;x++)
{
if((strcmp(cadena,p[x]->esp)==0))
{
printf("%s",p[x]->ing);
getchar();
break;
}
}
}

ArcheR

#2, has puesto los includes? el clrscr() debería pillartelo.

ArcheR

Pero tu con que compilas?
Yo uso el borlandc 3.11

OniriK

uso el Borland c++ 5.02

el problema creo que debe estar en la asigna cion de memoria dinamica, ya k el problema concreto al que me refiero debe encontrarse en la funcion "Creardic", o "traducir", xk no muestra el primer elemento del array de structuras al intentar acceder a el. Por ejemplo si introduces casa y house al crear el diccionario. Despues en el menu le das a traducir, introduces casa y deberia mostrar house, pero no lo aze y vuelve de nuevo al menu. La funcion clrscr(); es solo para windows, ya que linux usa la funcion clear, y ademas linux no contiene la libreia conio.h.

PiRuLeTa

prueba a sustituir los clear screen por system("cls") de process.h

OniriK

esos a los que haceis referencia , no son los errores que tiene, el programa. Insisto el programa funciona "casi" correctamente. No tiene nada que ver ni con la funcion gets ni la clrscr. ok ?. El rpoblema es que no muestra el elemento "p[x]->" cuando el valor de x es 0 y ademas si intento introducir mas de 2 palabras se produce una violacion de acceso a memoria que no deberia. Es "eso" lo que quiero saber xk no funciona correctamente. Nada de las funciones de inserccion limpieza o muestra. Olvidaros de los gets , clsscr y demas ..... y centraros en lo que es la asignacion de memoria o quiza el error este en los bucles. Ademas el programa es para win, no para LinuX.

Gracias de todos modos y advertirme si dais con el error.

r2d2rigo

Azathoth, he probado el programa y funciona correctamente, pero hay dos pequeños problemas:

1- Al invocar cualquier funcion, extrañamente el programa utiliza memoria swap del disco duro, algo que no deberia pasar (quiza porque reserva una cantidad de datos enorme).

2- Al salir del programa, este da error, este la memoria reservada o no.

Voy a echarle un ojo y si puedo arreglarlo copio el codigo entero.

EDIT: Vale, el acceso al HD es debido a las llamadas a system("cls"). Continuo con el problema de la destruccion de los punteros.

EDIT2: El error esta en el siguiente bloque:

for(i=0;i<y;i++)
{
if(p.esp!=NULL)
free(p.esp);
if(p.ing!=NULL)
free(p.ing);
}

Creo con linea free(p); bastaria para liberar la memoria reservada para todo el puntero a estructura.

r2d2rigo

No, el valor de retorno de main no interfiere para nada con este tipo de errores; el compilador utiliza por defecto el tipo void. Respecto a lo de memoria swap, al principio he creido que la utilizaba porque accedia al disco duro al ejectuar el programa, pero luego lo he traceado (uso Visual C++ 6.0) y era por la ejecucion del programa externo (cls). Por cierto, lee mi reply anterior, lo he editado y ahora esta mas claro :P

OniriK

voy a probar y os cuento a ver ..... . Quiza si, el error puede encontrarse al declarar el arry de punteros. nu ze ?. Compronbando a ver .....

Gracias penya. Ya os cuento

LOc0

He compilado la última versión con Dev C++ y con LCC y funcionan casi perfectamente. Si se intenta traducir sin haber creado diccionario, se cuelga al llegar a:

if((strcmp(cadena,p[x].esp)==0))

Supongo que será porque p[x].esp NO tiene memoria reservada y por eso la funciónd e comparación peta...

Ponle un controlcillo booleano y tira millas...

Salu2 ;)

OniriK

Azaroth, funciona perfectamente. Voy a ver si consiguo reparar mi codigo.

Gracias.

javithelong

conio.h no es una libreria estandar de C, es una un tanto extraña, por eso no te la reconocia en lino.

para incluirla, tienes que ponerle un parametro al gcc, igual que para incluir math.h (hay que poner un -lm) pos creo que igual, pero otro parametro distinto, claro

switch

no me he leído el post, pero conio es una biblioteca de borland y que yo sepa no existe para linux, a no ser que esté incluida en el kylix

OniriK

No existe en linux. Pero podeis dejarlo star , jejejeje, me hace gracia lo os preocupais por una funcion que simplemente borra la pantalla y que en linux y Win es diferente. Eso no puede ocasionar ningun problema. El problemilla estaba en la asignacion de memoria dinamica, para el array de punteros, pero ya se soluciono en su dia. Este post ya es historia.

:P, Gracias a todos los que respondieron.

Usuarios habituales

  • OniriK
  • switch
  • javithelong
  • LOc0
  • r2d2rigo
  • PiRuLeTa
  • ArcheR