función con arreglo de punteros. C++

Iniciado por yookino, 4 Febrero 2014, 17:03 PM

0 Miembros y 1 Visitante están viendo este tema.

yookino

Hola que tal, tengo duda de por que esto que a continuación les publico, me marca error al compilar para ser precisos en donde llamo a la función llenar. ¿ Lo que intento hacer, no es posible hacerlo? o ¿lo estoy haciendo mal? Cualquier comentario es bien recibido!!

//#cabeceras

void llenar(int* ptrnumeros[])
  {
      *ptrnumeros[0]=25;
      *ptrnumeros[1]=50;
  }

void main()
  {
     int numeros[2];

     llenar(&numeros);
     printf("%d, %d ",nueros[0],numeros[1]);

     getch();
   }

yookino

Gracias por tu respuesta ahora mismo lo cambio de foro, en cuanto al problema el error no esta allí, pero buena observación!!

Yoel Alejandro

Hola yookino, te explico. Aparte del error en el printf, tu programa tiene un problema muy sutil, justo de esa clase que los hace difíciles de localicar. Una de las mayores potencias del lenguaje C es la capacidad de manejar punteros, pero esa ventaja se puede convertir a veces en dolor de cabeza.

La función llenar está codificada de manera de recibir un arreglo de punteros. Aquí debes tener en cuenta la "precedencia" de los operadores de C, pues el operador [] (acceso a elemento arreglo) tiene mayor precedencia que el operador * (indirección). O sea, que la sentencia:


*ptrnumeros[0]=25;


primero ejecuta el "[]", luego el "*". O sea, extrae el primer elemento del arreglo prtnumeros, que debe ser un puntero (o sea, la dirección de un dato en la memoria), y luego obtiene el dato apuntado por dicha dirección.

Ahora, bien, en la sentencia


llenar(&numeros);


no estás pasando un arreglo de punteros sino un arreglo por referencia (que es otra cosa). Si fueras a hacer eso, la función llenar debería esta codificada más bien como:


(*ptrnumeros)[0]=25;


que PRIMERO convierte la dirección al arreglo en un arreglo, y luego accesa a su elemento. Ahí debería funcionar sin problemas.

Los arreglos de punteros se usan por ejemplo para crear matrices bidimensionales y la verdad no tiene nada que ver con tu ejercicio. Para tu caso yo recomendaría una solución más senclla, como:


void llenar(int* numeros)
  {
      numeros[0]=25;
      numeros[1]=50;
  }

void main()
  {
     int numeros[2];

     llenar(numeros);
     printf("%d, %d ",numeros[0],numeros[1]);

     getch();
   }


Puesto que en C un arreglo es un puntero (al primer elemento del array), "numeros" es a la vez un arreglo de int, y un puntero a int. Con esto debería funcionar perfectamente, no se por qué te fuiste por una solución tan complicada.

Espero te ayude  :)
Yoel.
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)