Título: error estructura al compilar Publicado por: indict en 2 Julio 2013, 01:51 am Hola, he echo una ejercicio de estructuras que consiste en lo siguiente:
le introduces el nombre, s si la competición es puntuable n en caso que no lo sea y los puntos correspondientes que ha generado dicha competición. Quiero generar una lista que me muestre el nombre, el total de pruebas realizadas, el total de pruebas puntuables (que será la suma de pruebas de tipo "s") y el total de puntos. Lógicamente podré introducir varias veces un mismo usuario y se irán acumulando los puntos y el número de competiciones. He diseñado un programa para ello, pero me marca error al final de escribir los usuarios. Código
Gracias por la ayuda :) Título: Re: error estructura al compilar Publicado por: ivancea96 en 2 Julio 2013, 02:18 am Mm estuve echandole un vistazo, y vi que falla aquí:
Código
Aparentemente, a base de pauses, vi que ahi da el error. No me paré más, porque bueno, es bastante lioso todos los vectores. Un par de cosas que vi, que podrías revisar: Código
Código Esos 2 vectores se llaman igual, "v". No se si eso tendrá que ver. Siento no ser de más ayuda. Si encuentras por ahí algún error, pues bien, sinó, siento estorbar xd EDITO: En el título pones error al compilar. Yo lo compilé con Code::Blocks, y me dió error en tiempo de ejecución. Me compiló con varios warnings, nada más. Te pongo los warnings, por si te interesan: Código: In function 'int donde_esta(std::string, std::vector<ranking>&)':| Cabe destacar el Warning que dice que la función "int donde_esta(std::string, std::vector<ranking>&)", que si el "if" no se cumple, no retorna ningún valor. No se como lo tienes tú pensado, posiblemente no tenga nada que ver ese warning, pero bueno. Sugiero xD Título: Re: error estructura al compilar Publicado por: amchacon en 2 Julio 2013, 02:42 am Código Estás accediendo a posiciones del vector v... Pero el vector v está vacío. ¿Quizás querías decir p? Título: Re: error estructura al compilar Publicado por: eferion en 2 Julio 2013, 09:59 am Primero me voy a centrar en el estilo de programación:
1. Las clases mejor pasarlas como referencia. Código
Este tipo de definiciones, por defecto, intenta evitarlas... estás pasando string por valor en vez de por referencia, esto implica duplicar la cadena en memoria cada vez que llamas a la función y el rendimiento se puede resentir y muchísimo. Es mejor pasar una referencia constante, así: Código
2. Separa el código con espacios y tabula correctamente Código
Queda algo más claro que Código
Y la claridad es algo que los que te ayudan agradecen, ya que tienden a dejarse menos la vista para comprender tu código ;) 3. Evita líneas absurdas Como suena, esto Código
Se puede simplificar tranquilamente y quedar así: Código
Ya que X + 0 = X... nos podemos ahorrar la comprobación y la suma... porque si no, ya puestos, ¿que pasa cuando tipo_competicion no es ni 's' ni 'n'? Y esto aún se podría simplificar un poco más, tal que Código
o si prefieres ganar un poco más de rendimiento: Código
Los preincrementos pueden llegar a ser bastante más eficientes que los postincrementos. 4. Los iteradores son tus amigos un bucle for te sirve perfectamente para recorrer un array... sin embargo manejar ese array con índices te va a obligar a escribir bastante más texto... con el consecuente incremento de probabilidades de error. Menos texto, si es con cabeza, suele significar muchas veces código más legible y fácil de mantener. Además la mayoría de funciones de la stl utilizan los iteradores para manipular los vectores, por lo que aprener a manejarlos te va a permitir usar la stl en muchísimas situaciones. Código
En vez de Código
5. Una función, un return. Cuando aprendas a depurar, te darás cuenta que tener un solo return en una función te facilita mucho la vida. Con un solo breakpoint podrás controlar la salida de la función para saber si es correcta o no. Sin embargo si tienes 20 returns repartidos por la función la tarea se empieza a complicar. Hay a gente a la que le gusta llenar las funciones de returns... yo solo lo hago si la función con returns queda muchísimo más sencilla y clara que sin ellos. En el caso de tu función y aplicando esta norma quedaría así: Código
6. Las clases también son tus amigas En vez de estructuras, prueba a usar clases y aprovecha sus características. Las clases y las estructuras en c++ son iguales salvo porque, por defecto, las clases tienen sus miembros privados mientras que en las estructuras son públicos. En cualquier caso, por convención, es más natural usar clases en el código normal de c++ y dejar las estructuras para intercambio de datos vía sockets por ejemplo. Además, una característica imprescindible de las clases y estructuras en c++ son los constructores, que te permiten inicializar las clases para que tengan valores válidos al crearlas. Esto te evita tener que inicializarlas tu a mano cada vez que instancias una clase. Si tu pones: Código
entonces: Código
También sería interesante que las variables fuesen privadas y creases funciones para acceder y modificar sus valores, pero tampoco me voy a poner a redactar aquí un libro de c++ :D 7. Una función, una tarea Actualmente, la función donde_esta hace demasiadas cosas. Por un lado busca un elemento en el vector y, si no se encuentra, intenta añadirlo. Bueno, en primer lugar la función está mal hecha porque no añade nunca el elemento en el vector y, aunque lo hiciese, no devuelve la posición de dicho elemento, estos son los errores que tienes actualmente en el código. Pero hablando de la función en si, una función que se llama donde_esta, debería centrarse únicamente en localizar un elemento y devolver su posición. Si el elemento no se encuentra debería devolver un índice no válido para poder identificar el error. Si luego quieres añadir un nuevo elemento y que te de su posición prueba a crear una función nueva que sea nuevo_elemento, por ejemplo. El que una función haga más cosas de las que debe te genera el problema de que mantener esa función en el futuro va a ser complicado, ya que ahora tienes muy reciente cómo funciona y que hace... pero dentro de 6 meses la memoria no será tan buena y tener una función que se llama, por ejemplo, despertador, y que aparte de sonar la alarma se encarga de preparar el desayuno, levantar las persianas, hacer la cama, encender la caldera, ... complicado de entender. Dicho esto, una propuesta quizás sería: ( voy a aplicar todos los consejos que te he indicado ) Código
Título: Re: error estructura al compilar Publicado por: indict en 2 Julio 2013, 18:39 pm Gracias por este amplio tutorial y por la explicación de todas las pautas que debo formalizar.
Ahora iré asimilando toda esta nueva información. Un saludo :D |