Ver Mensaje Individual
  #5 (permalink)  
Antiguo 25/06/2015, 00:20
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Convertir caracter a entero

Cita:
Iniciado por tabam Ver Mensaje
Pero no entiendo porque al enviarle el numero 100, el programa me muestra 99 y asi con algunos números, después lo demás aparentemente funciona bien.
Debe ser algún problema de tu compilador. Dev-C++ es un IDE desfasado, sin mantenimiento desde hace años y con un compilador antiguo.

Es importante tener herramientas que se mantengan actualizadas para evitar errores tontos. En tu caso podrías probar a usar code::blocks. Es un IDE bastante más completo que Dev y además tiene una comunidad activa por detrás que lo va manteniendo... creo que para Windows ofrece dos instaladores (sin compilador y con minGw), yo me descargaría la opción con compilador. De esta forma tienes todo el paquete listo para desarrollar.

Cita:
Iniciado por tabam Ver Mensaje
Ademas porque el Dev-C++ a pesar de compilar el programa me muestra estos mensajes:

Código BASH:
Ver original
  1. C:\wamp\www\lpt\temporal.cpp In function `int main(int, char**)':
  2. 17 C:\wamp\www\lpt\temporal.cpp [Warning] converting to `int' from `double'
Ahí únicamente te está mostrando una advertencia, y ésta te avisa que estás realizando una conversión de tipo double (decimal) a tipo int (sin decimales). Esta advertencia sale porque cada tipo de datos tiene su propio rango de valores (el rango de double es muchísimo mayor que el de int) y la conversión puede dar lugar a la pérdida de información.

Cita:
Iniciado por tabam Ver Mensaje
Lamentablemente no entiendo bien lo que me decís que tengo que hacer, aparte me confunde los punteros que utiliza C para obtener el parámetro que le estoy enviando desde PHP.
En memoria las cadenas de caracteres se almacenan alineando los caracteres uno detrás de otro en posiciones consecutivas de memoria. En PHP, que es un lenguaje orientado a objetos, se hace uso de una clase string que encapsula este comportamiento, por lo que este detalle para tí pasa desapercibido. En C, en cambio, no hay clases, por lo que el acceso hay que realizarlo, a pelo. En este caso lo que obtienes es un puntero, que no es más que una variable con una particularidad: en vez de almacenar un valor, almacena una posición de memoria. El puntero en este caso apunta a la posición de memoria donde empieza la cadena de caracteres, por lo que recorrer la cadena de caraceres es tan sencillo como incrementar el valor almacenado en el puntero (que es una dirección de memoria).

En cualquier caso se puede conseguir un código más sencillo para realizar la tarea que necesitas:

Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. // argc indica el número de argumentos almacenados en argv
  4. // el valor mínimo de argc es 1, ya que el primer argumento es SIEMPRE el nombre del ejecutable
  5. // argv es una tabla de strings
  6. main (int argc, char *argv[])
  7. {
  8.   if(argc == 2)
  9.   {
  10.     int num = 0;
  11.  
  12.     // creamos una nueva variable, ptr, que apunta al inicio del número a convertir
  13.     char* ptr = argv[1];
  14.  
  15.     // Las cadenas de caracteres en C terminan SIEMPRE con un caracter nulo '\0'
  16.     // Si 'ptr' almacena una posición de memoria, '*ptr' permite recuperar el valor
  17.     // almacenado en dicha posición de memoria.
  18.     // Por otro lado, 'if(*ptr)' es equivalente a 'if(*ptr!=0)'
  19.     // El bucle for, como en PHP, tiene tres partes:
  20.     //   - inicialización de variables (que no lo necesitamos, por eso está en blanco)
  21.     //   - condición para salir del bucle (llegar al final de la cadena)
  22.     //   - actualización de variables en cada iteración (avanzamos un caracter)
  23.     // En resumen: este bucle itera sobre una cadena hasta que llega al final de la misma.
  24.     for( ; *ptr; ++ptr)
  25.     {
  26.       // Multiplicamos el número acumulado hasta ahora por 10 para hacer sitio
  27.       // al nuevo dígito
  28.       num *= 10;
  29.  
  30.       // '0'=0x30 y a partir de ahí siguen el resto de dígitos, así, por ejemplo:
  31.       // '8'-'0'=0x38-0x30=0x08=8.
  32.       // Queda claro entonces que esta línea convierte un carácter en un dígito numérico
  33.       num += *ptr - '0';
  34.     }
  35.  
  36.     printf("<br>%i",num);
  37.   }
  38.   else
  39.   {
  40.     printf("Error: argumentos no validos\n");
  41.     return 1;
  42.   }
  43.  
  44.   return 0;
  45. }

Un saludo