Azərbaycan dili Bahasa Indonesia Bosanski Català Čeština Dansk Deutsch Eesti English Español Français Galego Hrvatski Italiano Latviešu Lietuvių Magyar Malti Mакедонски Nederlands Norsk Polski Português Português BR Românã Slovenčina Srpski Suomi Svenska Tiếng Việt Türkçe Ελληνικά Български Русский Українська Հայերեն ქართული ენა 中文
Subpage under development, new version coming soon!

Subject: base de datos en C

2010-01-07 17:40:54
fprintf(stdout, ...);
¿Por qué no usas printf y te ahorras el stdout? Lo mismo con scanf y fscanf... :P

const char nombre1[]={'M','a','n','u','e','l'};
Las cadenas de texto tienen que tener el carácter \0 al final para indicar el final de la cadena. Además, es más cómodo definirlas así (creo que es así, que hace mucho que no programo en C :P), y de paso te ahorras ese \0:
const char nombre1[]="Manuel";

void MENU(int opcion)
{
opcion=0;
...

¿Para qué creas un parámetro si antes de leer su valor ya se lo estás cambiando? :P

(edited)
2010-01-08 09:06:18
Si, esa cagada del parámetro ya la he cambiado, por cierto terrion, mirate el post de informaticos el ultimo comentario que es mio, a ver si me lo puedes resolver... gracias
2010-01-08 16:17:50
No sé, no tengo ni idea. Busca el error en Google, que siempre hay gente a la que le ha pasado lo mismo y ya lo ha preguntado :P
2010-01-08 16:24:30
¿Se trata de un error o de un warning?. Yo diría que es lo segundo...

El código es válido con el estándar c99, pero no con el c89, puesto que este último no permite utilizar otra cosa que no sea una constante en inicializaciones inline de estructuras. Tú estás utilizando el resultado de una función para el campo "retención", y precisamente lo que te viene a decir el warning es eso: que en tiempo de compilación no puede procesar ese valor...

Teniendo en cuenta lo anterior, deduzco que estás compilando con c89 y no con c99, que es una versión más nueva del lenguaje, y que permite, entre otras más cosas, este tipo de inicializaciones.

Si quieres seguir con c89, me temo que vas a tener que hacer algo así para cada empleado (quitar el const y darle valor al campo retención después de la declaración):
tEmpleados empleado1={"Manuel", "Aranda Villa", "53565006F", 4501.89, 0.0, "Maximo Accionista"};
empleado1.Datos.Retencion=retencion(4501.89);
(edited)
2010-01-08 17:32:21
Ahh muchas gracias, voy a probarlo y te comento
2010-01-08 17:39:49
Como me has dicho tu, me va perfecto, ahora tengo otro error, que como tengo una estructura metida dentro de otra estructura, al ponerle valor a las 2 a la vez me dice: ISO C90 forbids mixed declaration and code
2010-01-08 17:50:56
Creo que no es un problema de las estructuras anidadas, sino que estás mezclando declaraciones y código... lo que tienes que hacer es poner todas las declaraciones juntas al principio de la función, y después modificar el campo retención de todos los empleados. Es decir:

Incorrecto
------------
templeados empleado1 = ...;
empleado1.Datos.Retencion = retencion(...);
templeados empleado2 = ...;
empleado2.Datos.Retencion = retencion(...);
templeados empleado3 = ...;
empleado3.Datos.Retencion = retencion(...);
...

Correcto
----------
templeados empleado1 = ...;
templeados empleado2 = ...;
templeados empleado3 = ...;
...
empleado1.Datos.Retencion = retencion(...);
empleado2.Datos.Retencion = retencion(...);
empleado3.Datos.Retencion = retencion(...);
...
2010-01-08 18:06:52
2010-01-08 18:47:34
Es lo que te comento en el mensaje anterior: no puedes mezclar declaraciones y código, sino que primero tienen que ir juntas todas las declaraciones y después el código...

Aparte de eso, puedes simplificar un poco la función base... algo así:

void base(tPersonal personal) {
int p;

tEmpleados empleado1 = {"Manuel", "Aranda Villa", "53565006F", 4501.89, 0.0, "Maximo Accionista"}
tEmpleados empleado2 = ...;
tEmpleados empleado3 = ...;
tEmpleados empleado4 = ...;
tEmpleados empleado5 = ...;

personal[0] = empleado1;
personal[1] = empleado2;
personal[2] = empleado3;
personal[3] = empleado4;
personal[4] = empleado5;

for (p = 0; p < 5; p++) {
personal[p].Datos.Retencion = retencion(personal[p].Datos.Sueldo);
}

}

* El 5 del for es el número de empleados que decidas crear en esta función, por lo que debes cambiarlo según proceda. Otra opción sería sustituirlo por una constante, que puedes reutilizar en todas las funciones que así lo requieran. De esa forma, sólo tendrías que cambiar el valor en la declaración de la constante, y no en cada una de las funciones donde se utilice (vamos, lo que viene siendo la principal ventaja del uso de constantes...).
(edited)
2010-01-09 13:46:03
Ok, ahora no me da errores, poniendolo como tu has puesto me da estos 2 warnings en todas las líneas:

---------- Capture Output ----------
> "C:\MinGW\bin\gcc.exe" -obase.exe -Wextra -Wall -pedantic -pedantic-errors -Wconversion -Wredundant-decls -Wunreachable-code -O -Wuninitialized -Wformat=2 base.c
base.c: In function `base':
base.c:187: warning: missing braces around initializer
base.c:187: warning: (near initialization for `empleado1.Datos')
base.c:188: warning: missing braces around initializer
base.c:188: warning: (near initialization for `empleado2.Datos')
base.c:189: warning: missing braces around initializer
base.c:189: warning: (near initialization for `empleado3.Datos')
base.c:190: warning: missing braces around initializer
base.c:190: warning: (near initialization for `empleado4.Datos')
base.c:191: warning: missing braces around initializer
base.c:191: warning: (near initialization for `empleado5.Datos')


y me puedes decir que signfica este warning? "base.c:266: warning: left-hand operand of comma expression has no effect"
2010-01-09 13:48:48
lo del ultimo warning de "left hand coma", esta en esta linea:

for (i=0,i
(edited)
2010-01-09 13:52:56
y para borrar la posicion de un array, esto valdria? personal[i].Nombre='\0';

Es uqe me da error...
2010-01-09 15:46:24
mmm... hazme una captura de pantalla de la función "base", o pégala directamente aquí, y así te respondo con más seguridad...

1. El primer warning, "missing braces around initializer", hace referencia a una falta de llaves en la inicialización de los empleados. Tendría que ver el código para poder responder con más precisión...

2. El segundo warning, "left-hand operand of comma expression has no effect", viene a decir que el operando de la izquierda de la coma no está siendo considerado. Por lo que me pones, parece un error de sintaxis, puesto que los elementos del bucle for se separan por punto y coma, no sólo por coma...

3. Los arrays tradicionales de C son estructuras que se definen con un tamaño máximo, para el que se reserva memoria en tiempo de compilación, que después ya no puede variar. Por lo tanto, lo que se dice literalmente "borrar una posición", no se puede, puesto que la memoria seguirá estando reservada. Otra cosa es que definas el array de forma dinámica, y que, con las funciones malloc y free, vayas aumentando/liberando la memoria según proceda... vamos, lo que viene siendo implementar una lista con arrays.

Con lo que propones, lo único que conseguirías es modificar el nombre de los empleados, pero éstos seguirían presentes en memoria...
(edited)
2010-01-10 23:13:50
tEmpleados empleado1={"Manuel","Aranda Villa","53565006F",4501.89,0.0,"Maximo Accionista"};
tEmpleados empleado2={"Alberto","Camacho Ruiz","53565559P",3845.34,0.0,"Director Jefe"};
tEmpleados empleado3={"Alberto","Cobo Soler","53519086Z",3029.95,0.0,"Vicepresidente"};
tEmpleados empleado4={"Roberto","Benito Romero","53501234B",3122.04,0.0,"Jefe de Prensa"};
tEmpleados empleado5={"Cristofer","Gonzalez Delgado","53565086K",2799.01,0.0,"Jefe de Seguridad"};

En estas cinco lineas me da 2 warnings en cada linea: Missing braces around initializer, y near initiliazation for empleado1.Datos (tanto empleado1 como empleado2, empleado3...)

-Lo del for es cierto, tenia coma en vez de punto y coma

-Y lo que quiero hacer con el array no es borrarlo de la memoria, sino, si un espacio del array que esta contenido en memoria le hemos metido unos datos, quiero borrar esos datos para que se quede vacío. Si se queda vacío es como si hubiera un '\0' dentro verdad??


Y ahora en la la linea de "int i;" me da un error de ISO C90 forbids mixed declaration and code, este es el codigo:

void listar(tPersonal personal)
{
reorganizar(personal);
int i;/*Va recorriendo las posiciones de los empleados que hay en la base de datos*/
double w;/*variable auxiliar para pasarle el valor del sueldo y poderlo meter dentro de la funcion retencion*/
i=0;
while (i
(edited)
2010-01-11 00:48:03
- Respecto a los warning de los empleados... en principio, parece todo correcto :S. Lo único que se me ocurre que podrías probar, es lo que te comentaba Terrion: poner llaves internas a la estructura "Datos". Es decir, algo así:

tEmpleados empleado1={"Manuel","Aranda Villa","53565006F",{4501.89,0.0,"Maximo Accionista"}};

Si aún así persisten los warning, pégame aquí TODO el código que tengas, puesto que podría ser algo derivado de más arriba (como por ejemplo, una llave mal cerrada en otro punto del programa...).

- En relación a lo del array... para "vaciar" la posición de un array, tienes que ir campo por campo de la estructura y darle el valor inicial. El problema es que dependiendo del tipo de dato (int, double, char[], etc) ese valor inicial no es el mismo. Además, normalmente es un valor "basura", como por ejemplo, en el caso del double, el máximo valor permitido para este tipo de dato. Por lo tanto, lo que podrías hacer es darle a las cadenas de texto la cadena vacía "" y a los números el 0. De esa forma, ya podrías saber cuando hay empleado o no...

- Por último, el warning de la función listar, es el de siempre. Estás mezclando declaraciones y código. La llamada a la función "reorganizar" debe ir después de la declaración de las variables "i" y "w".
(edited)
2010-01-11 11:07:44
http://www.enterupload.com/p73kv4628bwm/base.c.html

Ahi esta el algoritmo entero.

Ahora me dice que "error: incompatible types in assigment" en las lineas que pongo un punto

void borrar_empleado(tDNI cadena, tPersonal personal)
{
int i;/*Contiene la posicion del empleado a borrar*/
i=comprobardni(cadena, personal);
personal[i].Nombre=".";
personal[i].Apellido=".";
personal[i].DNI=".";
personal[i].Datos.Sueldo=0;
personal[i].Datos.Retencion=0;
personal[i].Datos.Puesto=".";
}