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

JoseL joselubar en gmail.com
Mar Ene 22 22:11:39 CET 2008


Hola,

Estoy practicando con un programa que hace conversiones entre sistemas numéricos. La función DectoBase valdría para convertir un entero decimal 'numdec' en una cadena 'numbase' que representa el mismo número en base 'base'. La función retorna un puntero a dicha cadena.

El caso es que puedo compilarlo(wx-devcpp), pero cuando lo ejecuto el programa se cierra abruptamente. El código tiene más o menos esta pinta:

#include <iostream>
using namespace std;

typedef unsigned long long int TIPO1;
typedef unsigned short int TIPO2;

const char DIGITOS[16] = {'0', '1', '2', '3', '4', '5', '6', '7',
						'8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
						
char* DectoBase(TIPO1 numdec, TIPO2 base);
//...

int main()
{
	TIPO1 num=45763;
	char *result;
	//...
	result = DectoBase(num, 16);
	cout << result << endl;
	//...	
	cin.get();
	return 0;
}

char* DectoBase(TIPO1 numdec, TIPO2 base)
{
	TIPO2 resto;
	TIPO2 i = 0, j;
	char *numbase;

	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++ ) numbase[j] = numbase[i-j];
	
	return numbase;
}
//...

Si ejecuto el programa paso a paso, al llegar a la línea
numbase[i] = DIGITOS[resto];
me sale el siguiente warning: Violación de un acceso a memoria (Fallo de segmentación). Tras hacer algunas pruebas, he comprobado que si utilizo otro tipo para TIPO1, como int o long, el programa ya no se para en este punto sino al llegar a la línea
return numbase;
En este caso sale otro warning de fallo de segmentación, y además, se abre una nueva pestaña con el fichero "locale_facets.ctt" donde queda marcada la siguiente línea:
http://allyoucanupload.webshots.com/v/2001736601202302733

También he probado a pasar 'result' como argumento, quedando la función así
void DectoBase(TIPO1 numdec, TIPO2 base, char* numbase);
pero me sigue dando el mismo error al llegar a numbase[i] = DIGITOS[resto]; y aún peor, porque en este caso ocurre siempre aunque utilice el tipo int para TIPO1 y TIPO2.

¿Alguien me podría indicar porqué ocurren estos errores y cómo podría sortearlos?

Gracias y un saludo.


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