[C con Clase] Error: Fallo de segmentación

Jose Luis joselubar en gmail.com
Jue Ene 24 21:43:42 CET 2008


Gracias por la corrección. Entiendo lo que ha provocado el error, y la
conveniencia de pasar el puntero como argumento de la función. Pero hay
algunas cosas que no termino de entender en el diseño típico:

        char * DectoBase( TIPO1 numdec, TIPO2 base, char *numbase )
        {
           // ¿Puntero nulo?
           if( !numbase )  return 0;
           ...
           return numbase;
        }

Empezando por la declaración de la función ¿qué necesidad hay de que retorne
el mismo puntero que se pasa como parámetro?
Tampoco tengo muy claro la utilidad de if(!numbase) return 0; aunque he
hecho la siguiente interpretación:


#include <iostream>
using namespace std;
typedef unsigned long long int ULLINT;
typedef unsigned short int USINT;

const char DIGITOS[16] = {'0', '1', '2', '3', '4', '5', '6', '7',
                        '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

void DectoBase(ULLINT numdec, USINT base, char *numbase);
ULLINT Pot(USINT base, USINT exponente);

int main()
{
    ULLINT numdec;
    USINT base, nDig, nCant;
    char *numbase;
    numbase = NULL;

    cout << "\n Numero, base: ";
    cin >> numdec >> base;

    if(base >= 2 && base <= 16) nCant = 0;
    {
        /* Calcula el número de dígitos de numdec: */
        nDig = 0;
        while( numdec/Pot(10,nDig) >= 1) nDig++;
        /* Reserva la memoria necesaria: */
        if(base >= 10) nCant = nDig + 1;
        else nCant = nDig * (8 / base) + 2;        // una mala aproximación
        numbase = new char[nCant];
    }

    DectoBase(numdec, base, numbase, nCant);
    if(numbase) cout << "\n " << numbase << endl;
    else cout << "\n error" << endl;

    delete[] numbase;

    cin.get();cin.get();
    return 0;
}

void DectoBase(ULLINT numdec, USINT base, char *numbase)
{
    if(!numbase) return;

    USINT resto;
    USINT i = 0, j;
    char aux;

    while(numdec >= base)
    {
        resto = numdec % base;
        numbase[i] = DIGITOS[resto];
        numdec /= base;
        i++;
    }
    numbase[i] = DIGITOS[numdec];
    numbase[i+1] = 0;
    /* Invierte la cadena: */
    for( j = 0; j <= i/2; j++ )
    {
        aux = numbase[j];
        numbase[j] = numbase[i-j];
        numbase[i-j] = aux;
    }
}

ULLINT Pot(USINT base, USINT exponente)
{
    ULLINT valor = 1;
    USINT i;

    if(!exponente) return 1;
    for( i = 1; i <= exponente; i++ ) valor *= base;
    return valor;
}


y para terminar (lamento mi torpeza) tampoco logro entender la utilidad del
parámetro nCant en el segundo caso.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20080124/a591b002/attachment.html>


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