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

Programa en devc++ se detiene de pronto

Estas en el tema de Programa en devc++ se detiene de pronto en el foro de C/C++ en Foros del Web. Buenas tardes a todos!!! Soy nueva en el entorno de programación, estoy trabajando con devc++ 4.9.9.2 (anoto esto por que anterior descargue una version 5.2 ...
  #1 (permalink)  
Antiguo 07/09/2013, 17:52
 
Fecha de Ingreso: septiembre-2013
Mensajes: 2
Antigüedad: 10 años, 9 meses
Puntos: 0
Pregunta Programa en devc++ se detiene de pronto

Buenas tardes a todos!!!

Soy nueva en el entorno de programación, estoy trabajando con devc++ 4.9.9.2 (anoto esto por que anterior descargue una version 5.2 y no sirvio, no podia compliar ni el codigo "hola mundo"), sin embargo el codigo fuente que estoy trabajando envia un error y se detiene de pronto y no se porque, incluso ya "descarte" algunas de las opciones (las encerre entre /* */ para evitar que se ejecuten y descartar problemas), pero sigue igual, anexo el codigo, espero me puedan apoyar!!
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char nombre, apellidop, apellidom, sexo, soltero, casado, empresa, dome, puesto, ms, pcr, ppcr, des,F,M,com;
char cand;
int dia, mes, a_o;
int ec, contadore=0;
int unsigned telefono;
float sueldo;


main ()
{
char EMPLEO [3];
printf("DATOS PERSONALES\n\n");
printf("Ingrese nombre (s)\t");
scanf("%s",&nombre);
printf("Ingrese apellido paterno:\t");
scanf("%s",&apellidop);
printf("Ingrese apellido materno:\t");
scanf("%s",&apellidom);
printf("Especifique sexo (para femenino digite F o para masculino digite M):\t");
scanf("%s",&sexo);
printf("Ingrese fecha de nacimiento: \n");
printf("Dia (dd):\t");
scanf("%d",&dia);
printf("Mes (mm):\t");
scanf("%d",&mes);
printf("Año (aa):\t");
scanf("%d",&a_o);
printf("Especifique estado civil (para soltero digite 1, para casado digite 2):\t");
scanf("%d",&ec);

printf("DATOS LABORALES\n");
do
{
printf("\nEMPRESA %d\n",contadore+1);
contadore=contadore+1;
printf("Ingrese nombre de la empresa:\t");
scanf("%s",&empresa);
printf("Ingrese domicilio de la empresa:\t");
scanf("%s",&dome);
/*printf("Telefono de la empresa:\t");
scanf("%Id",telefono);*/
printf("Ingrese puesto ocupado:\t");
scanf("%s",&puesto);
printf("Ingrese sueldo devengado:\t");
scanf("%f",&sueldo);
printf("Ingrese motivo de salida:\t");
scanf("%s",&ms);
printf("CONFIRMACION DE EMPLEO 1\n\n");
printf("Ingrese nombre de la persona que otorga la referencia:\t");
scanf("%s",&pcr);
printf("Ingrese puesto de la persona que otorga la referencia:\t");
scanf("%s",&ppcr);
printf("Ingrese comentario:\t");
scanf("%s",&com);
}
while (contadore<=2);

printf("CONCLUSION\n\n");
printf("DESARROLLO DE LA ENTREVISTA\n\n");
printf("Ingrese comentario del comportamiento del candidato durante la entrevista:\n");
scanf("%s",des);
printf("%s",des);
printf("\nDATOS LABORALES \n");

printf("De la empresa %s, %s",empresa,com);
/*
printf (De su empleo en )
printf (nombre de la empresa contador 2)
printf (comentario contador 2)
printf (De )
printf (nombre de la empresa contador 3)
printf (comentario contador 3)*/
/*
if (sexo==M)
cand=/*"El Sr./0";*//*1;
/* (sexo==F)
switch (1,2)
{
case 1:
cand=/*"La Srita./0"*//*2;
/*eak;
case 2:
cand=/*"La Sra./0";*//*3;
/*eak;
default:
cand=/*"El (la) candidato (a)/0";*//*4;
/*}*/
printf ("%s,%s,declara,%d, de empleos",cand,nombre,contadore);
}




al compilar no me arroja errores, pero al ejecutar y llegar a la zona despues de "comentarios de la entrevista", se detiene de pronto, ademas en muchos campos como nombre de la empresa, domicilio, telefono, etc, si ingreso pocas letras me pasa al siguente campo (normal), pero si ingreso un texto largo se salta el siguiente campo y tampoco se por que lo hace.

Les agradezco muchisimo si me pueden apoyar!!!
  #2 (permalink)  
Antiguo 08/09/2013, 08:40
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 10 meses
Puntos: 83
Respuesta: Programa en devc++ se detiene de pronto

Por favor indenta el codigo o usa las etiquetas de formateo que provee el foro que para eso estan, tu post será mas amigable y mas gente tendrá ganas de ayudarte :)

No he ejecutado pero te comento algo que he visto por encima: las variables (char)M y (char)F no estan incializadas en ningun sitio, por el echo de estar declaradas como globales se inicializan a 0 por defecto, es decir que M == F lo que equivale a que las lineas que tienes comentadas "if(sexo == M)" no tienen sentido.

Otra cosa, los textos se guardan por caracteres: un char por caracter, es decir que si quieres dar soporte para un texto de x caracteres tienes que declarar un array de chars de x elementos (incluido en \0 de final de cadena):

Código C:
Ver original
  1. char nombre_empresa[256];
  2. memset(nombre_empresa, 0, sizeof(nombre_empresa));
  3. printf("Ingrese nombre empresa: ");
  4. scanf("%s", nombre_empresa);

La otra opcion ya que estas en c++ es usar el objeto string que te permite olvidar de si el texto cabrá o no cabrá en la variable (para las string tendras que usar el manejador de stream de entrada estandar cin).

Junto con esto has de tener en cuenta otra cosa: cada tipo de dato puede requerir un tamaño especifico, y cada tipo de variable puede albergar un determinado tamaño de datos; p.ej. un char puede guardar enteros entre -127 y 127 lo que te permite un espacio mas que suficiente para entrar los datos de 'sexo': el caracter 'M' equivale al ascii 77 que está dentro del rango [-127, 127]:

Código C:
Ver original
  1. char sexo;
  2. printf("Especifique sexo (para femenino digite F o para masculino digite M):\t");
  3. scanf("%c", &sexo); //supongamos que entro M
  4. printf("%c", sexo); //aqui me muestra M
  5. printf("%d", sexo); //y aqui 77

Compara el modificador del scanf de este ejemplo con el que tienes en tu codigo (%s para cadena de caracteres, %c para caracter simple).


"..al compilar no me arroja errores, pero al ejecutar y llegar a la zona despues de "comentarios de la entrevista", se detiene de pronto..."

El compilador no te arroja error porque la sintaxis es correcta pero el uso no (es lo que te comenté al principio): cuando intentas acceder a una posicion de memoria no accesible por tu aplicacion (memoria no reservada) se produce lo que se conoce como violacion de segmento. En tu caso se provoca en la funcion scanf. La funcion scanf espera que le envies un buffer suficientemente grande para escanear el dato pedido, en el caso de un texto guardará en el bufer proporcionado todos los caracteres entrados por teclado hasta que encuentre un salto de linea (\n, la tecla enter con la que el usuario indica que terminó de escribir el campo), si declaras una variable char (4 bytes, 1 caracter) y envias ese char como bufer para la funcion scanf y el usuario entra 'hola', la 'h' se guarda correctamente, la 'o' se intentará guardar como siguiente elemento de un supuesto array pero que en realidad está fuera de la memoria accesible con lo que provocas la violacion de segmento.

Aun otra cosa: la funcion de entrada 'main' se define de tipo entero y como tal debe retornar un entero (0 por defecto):

Código C:
Ver original
  1. int main() {
  2.     ...
  3.     return 0;
  4. }


Y una observacion: el bucle donde pides los datos laborales (linea 40) está machacando las variables (sobreescribe), con lo que no puedes darle ninguna utilidad. Si quieres guardar los datos en memoria de ejecucion de forma ordenada puedes usar estructuras: en tu codigo ejecutas el ciclo 3 veces ( while (contadore<=2) ) puedes declarar un array de 3 estructuras para separar los datos:

Código C:
Ver original
  1. struct DATOS {
  2.     char empresa[256];
  3.     char dome[256];
  4. };
  5.  
  6. struct DATOS datos[3];
  7. int ctd = 0;
  8.  
  9. do {
  10.     printf("Ingrese nombre de la empresa:\t");
  11.     scanf("%s", datos_empresa[ctd].empresa);
  12.     printf("Ingrese domicilio de la empresa:\t");
  13.     scanf("%s", datos_empresa[ctd].dome);
  14.     ctd++;
  15. } while(ctd <= 2);

Lo siguiente ya es guardarlo en un archivo.

Saludos
vosk
  #3 (permalink)  
Antiguo 09/09/2013, 15:20
 
Fecha de Ingreso: septiembre-2013
Mensajes: 2
Antigüedad: 10 años, 9 meses
Puntos: 0
Sonrisa Respuesta: Programa en devc++ se detiene de pronto

Muchisimas gracias por tus comentarios, los pondre en practica a la brevedad!!! En verdad, mil gracias!!!!

Etiquetas: detiene, int, programa, string
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 06:52.