función con arreglo de punteros. C++

Iniciado por yookino, 4 Febrero 2014, 17:15 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 ",numeros[0],numeros[1]);

     getch();
   }

rir3760

Cita de: yookino en  4 Febrero 2014, 17:15 PMme 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?
Lo estas haciendo mal. Deberia ser:
void llenar(int ptrnumeros[])
{
   ptrnumeros[0] = 25;
   ptrnumeros[1] = 50;
}

int main()
{
   int numeros[2];
   
   llenar(numeros);
   printf("%d %d\n", numeros[0], numeros[1]);
   
   return 0;
}


Y deberías evitar el uso de funciones como getch parte de la biblioteca conio de Borland, las razones de ello se encuentran en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

eferion

En cualquier caso, también recordar al personal lo peligroso que es pasar como argumento una matriz o vector y no indicar como parámetros el tamaño de la misma... lo que hoy es un vector de 2 elementos mañana puede ser de N.

El Benjo

Creo que he encontrado la solución: No era una sola cosa sino varias, en cuestión todo con los benditos/malditos punteros.

Lo primero que estabas haciendo al hacer referencia a los elementos del arreglo está mal, la forma de hacerlo es incrementando la dirección de memoria con aritmética de punteros.

Lo segundo es la forma en que llamas a la función al pasar el parámetro no utilices el operador "&". El código que a mí me compiló (haciendo la aclaración: como código C no C++ por el uso de getch() ) es el siguiente.

void llenar(int *ptrnumeros)
  {
      *ptrnumeros=25;
      ptrnumeros++;
      *ptrnumeros=50;
  }

void main()
  {
     int numeros[2];

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

     getch();
   }


Saludos.
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.

yookino

gracias por responder, solo que así como me dices que lo haga no le estaría asignando nada a mi arreglo, puesto que la función no retorna valores, por eso yo intento usar punteros. en cuanto al uso de getc() me pondré a leer.

El Benjo

Es que sí se le están asignando los valores:

*ptrnumeros=25;
      ptrnumeros++;
      *ptrnumeros=50;


¿Al ejecutar tu aplicación qué valores te aparecen?
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.

yookino

Muchas gracias, solucionaron mi problema ahora los valores se se cargan correctamente  y ademas me dejaron mucho por investigar.

eferion

Cita de: yookino en  4 Febrero 2014, 17:41 PM
gracias por responder, solo que así como me dices que lo haga no le estaría asignando nada a mi arreglo, puesto que la función no retorna valores, por eso yo intento usar punteros. en cuanto al uso de getc() me pondré a leer.


Si tu estás gestionando punteros... y un vector lo es, cualquier cambio en el puntero es visible para todos los punteros que apunten a la misma posición de memoria.

cuando tú pasas como argumento de una función un vector no estás copiando literalmente ese vector, estás pasando la posición de memoria en la cual "empieza" dicho vector... o lo que es lo mismo, estás pasando un puntero.

Cualquier cambio que realices en la memoria apuntada por ese puntero se verá reflejado en el vector, ya que ambos elementos están trabajando sobre la misma posición de memoria.

Yoel Alejandro

Hola a todos, continuando con la idea de Benjo (el tema de punteros es amplio, hay MUCHAS maneras y combinaciones para hacer una misma cosa), podríamos escribirlo también así:


    void llenar(int *numero_ptr)
     {
         *numero_ptr = 25;
         *(numero_ptr + 1) = 50;
     }
     
    void main()
     {
        int numeros[2];
     
        llenar(numeros);
        printf("%d, %d ",numeros[0],numeros[1]);
     
        getch();
      }


donde hacemos la aritmética de punteros en la misma línea, sin necesidad de hacerlo por separado. Repito, una de las varias maneras que hay de hacerlo.

Saludos a todos, Yoel :)
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

Yoel Alejandro

Por cierto yookino, en el otro foro donde habías puesto la pregunta te puse una respuesta más detallada sobre el (sutils) asunto aquí desarrollado. Era esta:

===========================================================
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.)