| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
Sn4k3
Registrado: 08 Dic 2006 Mensajes: 11 Ubicación: Frente mi PC xD
| Publicado: 08/04/2007 11:09 pm | | | Título: Segmentation fault (core dumped) |
| Bueno pues estoy leyendo un libro de C/C++ y me encontraba leyendo un poco sobre los comienzos de la libreria math.h , cuando de pronto comenze a escribir el codigo que pedia y lo compile en mi maquina ( Ubuntu 6.10 ) procedi a la compilacion ---> gcc fuente.c -o fuente -lm , el "-lm" por la libreria "math.h" despues de la compilacion me aparecio como su hubiera compilado mi programa bien , despues a la hora de ejecutar el programa "./fuente" me tiro lo siguente : Código:
| Código: | $ ./fuente Año Monto del deposito Segmentation fault (core dumped) |
El codigo es este --->
Código:
| Código: | #include <stdio.h> #include <stdlib.h> int main() { double monto; double principal = 1000.0; double tasa = .05; int anio;
printf("%4s%21s\n", "Año", "Monto del deposito");
for( anio= 1; anio <=10; anio++) {
monto = principal * pow( 1.0 + tasa, anio); printf("%4s%21.2f\n", anio, monto); } return EXIT_SUCCESS; }
|
Ahora mi pregunta es , alguien sabe porque sale ese "error" o no se que es , porfavor contestenme lo mas antes posible y de antemano gracias.
Saludos |
| | Volver arriba | |  | _Leo_
Registrado: 20 Oct 2005 Mensajes: 399 Ubicación: Buenos Aires, Argentina
| Publicado: 09/04/2007 5:15 am | | | Título: |
| | Código: | #include <stdio.h> #include <stdlib.h>
int main(int argc, char ** argv) { double monto; double principal = 1000.0; double tasa = .05; int anio;
/* printf("%4s%21s\n", "Año", "Monto del deposito");*/ printf("Año Monto del deposito");
for (anio= 1; anio <=10; anio++) {
monto = principal * pow( 1.0 + tasa, anio); printf("%4d %6.2f\n", anio, monto); } return 0; }
|
En el segundo printf() estabas enviando enteros y decimales y utilizando %s en la cadena de formato. %s se utiliza sólo para cadenas. Por otra parte el primer printf() no tiene sentido ya que son dos cadenas fijas. _________________ _Leo_ Daphne - administrador de tareas Cine, tecnología, sociedad |
| | Volver arriba | |  | Sn4k3
Registrado: 08 Dic 2006 Mensajes: 11 Ubicación: Frente mi PC xD
| Publicado: 09/04/2007 2:21 pm | | | Título: |
| Muchas gracias _Leo_ ya pude resolver el problema, pero simplemente me gustaria saber exactamente porque salia ese error , el codigo que te puse aqui lo copie del libro exactamente igual pero no sabia porque me salia ese error .
PD: Muchas gracias  |
| | Volver arriba | |  | | _Leo_
Registrado: 20 Oct 2005 Mensajes: 399 Ubicación: Buenos Aires, Argentina
| Publicado: 09/04/2007 5:25 pm | | | Título: |
| Si el código estaba transcripto sin cambios, entonces el libro está mal.
La función printf() recibe un primer argumento que le indica cuántos y de qué tipos son los argumentos restantes. Si la cadena de formato tiene tres signos %, quiere decir que recibirá tres argumentos y los imprimirá en orden en el lugar de cada %. Adicionalmente la letra que sigue al signo de porcentaje indica el tipo de valor. Por ejemplo d: entero decimal, f: flotante (decimal), s: string (cadena) x: entero hexadecimal, etc.
Podés ver más información en esta página (en inglés)
En el programa que copiaste estás indicando a printf() que recibirá una cadena de 4 caracteres de ancho y un flotante de 21 dígitos y dos decimales. Luego se le envía anio que es un entero. A partir de ese momento printf() comienza a leer la memoria en anio buscando un cero que indique el fin de cadena. Como no es una cadena y la posibilidad de que haya un cero existe pero no es necesariamente así: el programa continúa leyendo memoria hasta que sale del área que le dio el sistema operativo al proceso. En ese momento el sistema operativo decide terminar la aplicación diciendo que intentó leer memoria que no le pertenecía. _________________ _Leo_ Daphne - administrador de tareas Cine, tecnología, sociedad |
| | Volver arriba | |  | Sn4k3
Registrado: 08 Dic 2006 Mensajes: 11 Ubicación: Frente mi PC xD
| Publicado: 09/04/2007 6:33 pm | | | Título: |
| Muchas gracias por la explicacion, y gracias por tu tiempo.
PD: Seguire leyendo el libro pero si se presentan problemas cambiare a otro.
Saludos |
| | Volver arriba | |  | Taras_Bulba
Registrado: 01 Jun 2008 Mensajes: 1
| Publicado: 01/06/2008 11:47 am | | | Título: |
| He llegado aquí buscando información sobre este problema y quizá (y estaría muy agradecido si pudiérais) ayudarme. Adjunto el codigo que da el fallo a ver si véis qué pasa. Gracias por adelantado.
PD: no veo la manera de adjuntar un archivo de texto, asi que "pego" todo, aunque quede algo peor.
#include <stdio.h> #include <stdlib.h> #include <time.h>
int hilo_hijo (int nom_fich, int fich_hilo, int numeros, int indice, int num_hilos, int resto) { // variables para el control de bucles. int i = 0; int j = 0; char nombre_fich[30]; int ultimo;
// almacenara el numero aleatorio ofrecido por la funcion correspondiente. int aleatorio; char aleatorio2[10];
// para el manejo de ficheros. FILE * fichero;
ultimo = indice +1;
if (ultimo == num_hilos) fich_hilo=fich_hilo+resto;
for (i=0; i<fich_hilo; i++) { time_t rawtime; time ( &rawtime );
//convertimos a char el nombre del fichero //sprintf(nombre_fich,"file_%s_%d",ctime (&rawtime),nom_fich); esto seria para guardarlo con la fecha y la hora sprintf(nombre_fich,"file_%d",nom_fich); nom_fich+=1; if (ultimo==num_hilos) { nom_fich-=1; //sprintf(nombre_fich,"file_%s_%d",ctime (&rawtime),nom_fich); sprintf(nombre_fich,"file_%d",nom_fich); }
// abrimos el fichero para escritura. fichero = fopen(nombre_fich,"w"); // chequeamos que se haya abierto el fichero correctamente. if (fichero == NULL) printf("Error: el fichero %d no se puede abrir \n ",nom_fich-1); else { printf ("Soy el hilo hijo %d con PID %d y PPID %d\n",indice, getpid(), getppid()); printf ("El fichero %d se ha abierto correctamente \n",nom_fich -1); nom_fich+=1;
// aqui se introducen los numeros en cada uno de los ficheros. for(j=0; j< numeros; j++) { //cramos el numero aleatorio aleatorio= rand(); sprintf(aleatorio2,"%d",aleatorio); fputs(aleatorio2,fichero);//lo insertamos en el fichero fputc('\n',fichero);
} fclose(fichero); } } printf ("Soy el hilo hijo %d con PID %d y PPID %d y he terminado correctamente \n \n",indice, getpid(), getppid());
//printf ( "La fecha es: %s", ctime (&rawtime) ); return(0); }
int padre(int num_hilos, int pid_hilos[], int estado_hilo[]) { int indice; printf("Soy el padre con PID %d\n",getpid()); for (indice=0;indice<num_hilos;indice++) { // printf("esperando %d, %d ... ",indice, pid_hilos[indice]); waitpid(pid_hilos[indice], &estado_hilo[indice], 0); // printf("OK \n"); } printf("Soy el padre con PID %d y he terminado correctamente \n \n",getpid()); return(0); }
int hilo_suma (int nom_fich, int fich_hilo, int numeros, int indice, int num_hilos, int resto) { // variables para el control de bucles. int i = 0; int j = 0; char nombre_fich[30]; int ultimo; int numeros_totales=0; int numeros_totales2=0; char caracter;
// almacenara el numero aleatorio ofrecido por la funcion correspondiente. char valor_suma[10];
// para el manejo de ficheros. FILE * fichero; //FILE * fichero2;
ultimo = indice +1;
if (ultimo == num_hilos) fich_hilo=fich_hilo+resto;
for (i=0; i<fich_hilo; i++) { //convertimos a char el nombre del fichero sprintf(nombre_fich,"file_%d",nom_fich);
if (ultimo==num_hilos) sprintf(nombre_fich,"file_%d",nom_fich);
// abrimos el fichero para escritura. fichero = fopen(nombre_fich,"r"); // chequeamos que se haya abierto el fichero correctamente. if (fichero == NULL) printf("Error: el fichero %d no se puede abrir \n ",nom_fich-1); else { printf ("Soy el hilo hijo %d con PID %d y PPID %d\n",indice, getpid(), getppid());
while((caracter=getc(fichero))!=EOF) { if(caracter != '\n') { numeros_totales+= atoi(&caracter); numeros_totales2+=numeros_totales; } } fclose(fichero);
sprintf(nombre_fich,"suma_%d",nom_fich); fichero = fopen(nombre_fich,"w"); sprintf(valor_suma,"%d",numeros_totales); fputs(valor_suma,fichero);//lo insertamos en el fichero fclose(fichero); } nom_fich+=1; } printf ("Soy el hilo hijo %d con PID %d y PPID %d y he terminado correctamente \n \n",indice, getpid(), getppid());
return(numeros_totales2); }
int main(int argc, char *argv[]) {
// esta linea no se que significa. char *args[] = { "/bin/ls", NULL }; FILE * fichero;
int max_fich; int num_hilos; int n_numeros; int sum_numeros=0; int sum_numeros2=0;
// para almacenar el nombre de los ficheros (1,2,3,...,n). Tambien sirve para saber cuantos llevamos creados. int nombre_fich = 1; char nom_fich_total[] = "suma_total"; char suma[10];
// almacena el numero de ficheros que tiene que crear cada hilo. int ficheros_por_hilo;
// almacena el resto de ficheros que quedan sueltos a crearse al final. int ficheros_resto = 0;
// almacena el valor total de la suma de los numeros de todos los ficheros. int num_total;
// matriz para almacenar el pid de los hilos de ejecucion. int pid_hilos[num_hilos];
// almacenamos el pid del proceso padre. int pid_padre;
// sirve como contador para ejecutar tantos hilos de ejucion como sea necesario. int indice = 0;
// almacenamos el estado de los hilos de ejecucion. int estado_hilo[num_hilos];
int pid1; int pid2; char respuesta;
// chequeamos que se hayan introducido todos los parametros correctamente. if (argc != 4) { system("clear"); printf("POR FAVOR INTRODUZCA LOS PARAMETROS PARA EJECUTAR EL PROGRAMA CORRECTAMENTE\n"); printf("\n NUMERO DE FICHEROS = "); scanf("%d", &max_fich); printf("\n NUMEROS HILOS DE EJECUCIONN = "); scanf("%d", &num_hilos); printf("\n NUMERO DE NUMEROS POR FICHERO = "); scanf("%d", &n_numeros); } else { // almacenamos el numero de ficheros a crear. max_fich = atoi(argv[1]);
// almacenamos el numero de hilos necesarios para crear los ficheros. num_hilos = atoi(argv[2]);
// almacenamos el numero de numeros que hay que introducir en cada fichero. n_numeros= atoi(argv[3]);
}
//calculamos el numero de ficheros por hilo y el resto si es distinto de cero //lo almacenamos (tambien son ficheros a crear) ficheros_por_hilo= max_fich/num_hilos; ficheros_resto = max_fich%num_hilos;
//hacemos el while tantas veces como hilos haya que crear.indice controlara las repeticiones. while(indice<num_hilos) { //el fork crea un hijo del padre, se ejecutara ese hijo y muere en la siguiente interaccion del while if ( (pid_hilos[indice]=fork()) == 0 ) { hilo_hijo(nombre_fich,ficheros_por_hilo,n_numeros, indice,num_hilos, ficheros_resto); indice=num_hilos; } else // este else lo hace el padre tantas veces como hijos haya que crear. { nombre_fich+=ficheros_por_hilo; if (indice==(num_hilos-1)) padre(num_hilos, pid_hilos, estado_hilo); } indice++; }
printf ("\n \n ¿DESEA REALIZAR LA SUMA DE LOS FICHEROS CREADOS? escriba 's' o 'n' \n"); scanf("%s", &respuesta);
if (respuesta == 's') { indice = 0; nombre_fich=1; while(indice<num_hilos) { //el fork crea un hijo del padre, se ejecutara ese hijo y muere en la siguiente interaccion del while if ( (pid_hilos[indice]=fork()) == 0 ) { sum_numeros=hilo_suma(nombre_fich,ficheros_por_hilo,n_numeros, indice,num_hilos, ficheros_resto); indice=num_hilos; sum_numeros2+=sum_numeros; } else // este else lo hace el padre tantas veces como hijos haya que crear. { nombre_fich+=ficheros_por_hilo; if (indice==(num_hilos-1)) padre(num_hilos, pid_hilos, estado_hilo); } indice++; } //creamos el fichero con la suma total de todos los ficheros. fichero = fopen(nom_fich_total,"w"); sprintf(suma,"%d",sum_numeros2); fputs(suma,fichero);//lo insertamos en el fichero fclose(fichero); } return(0);
} |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |