/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Ayuda para averiguar donde esta el error

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
dgs3333



Registrado: 23 Nov 2012
Mensajes: 7
Ubicación: Benidorm

MensajePublicado: 09/04/2014 8:40 am
Título: Ayuda para averiguar donde esta el error

Hola,

Por favor a ver si alguien me puede explicar porque se produce un error en la ejecución del siguiente programa cuando se invoca a la función Traducir:

Código:
/* Diccionario traductor Inglés-Español
 *
 * dictra.c
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXPAR 100
#define LONGPAL 40

int CrearDiccionario (char *);
char *Traducir (char *, char *, int);

main()
{
   char *palabras = (char *)malloc(MAXPAR * 2 * ((sizeof(char) * 40)));
   char palabra[LONGPAL], *p;
   int numpar = 0;
      
   if ((numpar = CrearDiccionario(palabras)) == 0)
   {
      printf("No hay ninguna palabra en el diccionario");
   }   

   printf("Introducir palabra inglesa a traducir: ");
   fgets(palabra, LONGPAL, stdin);
   p = Traducir(palabra, palabras, numpar);
   if (p = NULL)
   {
      printf("Valor Nulo.");
   }
   else
   {
      printf("En español es: %s", *p);
   }

}

int CrearDiccionario(char *diccio)
{
   int i;
   char cadena[LONGPAL];
   
   printf("CREAR DICCIONARIO.\n");
   printf("100 parejas máximo. 40 caracteres por palabra.\n\n\n");
   
   for (i = 0; i < (MAXPAR); i++)
   {
      printf("Palabra %d (ingles): ", i+1);
      if ((fgets(cadena, LONGPAL, stdin)) == NULL) break;
      strcpy(diccio + (i * (LONGPAL * 2)), cadena);
      
      printf("Traducción (Español): ");
      if ((fgets(cadena, LONGPAL, stdin)) == NULL) break;
      strcpy(diccio + (i * ((LONGPAL * 2) + LONGPAL)), cadena);
      
      printf("\n");
   }

   printf("\n\n");
   return i;
}

char *Traducir (char *pal, char *pals, int numpar)
{
   int i;
   for (i = 0; i < numpar; i++)
   {
      if (strcmp(pal, pals + (i * 80)) == 0)
      {
         return (pals + ((i * 80) + LONGPAL));
      }
   }
   return NULL;
}



Estoy utilizando Microsoft Visual C++ 2010 Express en Windows 7 Home Premium.
Un saludo.
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7517
Ubicación: Mexico

MensajePublicado: 13/04/2014 8:29 am
Título:

Lo primero que debes cambiar es la definición de la función main a "int main(void) ..." o "int main() ..." e indicar su valor de retorno con (al menos) "return 0;".

Los errores son tres. El primero en la sentencia:
Código:
if (p = NULL)

Utilizas el operador de asignación "=" cuando debería ser el de comparación "==".

El segundo en la sentencia:
Código:
printf("En español es: %s", *p);

Ahí el operador de indirección "*" esta de mas, eliminalo.

El tercero en la expresión:
Código:
strcpy(diccio + (i * ((LONGPAL * 2) + LONGPAL)), cadena);

El problema ahí es debido a los paréntesis, primero se calcula "((LONGPAL * 2) + LONGPAL)" y solo entones se multiplica por "i". Hay que cambiarla a "(i * (LONGPAL * 2) + LONGPAL)".

Después de aplicar los cambios indicados el programa funciona correctamente.

Un saludo
_________________
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
Volver arriba
dgs3333



Registrado: 23 Nov 2012
Mensajes: 7
Ubicación: Benidorm

MensajePublicado: 30/04/2014 10:18 am
Título:

Hola rir3760,

Muchas gracias por la solución. Efectivamente así funciona bien.
Perdona que no te haya respondido antes, pero he estado ocupado con otro asunto importante.

Un saludo.
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com