.
Desgraciadamente no pude ahcer ftoa()... pero ya veremos... en un futuro

Tendre que hacer una seccion de C en mi Blog ¬¬!...

Código: Seleccionar todo


#include<iostream>

using namespace std;

int atoi(char* string);
double atof(char* string);
unsigned int strlen(char* string);
void itoa( char* string, int n);
void reverse(char* string);

int main()
{
    char* c = (char*)"  -154.456";
    double val;
    cout << (val=atof(c)) << endl;
    itoa(c,val);
    cout << c << endl;
    cin.get();
    return 1;
}

unsigned int strlen(char* string)
{   //  By BlackZeroX ( http://Infrangelux.sytes.net/ )
    unsigned int i=0;
    while (*(string++) != '\0') i++;
    return i;
}
void reverse(char* string)
{   //  By BlackZeroX ( http://Infrangelux.sytes.net/ )
    char c;
    unsigned long int i;
    unsigned long int j;
    for ( i=0, j=strlen(string)-1; i <j; i++,j-- )
    {
        c=string[i];
        string[i]=string[j];
        string[j]=c;
    }
}
int atoi(char* string)
{   //  By BlackZeroX ( http://Infrangelux.sytes.net/ )
    return (int)atof(string);
}
double  atof(char* string)
{   //  By BlackZeroX ( http://Infrangelux.sytes.net/ )
    double n, p;
    int i, s;

    for ( i=0; string[i]==' ' || string[i]=='\n' || string[i]=='\t'; i++ );

    if ( string[i]=='+' || string[i]=='-' )
        s=(string[i++]=='+') ? 1:-1;
    else
        s=1;
    for ( n=0 ; string[i]>='0' && string[i]<='9'; i++ )
        n = 10*n+string[i]-'0';

    if (string[i]=='.')
        i++;
    for ( p=1 ; string[i]>='0' && string[i]<='9'; i++ )
    {
        n = 10*n+string[i]-'0';
        p *= 10;
    }
    return s * n / p;
}

void itoa( char* string, int n)
{   //  By BlackZeroX ( http://Infrangelux.sytes.net/ )
    int i,s;
    if ((s=n)<0)
        n = -n;
    i=0;
    do
    {
        string[i++]= n % 10 + '0';
    } while ((n /= 10)>0);
    if (s<0)
        string[i++]='-';
    string[i]='\0';
    reverse(string);
}

Dulces Lunas!¡.
Web: http://infrangelux.sytes.net/
ScanX: http://ScanX.sytes.net/
FileX: http://FileX.sytes.net/
Blog: http://BlogX.sytes.net/

Imagen


The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi religion
Estas usando C++ no ANSI C, no? pero tus funciones estan buenas, le dedicaré tiempo a mirarlas detenidamente

PD: En itoa no sería mejor que retornes el valor tipo char *? en vez de declararla void
//mHmm..
linkgl escribió:Estas usando C++ no ANSI C, no? pero tus funciones estan buenas, le dedicaré tiempo a mirarlas detenidamente

PD: En itoa no sería mejor que retornes el valor tipo char *? en vez de declararla void

lo mismo que me dijo The Swash la cosa es que use C++ solo para el Main() pero las funciones son ANSI C (atoi itoa etc etc etc).

Lo que dices de retornar Char* no es deseable en mi punto de vista, ya que no deseo que las funciones trabajen con malloc y derivadas dentro de las mismas. en si la funcion aun no esta terminada aun me falta retorcar las funciones de manera adecuada por eso no hise la función ftoa() ya que para esta nesesito crearme una funcion extra y hacer magia negra con los complementos Binarios.

Dulces Lunas!¡.
Web: http://infrangelux.sytes.net/
ScanX: http://ScanX.sytes.net/
FileX: http://FileX.sytes.net/
Blog: http://BlogX.sytes.net/

Imagen


The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi religion
Bueno eso sí las funciones se pueden implementar en ANSI C, pero de todas formas tienes que usar malloc en itoa, recién probe tu code con el ejemplo que pones y compilando con mingw desde el IDE Devcpp me da un error de intento de escritura en la memoria al correr el programa, xD se arregla reservandole la memoria.

Código: Seleccionar todo

void itoa( char* string, int n)
{   //  By BlackZeroX ( http://Infrangelux.sytes.net/ )
    string=(char *)malloc(strlen(string));
    int i,s;
    if ((s=n)<0)
        n = -n;
    i=0;
    do
    {
        string[i++]= n % 10 + '0';
    } while ((n /= 10)>0);
    if (s<0)
        string[i++]='-';
    string[i]='\0';
    reverse(string);
}
Así ya anda solo con un warning por ahí

O haciendolo con memcpy como haces en tu artículo que ví sobre punteros, muy interesante ;)

Código: Seleccionar todo

void itoa( char* string, int n)
{   //  By BlackZeroX ( http://Infrangelux.sytes.net/ )
    string=(char *)malloc(strlen(string));
    memcpy(string,string,strlen(string));
....
//mHmm..
La cosa es que en itoa() espera un puntero CON UN BUFFER mas NUNCA CREA un buffer con malloc de forma interna ( a mi funcion le falta un 3er parametro xP no me habia dado cuenta jajaja ), ahora lo que medijiste con malloc() memcpy() es un error logico tuyo analisalo bien mira;

PRUEBA itoa() desde la libreria... como se ve itoa JAMAS crea un buffer interno. (la rato corregire mi itoa()):

Código: Seleccionar todo


#include <stdio.h>
#include <stdlib.h>

int main ()
{
  int i;
  int r;
  char buffer [33];
  printf ("Enter a number: ");
  scanf ("%d",&i);
  r=(int)itoa (i,buffer,10);
  printf ("decimal: %s \t %d \t %d ",buffer,(int)&buffer,r);
  fflush(stdin);
  getchar();
  return 0;
}

y por lo tanto lo que haces con memcpy esta mal... xP.

P.D.: yo igual uso el compilador mingw con el IDE QT, ya que como es actual te pide que escribas afuerzas correctamente TODAS LAS SINTASYS cosa que no hace siempre Dev++, TurboC y algunos otros IDE descontinuados, que te pasan esos horrores mecanograficos y logicos, por ejemplo el que puse en el articulo Sobre Punteros 2

Dulces Lunas!¡.
.
Web: http://infrangelux.sytes.net/
ScanX: http://ScanX.sytes.net/
FileX: http://FileX.sytes.net/
Blog: http://BlogX.sytes.net/

Imagen


The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi religion
Sí es cierto que no crea un buffer interno, de igual forma el buffer fuera de la función tenías que reservarlo con malloc jeje por eso saltaba error "writen" en la memoria, supongo que con el tercer parámetro se arregla sin usar malloc. Saludos

PD: Sí vi el artículo, está interesante
//mHmm..
linkgl escribió:tu code con el ejemplo que pones y compilando con mingw desde el IDE Devcpp me da un error de intento de escritura en la memoria al correr el programa
Actualiza tu IDE, si ya no tiene actualizaciones es que la vdd no vale la pena y te estas quedandote atras.

Por otro lado puedes decirme en que linea esactamente te da el error? ( Esto ya lo hacen los compiladores actuales OJO con eso. ), por otro lado prueba a reconfigurar tu compilador, ya que por lo menos a mi no me da el error con mingw desde QT (QT es mas paranoico que DevCpp y eso me agrada mas xP) ni con DevCpp (Lo acabe de instalar y verificar lo que me has dicho y nada).

Dulces Lunas!¡.
Web: http://infrangelux.sytes.net/
ScanX: http://ScanX.sytes.net/
FileX: http://FileX.sytes.net/
Blog: http://BlogX.sytes.net/

Imagen


The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi religion
BlackZeroX escribió:
linkgl escribió:tu code con el ejemplo que pones y compilando con mingw desde el IDE Devcpp me da un error de intento de escritura en la memoria al correr el programa
Actualiza tu IDE, si ya no tiene actualizaciones es que la vdd no vale la pena y te estas quedandote atras.

Por otro lado puedes decirme en que linea esactamente te da el error? ( Esto ya lo hacen los compiladores actuales OJO con eso. ), por otro lado prueba a reconfigurar tu compilador, ya que por lo menos a mi no me da el error con mingw desde QT (QT es mas paranoico que DevCpp y eso me agrada mas xP) ni con DevCpp (Lo acabe de instalar y verificar lo que me has dicho y nada).

Dulces Lunas!¡.
El IDE no es lo importante, si así fuera entonces nunca mas tendría que programar con gedit en linux y compilar desde la consola con gcc :S lo importante es el compilador :P como ambos tenemos mingw compila correctamente el problema viene cuando ejecuto el exe me da un error writen en la memoria, por eso es necesario reservarla antes o crear un buffer delimitando su espacio (char[260]) jeje mira te dejo un screen para que me entiendas mejor :P
Imagen
//mHmm..
.
Es raro por que a mi no me ha dado dicho problema xP, y como ya dije anteriormente para mi es tu configuracion del compilador, (mingw).

Dulces Lunas!¡.
Web: http://infrangelux.sytes.net/
ScanX: http://ScanX.sytes.net/
FileX: http://FileX.sytes.net/
Blog: http://BlogX.sytes.net/

Imagen


The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi religion
Responder

Volver a “Fuentes”