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:<br><br> char * DectoBase( TIPO1 numdec, TIPO2 base, char *numbase )
<br> {<br> // ¿Puntero nulo?<br> if( !numbase ) return 0;<br> ...<br> return numbase;<br> }<br><br>Empezando por la declaración de la función ¿qué necesidad hay de que retorne el mismo puntero que se pasa como parámetro?
<br>Tampoco tengo muy claro la utilidad de if(!numbase) return 0; aunque he hecho la siguiente interpretación:<br><br><br>#include <iostream><br>using namespace std;<br>typedef unsigned long long int ULLINT;<br>typedef unsigned short int USINT;
<br><br>const char DIGITOS[16] = {'0', '1', '2', '3', '4', '5', '6', '7',<br> '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
<br><br>void DectoBase(ULLINT numdec, USINT base, char *numbase);<br>ULLINT Pot(USINT base, USINT exponente);<br><br>int main()<br>{<br> ULLINT numdec;<br> USINT base, nDig, nCant;<br> char *numbase;<br> numbase = NULL;
<br> <br> cout << "\n Numero, base: ";<br> cin >> numdec >> base;<br> <br> if(base >= 2 && base <= 16) nCant = 0;<br> {<br> /* Calcula el número de dígitos de numdec: */
<br> nDig = 0;<br> while( numdec/Pot(10,nDig) >= 1) nDig++;<br> /* Reserva la memoria necesaria: */<br> if(base >= 10) nCant = nDig + 1;<br> else nCant = nDig * (8 / base) + 2; // una mala aproximación
<br> numbase = new char[nCant];<br> }<br> <br> DectoBase(numdec, base, numbase, nCant);<br> if(numbase) cout << "\n " << numbase << endl;<br> else cout << "\n error" << endl;
<br> <br> delete[] numbase;<br> <br> cin.get();cin.get();<br> return 0;<br>}<br><br>void DectoBase(ULLINT numdec, USINT base, char *numbase)<br>{<br> if(!numbase) return;<br> <br> USINT resto;<br> USINT i = 0, j;
<br> char aux;<br><br> while(numdec >= base)<br> {<br> resto = numdec % base;<br> numbase[i] = DIGITOS[resto];<br> numdec /= base;<br> i++;<br> }<br> numbase[i] = DIGITOS[numdec];
<br> numbase[i+1] = 0;<br> /* Invierte la cadena: */<br> for( j = 0; j <= i/2; j++ )<br> {<br> aux = numbase[j];<br> numbase[j] = numbase[i-j];<br> numbase[i-j] = aux;<br> }<br>}<br>
<br>ULLINT Pot(USINT base, USINT exponente)<br>{<br> ULLINT valor = 1;<br> USINT i;<br> <br> if(!exponente) return 1;<br> for( i = 1; i <= exponente; i++ ) valor *= base;<br> return valor;<br>}<br><br>
<br>y para terminar (lamento mi torpeza) tampoco logro entender la utilidad del parámetro nCant en el segundo caso.<br>