Respecto a tu primer mensaje (para no citarlo entero):
Bueno ya empieza a coger forma aunque hay que terminar de pulir ese código...
El primer error lo tienes en la función <pedirNombre()>. Aunque antes has visto que era equivalente pasar una variable por referencia que pasar un puntero ya que ambas son direcciones de memoria, no es exactamente lo mismo. Por lo que tienes que cambiar el parámetro de un <char> por referencia a un puntero de <char>. Es decir la función debe quedar así:
No olvides cambiarlo tanto en el prototipo de la función como abajo en la implementación.
Otro error lo tienes en la línea 22: Tenemos una función que debe recibir un puntero a <char> (porque cuando pasamos un array como parámetro lo que pasamos en realidad es un puntero de la primera posición del array) y tú le estás pasando <usuario[30]> que es la posición 30 del array <usuario>, es decir, le estás pasando un <char> (que además está fuera de los límites ya que si el tamaño es 30, las posiciones del array irían del 0 al 29 incluidos). En este caso solo se escribe el nombre del array tal que:
Hasta aquí los errores como tal. Una vez corregido eso, el programa ya funcionaría.
Y aquí un par de consejos o trucos:
Bueno ya empieza a coger forma aunque hay que terminar de pulir ese código...
El primer error lo tienes en la función <pedirNombre()>. Aunque antes has visto que era equivalente pasar una variable por referencia que pasar un puntero ya que ambas son direcciones de memoria, no es exactamente lo mismo. Por lo que tienes que cambiar el parámetro de un <char> por referencia a un puntero de <char>. Es decir la función debe quedar así:
Código (cpp) [Seleccionar]
int pedirNombre(char*);
No olvides cambiarlo tanto en el prototipo de la función como abajo en la implementación.
Otro error lo tienes en la línea 22: Tenemos una función que debe recibir un puntero a <char> (porque cuando pasamos un array como parámetro lo que pasamos en realidad es un puntero de la primera posición del array) y tú le estás pasando <usuario[30]> que es la posición 30 del array <usuario>, es decir, le estás pasando un <char> (que además está fuera de los límites ya que si el tamaño es 30, las posiciones del array irían del 0 al 29 incluidos). En este caso solo se escribe el nombre del array tal que:
Código (cpp) [Seleccionar]
longitud = pedirNombre(usuario);
Hasta aquí los errores como tal. Una vez corregido eso, el programa ya funcionaría.
Y aquí un par de consejos o trucos:
- Como antes te he comentado, hay que evitar las variables globales. Por tanto no deberíamos tener las líneas 12 y 13. El nombre de un array corresponde a un puntero que apunta a la primera posición del array. En tu caso:Código (cpp) [Seleccionar]
// creamos un array de <int>
int vocales[5] = {0}; // Con esto se inicializa la primera posicion al valor que indiques y el resto a 0 por lo tanto todo a 0
int *puntero = &vocales[0]; // hacemos que <puntero> apunte al comienzo de <vocales>
// Ahora tenemos dos punteros que apuntan a <vocales[0]>. Uno es <puntero> y el otro es <vocales> (<vocales> equivale a <&vocales[0]> por lo que podemos hacer:)
int *puntero = vocales; // esto equivale a lo anterior
// O directamente podemos usar <vocales> y nos ahorramos un puntero global que no nos traera nada bueno - La aritmética de puntero no es lo más cómodo digamos. Por lo tanto a no ser que te lo exijan o te guste, puedes usar la indexación:Código (cpp) [Seleccionar]
vocales[i]
*(vocales+i)
Estás dos sentencias son exactamente lo mismo. Siempre puedes pasar de una nomenglatura a la otra. Y sí se pueden incrementar punteros pero debes usar paréntesis:Código (cpp) [Seleccionar]
int vocales[5] = {1,2,3,4,5};
int *puntero = vocales;
++puntero; // ahora <puntero> apunta a la siguiente posicion
++(*puntero); // ahora incrementamos el valor al que apunta <puntero> que es <vocales[1]> entonces <vocales> = {1,3,3,4,5}
++(*(puntero+1)); // incrementamos el valor de la siguiente posicion a la que apunta <puntero>. Ahora <vocales> = {1,3,4,4,5}
Esto es igual para el -- y tanto si lo ponemos en prefijo como en sufijo.
Por lo tanto creo que lo mejor es: - Crear el array <char nombre[30]> en el <main>
- Crear el array <int vocales[5]> en el <main>
- Usar una función <int pedirNombre(char *nombre)> para pedir el nombre al usuario y obtener su longitud.
- Usar una función <void contarVocales(char *nombre, int longitud, int *vocales)> para contar las vocales.
Así consigues resolver el programa sin variables globales, sin memoria dinámica y usando únicamente 2 variables (<nombre> y <vocales>)
Respecto a tu segundo mensaje:
Te sugiero que modifiques lo que te comento más arriba en tu primer código para no meterte con memoria dinámica (<new>). Es mejor que primero aprendas bien a pasar los parámetros antes de nada.