Error en C, muy simple.

bornex

Hola gente, tengo un error en una función y no se porque me salta... Decir tengo que programo en C, desde un Ubuntu 10.04.4 LTS.

El fallo que me da gcc es el siguiente:

Programa.c:3: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘Funcion1’

El fallo va en la 3 línea del código en una función de tipo bool:

bool Funcion1(int valor){
	       bool loes = false;
	       if(valor%4 == 0)
		       loes = true;
	       return loes;
        }

Es sencillo, pero no logro ver donde esta el fallo, por las mañanas estoy dormido... :palm: . Espero que alguien me pueda echar una mano.

Saludos.

MartiONE

Quiza un parentesis en el if?

Algo asi como if((valor%4) ==0)

1 respuesta
B

no querrias poner if((valor/4) == 0) ... el % es para otra cosa, no es un operador aritmetico.

3 respuestas
Athalberth

#3 El % sí es un operador en la mayoría de lenguajes. Calcula el módulo, es decir, el resto de la división.
Y sí, el problema está tal vez en los paréntesis.

EDITO: #1 ¿Has hecho un typedef del bool o usas stdbool? No viene el tipo boolean o bool por defecto en C.

EDITO 2: #9 Si el if es de una línea puede ir sin llaves. Lo mismo con bucles ;) Mi consejo es ponerlos siempre. No es la primera vez que he querido incluir en un if sin llaves alguna línea más, no me acordé de ponerlas y petaba.

2 2 respuestas
bornex

Quiero ver si un año es bisiesto, lo que hago es el módulo y si me devuelve de resto 0, es que la división es entera, entonces es Bisiesto. Voy a ver con lo de los paréntesis. Gracias ;)

bloodhound

#3 ¿No te devuelve el resto de la división?

Supongo que lo que está tratando es de ver si es divisible por 4 o así.

B

#4 sip se me habia olvidado, tengo c bastante abandonado xD.

bornex

#2 y #3 lo del paréntesis no me da resultado, me sigue dando el mismo error. Pongo el código entero por si el error estuviera en otro lugar.

#include <stdio.h>

bool esBisiesto(int ano){
	bool loes = false;
	if((ano%4) == 0)
		loes = true;
	return loes;
}

void main(){

int mes, anio, dias;

printf("Introduzca el mes: ");
scanf("%d", &mes);

if(mes >= 1 && mes <= 12){
	printf("Introduzca el anio: ");
	scanf("%d", &anio);
	if(anio >= 1){
		if(esBisiesto(anio) && mes == 2)
			dias = 29;
		if(mes == 1 || mes == 3 || mes == 5 || mes == 7 || mes == 8 || mes == 10 || mes == 12)
			dias = 31;
		else if(mes == 2)
			dias = 28;
		else
			dias = 30;
	}
	else
		printf("Error, no hay anios negativos\n");
}
else
	printf("Error, Un año solo tiene 12 meses\n");

printf("El mes %d del anio %d tiene %d dias.\n", mes, anio, dias);
}
2 respuestas
B

#8 las llaves despues del if dentro de la funcion esBisiesto {}

2 respuestas
MTX_Anubis

Lo puedes resumir en

bool esBisiesto(int ano){
        return ano%4 == 0;
}
2 1 respuesta
MartiONE

#8 Prueba a parentizar todas los and y or, a ver si ese es el problema.

#include <stdio.h>

bool esBisiesto(int ano){
        return ((ano%4) == 0);
}

void main(){

    int mes, anio, dias;

    printf("Introduzca el mes: ");
    scanf("%d", &mes);
    
    if((mes >= 1) && (mes <= 12)){
            printf("Introduzca el anio: ");
            scanf("%d", &anio);
            if(anio >= 1){
                    if((esBisiesto(anio)) && (mes == 2))
                            dias = 29;
                    if((mes == 1) || (mes == 3) || (mes == 5) || (mes == 7) || (mes == 8) || (mes == 10) || (mes == 12))
                            dias = 31;
                    else if(mes == 2)
                            dias = 28;
                    else
                            dias = 30;
            }
            else
                    printf("Error, no hay anios negativos\n");
    }
    else
            printf("Error, Un año solo tiene 12 meses\n");

    printf("El mes %d del anio %d tiene %d dias.\n", mes, anio, dias);
}
1 respuesta
bornex

#9, #10 y #11 he hecho lo que me habéis dicho y me sigue dando el mismo fallo :S

C

#1 Qué manía con no meter entre corchetes lo que hay después de un if. Esa práctica sólo lleva a errores y bugs.

Aunque no sea ese el error ahora mismo, acostúmbrate siempre a hacerlo.

1 respuesta
bornex

#13 Me han enseñado que cuando un if, tiene más de 1 sentencia se le pone, mientras no. Lo siento pero hasta ahora no me ha ido mal así, y la manía no se me quita ni a hostias. De todas maneras el error no está ahí y no se cual puede ser... :(

1 respuesta
karanka

yo solo veo el error de los cochetes en el if, que errror te da el compilador?

1 respuesta
bornex

#15

DiaMes.c:3: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘esBisiesto’
C

#14 Hazme caso, trabajo en una empresa de software y pasamos al código cada día herramientas como "Checkstyle", "PMD" y "FindBugs" que restrean posibles bugs, errores comunes de codificación y malas prácticas... y siempre, siempre salta ese error y se les obliga a los programadores que lo cambien.

Ya sé que ahora no viene al caso porque no es ese el error.. pero acostúmbrate.

1 respuesta
bornex

#17 Vale, la verdad que mi profesor de ahora nos obliga a ponerlos y no lo hago... Voy a coger la costumbre, y gracias por el consejo, seguro que tú sabes más que yo :).

/Offtopic

¿Nadie da con el solución? ¿Que leches puede ser?

1 respuesta
karanka

#18 el error es de sintaxis, o un punto y como o un corchete, que linea de programa te da el error donde sale el primer esbisiesto? cuenta los corchetes tienen que ser pares por cojones

1 respuesta
r2d2rigo

#1 C por defecto no tiene tipo de dato bool. Usa en su lugar un int o incluye stdbool.h.

3 4 respuestas
bornex

#19 El error me lo da en la línea 3. Pero el esBisiesto() solo lo uso en la línea 18 en el if.

#20 Gracias tío. Ese es el error. :) +1

Lecherito

#20 Joder estaba viendo el código y digo bool? no me suena xD

Lo que siempre hacía era:

#define TRUE 1
#define FALSE 0

int x = TRUE;
1 respuesta
bornex

#22 Jajaja, estoy acostumbrado a C++ y Java, y me he metido a practicar C y tengo de esos fallos miles...

B

#20 qué a gusto se tiene que quedar uno llegando y besando el santo de esta manera xD.

2 respuestas
dr_Rouman

Ya que el error sintáctico está resuelto, uno semántico:

Un año no es bisiesto si es divisible por 4, es un poco más complejo xD Aunque bueno depende de cómo lo defina los requisitos :P

Un año es bisiesto si es divisible entre 4, a menos que sea divisible entre 100. Sin embargo, si un año es divisible entre 100 y además es divisible entre 400, también resulta bisiesto. Obviamente, esto elimina los años finiseculares (últimos de cada siglo, que ha de terminar en 00) divisibles sólo entre 4 y entre 100.

http://es.wikipedia.org/wiki/A%C3%B1o_bisiesto

1 respuesta
xMarston

Y mira que te lo decía eh, que before el nombre de la función había un problema. Pero bueno, viniendo de lenguajes que si incorporan el tipo de dato bool es normal.

bornex

#25 jajaja, lo se, pero no tengo que entregar nada ni nah, quería hacerlo rápido en tengo unas semanas para coger soltura con C y estoy practicando nada más ;), de todas formas, gracias por la aclaración.

r2d2rigo

#24 pues ojo que ha sido casi pura potra, que empece a leerme el Stroustrup la semana pasada y lo tenia fresco, que si no...

1 respuesta
Lecherito

#28 Algún libro bueno de C?

1 respuesta
Zerokkk

¿Soy el único que está más acostumbrado a usar un int para operaciones condicionales en lugar de boolean? Me es bastante más cómodo, al menos en Java xD.

1 respuesta