[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