Respeta la nomenclatura de las funcionesTodas las funciones en C y C++ tienen la siguiente forma:
TIPO_RETORNO nombreFuncion( [ARGUMENTOS] ){ }
En tu caso, palindromo no respeta esta nomenclatura ya que, por ejemplo, no tiene los paréntesis (nota que "argumentos" está entre corchetes... esto es porque son opcionales... sin embargo el resto es obligatorio).
No uses variables globalesEs muy cómodo declarar una variable global al inicio del programa y después olvidarse de pasar argumentos a las funciones. El pero es que esta forma de trabajar provoca más problemas que beneficios.
Declarar una variable dentro de una función es prácticamente gratis y usar los argumentos te permite aislar el código de forma más eficaz. Además el código queda mucho más legible.
Para gestionar cadenas, usa char* o, mejor aún, la clase stringchar únicamente permite almacenar un carácter. Es decir, para leer una cadena necesitas un array de caracteres. Los arrays de caracteres se declaran tal que "char* cadena". Eso sí has de tener en cuenta que ahora cadena es un puntero y hay que tener cuidado a la hora de utilizar punteros.
Por ejemplo, para copiar una cadena de caracteres en otra no puedes hacer "cadena1 = cadena2" como queda claro con el siguiente ejemplo:
char cadena1[10] = "Hola";
char *cadena2;
cadena2 = cadena1;
cadena2[ 0 ] = 'S';
// Imprime por pantalla: Sola
std::cout << cadena1 << std::endl;
Lo que hace la asignación es que el puntero "cadena2" apunta al mismo sitio que "cadena1", por lo que cualquier cambio que se haga en una de las variables afecta directamente a la otra. La forma correcta de copiar cadenas de caracteres es (una de ellas):
char cadena1[10] = "Hola";
char cadena2[10];
strcpy( cadena2, cadena1 );
cadena2[ 0 ] = 'S';
// Imprime por pantalla: Hola
std::cout << cadena1 << std::endl;
Nota para los del foro: Se que hay formas más seguras de copiar las cadenas de caracteres... esto es un ejemplo
La opción b es hacer uso de una clase diseñada específicamente para gestionar cadenas de caracteres. Hablo de la clase string. string se encarga de hacer todas las operaciones engorrosas de los arrays de caracteres de forma transparente para el programador:
std::string cadena1 = "Hola";
std::string cadena2;
cadena2 = cadena1;
cadena2[ 0 ] = 'S';
// Imprime por pantalla: Hola
std::cout << cadena1 << std::endl;
Además, string dispone de otras tantas "cosas buenas":
std::string cadena = "ABCDEF";
std::string cadena2 = cadena + "GHI";
std::cout << "Contenido:" << cadena << std::endl;
std::cout << "Longitud: " << cadena.size( ) << std::endl;
std::cout << "Probando la concatenacion: " << cadena2 << std::endl;
// ...
Aprende a leer los mensajes de error de compilaciónAl principio te costará, pero es un paso necesario con el que tienes que pegarte. El compilador te va a dar mucha información, pero has de saber interpretarla correctamente. No tengas miedo a pegarte con ello.
Aprende a usar los depuradores de códigoDespués de entender los mensajes de compilación, el siguiente paso es meterse de lleno en la depuración de código. Mano de santo para corregir errores a la hora de diseñar la algoritmia de la aplicación.