Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Error en una funcion

Estas en el tema de Error en una funcion en el foro de C/C++ en Foros del Web. Código: #include <stdio.h> #include <stdlib.h> #define TAM 50 typedef struct { char nombre[30]; char apellido1[30]; int dni; char sexo; int edad; } Persona; void cargar_txt(Persona ...
  #1 (permalink)  
Antiguo 14/12/2014, 12:57
Banshi
Invitado
 
Mensajes: n/a
Puntos:
Error en una funcion

Código:
#include <stdio.h>
#include <stdlib.h>
#define TAM 50

typedef struct
{
    char nombre[30];
    char apellido1[30];
    int dni;
    char sexo;
    int edad;
} Persona;

void cargar_txt(Persona []);
void ver_persona(char [],Persona []);
void persona_mayor(Persona [],Persona *);
int main()
{
    Persona personas[TAM];
    Persona mayor={"","",0,"",0};
    cargar_txt(personas);
    char nombre[30];
    printf("La persona mayor de edad es:\n");
    persona_mayor(personas,&mayor);
    printf("\nVer datos de una persona\n");
    printf("Que persona quieres ver?\n");
    scanf("%s",&nombre);
    ver_persona(nombre,personas);
    return 0;

}
void cargar_txt(Persona personas[TAM])
{
    FILE *f;
    Persona p;
    char *token;
    f=fopen("PERSONAS.txt","r");


    if(f==NULL)
    {
        printf("Error de apertura\n");
    }
    else
    {
        char cad[250];
        int cont=0,per=0;
        fgets(cad,255,f);
        while(!feof(f))
        {
            token = strtok(cad, ","); /*Separamos por espacios*/
            while (token != NULL)
            {
                switch(cont)
                {
                case 0:
                    strcpy(p.nombre,token);
                    break;
                case 1:
                    strcpy(p.apellido1,token);
                    break;
                case 2:
                    p.dni=atoi(token);
                    break;
                case 3:
                    p.sexo=token[0];
                    break;
                case 4:
                    p.edad=atoi(token);
                    break;
                }
                cont++;
                token = strtok(NULL,",");
            }
            personas[per]=p;
            cont=0;
            per++;
            fgets(cad,255,f);

        }
        fclose(f);
    }
}
void ver_persona(char nombre[30],Persona personas[TAM])
{
    int i=0,enc=0;
    while(i<TAM && !enc)
    {
        if(strcmp(personas[i].nombre,nombre)==0)
        {

            printf("Nombre: %s\n",personas[i].nombre);
            printf("Apellido: %s\n",personas[i].apellido1);
            printf("DNI: %d\n",personas[i].dni);
            printf("Sexo: %c\n",personas[i].sexo);
            printf("Edad: %d\n",personas[i].edad);
            enc=1;

        }
        else
        {
            i++;
        }
    }
}

void persona_mayor(Persona personas[TAM],Persona *mayor)
{
    int i;
    int edad=personas[0].edad;
    printf("%d",personas[0].edad);
    for(i=0; i<TAM; i++)
    {
        if(personas[i].edad>=edad)
        {
            strcpy(*mayor.nombre,personas[i].nombre);
            strcpy(*mayor.apellido1,personas[i].apellido1);
            *mayor.dni=personas[i].dni;
            strcpy(*mayor.sexo,personas[i].sexo);
            *mayor.edad=personas[i].edad;
        }

    }
}
Buenas, estoy a punto de terminar el ejercicio pero me falla la función persona_mayor que os marco en rojo. Lo demás funciona sin problemas. La idea es que pasado el array de estructura con personas, me almacene en el puntero mayor, lo datos de la persona con mayor edad. A ver si me podeis echar un cable, por favor. Gracias.

Estos son los errores que me muestra, pero no se como corregirlos:

C:\Users\Francisco\Desktop\Entrega3\tarea\main.c|| In function 'persona_mayor':|
C:\Users\Francisco\Desktop\Entrega3\tarea\main.c|1 16|warning: incompatible implicit declaration of built-in function 'strcpy' [enabled by default]|
C:\Users\Francisco\Desktop\Entrega3\tarea\main.c|1 16|error: request for member 'nombre' in something not a structure or union|
C:\Users\Francisco\Desktop\Entrega3\tarea\main.c|1 17|error: request for member 'apellido1' in something not a structure or union|
C:\Users\Francisco\Desktop\Entrega3\tarea\main.c|1 18|error: request for member 'dni' in something not a structure or union|
C:\Users\Francisco\Desktop\Entrega3\tarea\main.c|1 19|error: request for member 'sexo' in something not a structure or union|
C:\Users\Francisco\Desktop\Entrega3\tarea\main.c|1 19|warning: passing argument 2 of 'strcpy' makes pointer from integer without a cast [enabled by default]|
C:\Users\Francisco\Desktop\Entrega3\tarea\main.c|1 19|note: expected 'const char *' but argument is of type 'char'|
C:\Users\Francisco\Desktop\Entrega3\tarea\main.c|1 20|error: request for member 'edad' in something not a structure or union|
  #2 (permalink)  
Antiguo 15/12/2014, 09:09
Banshi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Error en una funcion

Nadie me puede echar un cable? Seguro que es una tontería lo que me pasa, pero me tiene loco.
  #3 (permalink)  
Antiguo 15/12/2014, 09:19
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Error en una funcion

Desde luego ya te adelanto que los errores que me salen a mí no se corresponden en nada a los que indicas. No se si es que no has puesto el mismo código, si lo has modificado por el camino...

En cualquier caso deberías aprender a leer y entender los mensajes de error del compilador.

Código C:
Ver original
  1. Persona mayor={"","",0,"",0};

Persona.nombre es char*, mientras que "" es const char*. Esa inicialización no es válida.

Además, los char (para Persona.sexo) se indican con comilas simples, no dobles.

Código C:
Ver original
  1. scanf("%s",&nombre);

nombre es un char*, el '&' está de más ya que la variable es un puntero.

Código C:
Ver original
  1. char cad[250];
  2. fgets(cad,255,f);

Si primero dices que "cad" va a ocupar 250 caracteres, y luego a fgets le dices que puede leer hasta 255... te puedes hacer una idea.

Código C:
Ver original
  1. token = strtok(cad, ",");

strtok está definido en string.h, te falta ese include.

Código C:
Ver original
  1. strcpy(p.nombre,token);

Lo mismo que en el caso anterior

Código C:
Ver original
  1. strcpy(*mayor.nombre,personas[i].nombre);

mayor.nombre es un puntero... ¿a qué viene ese asterisco? Este error se reproduce más veces. Te toca a ti localizarlos.

Un saludo.
  #4 (permalink)  
Antiguo 15/12/2014, 15:03
Banshi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Error en una funcion

Ya he corregido los fallos que comentas, para strtok no hace falta el include string.h, puesto que a mi me funciona sin el. De hecho funciona todo el programa a excepcion de la última función, porque he ido probandolo por partes. Sigo teniendo problemas en la última funcion y leer , leo los mensajes de error del compilador, pero no siempre los entiendo e intento buscar información, pero no siempre encuentro respuestas.

Asi está el código ahora mismo y los errores que me aparecen. Gracias por responder.

Código:
#include <stdio.h>
#include <stdlib.h>
#define TAM 50

typedef struct
{
    char nombre[30];
    char apellido1[30];
    int dni;
    char sexo;
    int edad;
} TPersona;

void cargar_txt(TPersona []);
void ver_persona(char [],TPersona []);
void persona_mayor(TPersona [],TPersona *);

int main()
{
    TPersona personas[TAM];
    TPersona mayor;
    cargar_txt(personas);
    char nombre[30];
    printf("La persona mayor de edad es:\n");
    persona_mayor(personas,&mayor);
    printf("\nVer datos de una persona\n");
    printf("Que persona quieres ver?\n");
    scanf("%s",nombre);
    ver_persona(nombre,personas);
    return 0;

}

void cargar_txt(TPersona personas[TAM])
{
    FILE *f;
    TPersona p;
    char *token;
    f=fopen("PERSONAS.txt","r");


    if(f==NULL)
    {
        printf("Error de apertura\n");
    }
    else
    {
        char cad[255];
        int cont=0,per=0;
        fgets(cad,255,f);
        while(!feof(f))
        {
            token = strtok(cad, ","); /*Separamos por espacios*/
            while (token != NULL)
            {
                switch(cont)
                {
                case 0:
                    strcpy(p.nombre,token);
                    break;
                case 1:
                    strcpy(p.apellido1,token);
                    break;
                case 2:
                    p.dni=atoi(token);
                    break;
                case 3:
                    p.sexo=token[0];
                    break;
                case 4:
                    p.edad=atoi(token);
                    break;
                }
                cont++;
                token = strtok(NULL,",");
            }
            personas[per]=p;
            cont=0;
            per++;
            fgets(cad,255,f);

        }
        fclose(f);
    }
}

void ver_persona(char nombre[30],TPersona personas[TAM])
{
    int i=0,enc=0;
    while(i<TAM && !enc)
    {
        if(strcmp(personas[i].nombre,nombre)==0)
        {

            printf("Nombre: %s\n",personas[i].nombre);
            printf("Apellido: %s\n",personas[i].apellido1);
            printf("DNI: %d\n",personas[i].dni);
            printf("Sexo: %c\n",personas[i].sexo);
            printf("Edad: %d\n",personas[i].edad);
            enc=1;

        }
        else
        {
            i++;
        }
    }
    if(enc==0)printf("%s no se encuentra en el fichero\n",nombre);
}

void persona_mayor(TPersona personas[TAM],TPersona *mayor)
{

    int i;
    int edad=personas[0].edad;
    printf("%d",personas[0].edad);
    for(i=0; i<TAM; i++)
    {
        if(personas[i].edad>=edad)
        {
            strcpy(mayor.nombre,personas[i].nombre);
            strcpy(mayor.apellido1,personas[i].apellido1);
            mayor.dni=personas[i].dni;
            strcpy(mayor.sexo,personas[i].sexo);
            mayor.edad=personas[i].edad;
        }

    }

} 
||=== Build: Debug in Entrega3 (compiler: GNU GCC Compiler) ===|
C:\Users\Francisco\Desktop\Tarea\Entrega3\main.c|| In function 'persona_mayor':|
C:\Users\Francisco\Desktop\Tarea\Entrega3\main.c|1 22|error: request for member 'nombre' in something not a structure or union|
C:\Users\Francisco\Desktop\Tarea\Entrega3\main.c|1 23|error: request for member 'apellido1' in something not a structure or union|
C:\Users\Francisco\Desktop\Tarea\Entrega3\main.c|1 24|error: request for member 'dni' in something not a structure or union|
C:\Users\Francisco\Desktop\Tarea\Entrega3\main.c|1 25|error: request for member 'sexo' in something not a structure or union|
C:\Users\Francisco\Desktop\Tarea\Entrega3\main.c|1 25|warning: passing argument 2 of 'strcpy' makes pointer from integer without a cast [enabled by default]|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7. 1\..\..\..\..\include\string.h|45|note: expected 'const char *' but argument is of type 'char'|
C:\Users\Francisco\Desktop\Tarea\Entrega3\main.c|1 26|error: request for member 'edad' in something not a structure or union|
||=== Build failed: 5 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|
  #5 (permalink)  
Antiguo 16/12/2014, 06:45
Banshi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Error en una funcion

Ya he resuelto mi problema he cambiado la función que me fallaba de esta forma:
Código:
void persona_mayor(Persona personas[TAM],Persona *mayor,int cantidad)
{

    int i;
    int edad=personas[0].edad;
    for(i=0; i<cantidad; i++)
    {
        if(personas[i].edad>=edad)
        {
            *mayor = personas[i];
            edad= personas[i].edad;
        }

    }

}

Etiquetas: char, funcion, int
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:44.