[C con Clase] problema separando funciones.

Salvador Pozo salvador en conclase.net
Lun Jul 4 14:15:44 CEST 2011


El pasado 2011-07-04 09:06:26, josep escribió:

Hola:
 
j> Hola; he cambiado de programa (en vez de dev ahora con codeblocks) y me pasa lo mismo: no separo bien las funciones.

Dev-C++ es un compilador que ya no tiene soporte, es un proyecto abandonado, y te recomiendo que uses Code::Blocks, o ZinjaI como IDE.
 
j> 1º por que al terminar de ejecutar una funcion pasa a la siguiente; por ejemplo llamo a buscar por nombre (buscaxnom) y pasa olímpicamente del propio codigo de la función y entonces ejecuta el codigo de la funcion "buscaxentrada" y lo mismo cuando llamo a "novaentrada"

Has de tener en cuenta cómo funcionan las sentencias "switch" en C++.

- Se evalúa la expresión del "switch" como un entero (los caracteres en C/C++ también son enteros).
- Se busca el "case" que coincide con la expresión evaluada.
- Se transfiere la ejecución a la sentencia posterior a ese "case".

Cada "case" es una etiqueta, y el compilador no genera código para ellas. Son sólo puntos de entrada para transferir (saltar) la ejecución, es decir, simples direcciones de memoria que se usan durante la fase de compilación y enlazado.

Esto quiere decir que una vez transferida la ejecución a la sentencia etiquetada, ésta continúa secuencialmente con las siguientes sentencias, independientemente de si están o no etiquetadas con otros "case".

----8<------
    switch (resposta)
    {
             case 'a': NovaEntrada();
             case 'b': BuscaxNom();
             /*case 'c': BuscaxCognom();
             case 'd': BuscaxAlies();
             case 'e': BuscaxAny();
             case 'f': BuscaxTelefon();*/
             case 'g': BuscaxEntrada();
    }
----8<------

En tu programa, si la expresión del switch se evalúa como 'b', se transfiere la ejecución a la llamada a BuscaxNom(), y continua con BuscaxAlies(), etc.

Por eso pasa lo que comentas en tu primera duda.

Para evitar eso, si quieres que sólo se ejecute el código entre dos "case", debes terminar cada fragmento con una sentencia "break", que transfiere la ejecución a la sentencia siguiente al "switch".

j> 2º por que en la linea 86, funcion novanentrada, si no pongo dos veces lo de cin.getline, salta directamente sin guardar nada al apellido (cognom en mi idioma). 

A mi no me pasa eso. Imagino que depende de si se ejecuta por primera vez o si se ejecuta después de otras funciones. Probablemente quede algo en el buffer del teclado si se ejecuta alguna otra función previamente.

Para vaciar ese buffer puedes usar cin.ingore():
http://c.conclase.net/curso/?cap=904f#APD_funcionescin

j> 3º cuando hago cin.getline(a,40) y pongo, por ejemplo "Paco"; a no vale "paco/0/0/0/0/0/0/0.... " si no que entre los espacios (/0) aparecen simbolos raros, esto es debido a que como no doy un valor inicial a a, y paco es corto, no llega a 40, aún tiene los bites sucios que habia en memoria antes de declarar a?

Las cadenas de caracteres terminan con un carácter nulo, todo lo que haya después es irrelevante, y por lo tanto, el compilador no se molesta en modificarlo.

Efectivamente, todo lo que hay más allá de quinto carácter (el nulo), mantiene su valor previo. En C++ decimos que contiene "basura". Tampoco debes preocuparte por eso, ya que las funciones para tratar cadenas y los streams para mostrarlas, también ignoran todo lo que haya después del nulo.


-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


Más información sobre la lista de distribución Cconclase