Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - eferion

#551
Cita de: nolasco281 en 15 Abril 2014, 16:50 PM
Hola

veo que mencionas depuradores quisiera saber a que se refiere y si me puedes dar algun ejemplo, ya que tambien lo he leido en otras partes pero pensaba que esto lo realizaba el IDE al mometon de compilar el programa.

Saludos.

Un depurador es un programa que, dado un programa compilado en modo debug y su correspondiente código fuente es capaz de presentar al usuario una interfaz que le permite seguir la traza de ejecución del código.

Los IDEs no son más que "fachadas" con un catálogo de utilidades que facilita el proceso de programación... pero lo dicho, no son más que fachadas. Al igual que un IDE se vale de un compilador independiente para compilar los programas, para depurar se vale de un depurador.

¿Se puede depurar una aplicación que no está compilada en modo debug? SI, solo que debido a las optimizaciones que hace el compilador y a la inexistencia de información de depuración, tienes que bajar forzosamente a nivel ensamblador... esto se usa, por ejemplo, en ingeniería inversa.

Depuradores los hay a patadas... cada uno con sus características y sus limitaciones. Puedes encontrar mucha información al respecto navegando por internet.

#552
Convierte el número a cadena. Después puedes diseñar una función recursiva en la que, en base al número de pasos, sepa cuántos dígitos debe comparar y si estos han de ser pares o impares.
#553
Para gestionar cadenas en C has de tener en cuenta que éstas han de terminar con el carácter '\0'. Es decir, "cadena" necesita de, al menos, un array de 7 caracteres ( 6 por cada letra de la palabra + 1 para el caracter nulo ).

Dicho esto, las cadenas "dias", "mess" y "age" no cumplen los requisitos.

Además, la concatenación la puedes simplificar bastante:

sprintf( destination, "%s-%s-%s", dias, mess, age );

El código de arriba es equivalente a:


strcpy(destination, dias);
strcat(destination, blank);
strcat(destination, mess);
strcat(destination, blank);
strcat(destination, age);


Como nota informativa, destination ha de tener una longitud mínima de 2 (dias) + 2 (mess) + 4 (age) + 2 (los guiones) + 1 (nulo) = 11 caracteres.


#554
Cita de: patilanz en 15 Abril 2014, 11:05 AM
Esto funciona como si tiene append asignado pero sin haberle puesto permisos o modos para escribir.

Yo no se hasta que punto ese código supone una solución portable...

Con esto quiero decir... es posible que con un compilador diferente ( usando el mismo SO ) el resultado final sea distinto.
#555

Cita de: erickgracia en 15 Abril 2014, 00:19 AM
El problema es que al ejecutar el programa entero y entra en la funcion de eliminarLista();  se detiene el programa despues de pedir el valor del entero a eliminar (o tal vez esta teniendo un loop el ciclo, la verdad no estoy seguro)

Saber lo que está pasando es tan sencillo como usar un depurador... que no te den miedo... te vas a hartar a usarlos si en algún momento te vas a dedicar a programar. Es una buena idea familiarizarse con su uso.

Para eliminar un elemento de una lista enlazada únicamente necesitas dos punteros... "anterior" y "actual":

En tu caso, el problema es que al eliminar un nodo cualquiera desplazas "anterior". Si tu eliminas un nodo no puedes actualizar "anterior". Puedes comprobarlo si dibujas el proceso sobre un papel.


void eliminarLista()
{
  nodoLista* anterior = NULL;
  nodoLista* actual = primero;

  int op;
  printf("Cual es el entero a eliminar?");
  scanf("%d", &op );

  while( actual != NULL )
  {
    if( actual->llave == op )
    {
      // Si eliminamos el primer elemento de la lista hay que operar de forma diferente
      if ( anterior == NULL )
        primero = actual->sig;
      else
        anterior->sig = actual->sig;

      free( actual );
      actual = anterior->sig;
      break; // Este break solo tiene sentido si la lista no admite duplicados
    }
    else
    {
      anterior = actual;
      actual = actual->sig;
    }
  }
}


En tu caso, "actual" y "recorre" apuntan al mismo sitio... no tiene sentido porque te obliga a tener sincronizados dos punteros sin ninguna necesidad.

Además:

Código (cpp) [Seleccionar]
if ( recorre != NULL){siguiente = recorre->sig;

esto para que?? la siguiente línea que se ejecuta es la condición del while, que dice que si recorre es NULL sales del while.

Además, no entiendo por qué razón guardas el puntero "ultimo". En una lista enlazada, el "sig" del último elemento apunta a NULL, luego saber si has llegado al final de la lista es tan sencillo como comprobar el "sig" de cada elemento.

También, mi consejo, es que tiendas a reutilizar código... no tiene sentido que tengas dos funciones para añadir elementos a la lista ( una para añadir al principio y otra para añadir al final ). Tiene más sentido que haya una función única y que sea ésta la que sepa añadir un elemento en cualquier posición... así cuando uses tu librería no tendrás que preocuparte por la posición concreta del elemento a insertar.

También te recomiendo no usar variables globales. Es mejor pasar estas variables como argumentos de las funciones.

Un saludo.
#556
Programación C/C++ / Re: Problema con strtol
15 Abril 2014, 09:01 AM
* A la hora de escribir código, usa las etiquetas GeSHi, gracias *

CitarIf the value read is out of the range of representable values by a long int, the function returns LONG_MAX or LONG_MIN (defined in <climits>), and errno is set to ERANGE.

Dicho en cristiano... si el valor a traducir está fuera de rango, la función devolverá LONG_MAX o LONG_MIN dependiendo de si te has pasado por arriba o por abajo.

En tu caso el valor devuelto es LONG_MAX.

El por qué es sencillo. Long son 32 bits, reservando uno para el signo. El bit de signo es el primero empezando por la izquierda. Si convertimos tu cifra a binario queda:


  C    0    0    0     0    0    4    0
1100 0000 0000 0000 00000 0000 1000 0000


El primer bit por la izquierda es uno, es decir, estaría representando a un número negativo... dado que el valor lo has dado en hexadecimal, representando un número positivo, no es posible realizar la conversión... convertir un número positivo en uno negativo no suele quedar bien.

Dado que el número en hexadecimal es positivo, la función te devuelve LONG_MAX.

Si cambias esa C por, como mucho, un 7, la función te devolverá el valor esperado.

#557
Cita de: patilanz en 14 Abril 2014, 19:03 PM
En la STL pone que en ofstream out siempre esta definido, por lo tanto supongo que ate también es out.

Ese valor por defecto lo vas a encontrar siempre y cuando no lo sobreescribas.

Si tu estableces una opción personalizada para abrir un archivo, esta nueva configuración va a sustituir a la que viene por defecto.

Cita de: patilanz en 14 Abril 2014, 19:03 PM
Antes me dijiste que out es para escribir y in para leer pero entonces porque se produce esto:

Es sencillo. Para escritura, el flag que permite actualizar es ios::app ( "app" de "append" ). Cualquier intento de abrir un fichero para escritura sin la opción "app" provoca el borrado del contenido del fichero, ya que no has indicado que quieres conservar el contenido.

La última opción te mantiene el contenido del archivo porque lo has abierto en modo lectura... obviamente si quieres leer el contenido no queda bien que la librería te lo borre.
#558
Cita de: patilanz en 14 Abril 2014, 17:22 PM
Yo con la sintaxis casi nunca me confundo.

El problema es que ese "casi", en determinadas líneas, puede suponer un problema:

int valor = variable1+++ variable2;
int valor = variable1++ +variable2;
int valor = variable1+ ++variable2;
int valor = variable1 +++variable2;
int valor = variable1+++variable2;


los cinco códigos se parecen como gotas de agua... ponte tu a descubrir que el espacio lo has puesto en un sitio en vez de en otro... y claro, evaluar las variables en mitad de la línea no es trivial...

Efectivamente, sería más legible y menos propenso a errores sacar el --p fuera de esa expresión... no hay que ser tacaño a la hora de escribir líneas de código si la idea es mejorar la legibilidad y el mantenimiento futuro del código.

Cita de: patilanz en 14 Abril 2014, 17:22 PM
Pero ate si no indica si se lee o escribe debería de funcionar ya que lo utilizo con un ofstream para escribir.

El problema es que con ate no indicas si vas a leer o escribir... en este caso la función puede que haga uso del mecanismo por defecto ( que seguro que no sabes cual es ) o puede que directamente no permita realizar operaciones sobre ese recurso porque no tiene flags de entrada / salida definidos... para saber el comportamiento concreto toca mirar la documentación de la STL.
#559
ios::in indica que vas a abrir el archivo para leerlo
ios::out indica que vas a abrir el archivo para escribirlo
ios::ate únicamente posiciona el cursor al final del archivo... no indica si vas a leer o a escribir

Código (cpp) [Seleccionar]
file.seekp((100+sizeof(unsigned int))*--p);

Deberías querer un poco más tu código y evitar líneas de este estilo... te pueden dar bastantes problemas si confundes la sintaxis lo más mínimo... y depurar una línea así puede no ser trivial.

#560
Programación C/C++ / Re: vaciar una variable
14 Abril 2014, 15:25 PM
fflush está pensado para flujos de salida, no de entrada. Te recomiendo echar un vistazo a |Lo que no hay que hacer en C/C++. Nivel basico|

En cuanto al problema de repetir la tecla... habría que conocer el código que rodea las líneas que has puesto, ya que puesto así, tal cual, debería funcionar.

getch te devuelve un carácter recibido por la entrada estándar, eliminándolo de dicho buffer, por lo que no deberías obtener dos veces la misma entrada.