elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  función con arreglo de punteros. C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: función con arreglo de punteros. C++  (Leído 7,333 veces)
yookino

Desconectado Desconectado

Mensajes: 5


Ver Perfil
función con arreglo de punteros. C++
« en: 4 Febrero 2014, 17:15 pm »

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();
   }


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: función con arreglo de punteros. C++
« Respuesta #1 en: 4 Febrero 2014, 17:25 pm »

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?
Lo estas haciendo mal. Deberia ser:
Código
  1. void llenar(int ptrnumeros[])
  2. {
  3.   ptrnumeros[0] = 25;
  4.   ptrnumeros[1] = 50;
  5. }
  6.  
  7. int main()
  8. {
  9.   int numeros[2];
  10.  
  11.   llenar(numeros);
  12.   printf("%d %d\n", numeros[0], numeros[1]);
  13.  
  14.   return 0;
  15. }

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


En línea

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


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: función con arreglo de punteros. C++
« Respuesta #2 en: 4 Febrero 2014, 17:28 pm »

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.
En línea

El Benjo


Desconectado Desconectado

Mensajes: 392



Ver Perfil WWW
Re: función con arreglo de punteros. C++
« Respuesta #3 en: 4 Febrero 2014, 17:39 pm »

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.

Código
  1. void llenar(int *ptrnumeros)
  2.  {
  3.      *ptrnumeros=25;
  4.      ptrnumeros++;
  5.      *ptrnumeros=50;
  6.  }
  7.  
  8. void main()
  9.  {
  10.     int numeros[2];
  11.  
  12.     llenar(numeros);
  13.     printf("%d, %d ",numeros[0],numeros[1]);
  14.  
  15.     getch();
  16.   }

Saludos.
En línea

www.es.neftis-ai.com

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

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: función con arreglo de punteros. C++
« Respuesta #4 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.
En línea

El Benjo


Desconectado Desconectado

Mensajes: 392



Ver Perfil WWW
Re: función con arreglo de punteros. C++
« Respuesta #5 en: 4 Febrero 2014, 17:45 pm »

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

Código
  1. *ptrnumeros=25;
  2.      ptrnumeros++;
  3.      *ptrnumeros=50;

¿Al ejecutar tu aplicación qué valores te aparecen?
En línea

www.es.neftis-ai.com

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

Desconectado Desconectado

Mensajes: 5


Ver Perfil
Re: función con arreglo de punteros. C++
« Respuesta #6 en: 4 Febrero 2014, 17:55 pm »

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

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: función con arreglo de punteros. C++
« Respuesta #7 en: 4 Febrero 2014, 18:00 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.
En línea

Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: función con arreglo de punteros. C++
« Respuesta #8 en: 4 Febrero 2014, 23:25 pm »

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í:

Código:
    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 :)
En línea

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

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: función con arreglo de punteros. C++
« Respuesta #9 en: 4 Febrero 2014, 23:28 pm »

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:

Código:

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.
En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Arreglo char* en funcion
Programación C/C++
netca 1 2,380 Último mensaje 15 Agosto 2012, 00:06 am
por тαптяα
arreglo de punteros y funciones
Programación C/C++
m@o_614 9 4,033 Último mensaje 30 Agosto 2013, 17:38 pm
por rir3760
función con arreglo de punteros. C++
Programación C/C++
yookino 2 2,117 Último mensaje 4 Febrero 2014, 23:14 pm
por Yoel Alejandro
Pasar a función un arreglo con punteros o con el nombre del arreglo como puntero
Programación C/C++
NOB2014 3 3,488 Último mensaje 9 Junio 2016, 17:10 pm
por geeke
Confusión: arreglo de arreglo de strings (o con punteros)
Programación C/C++
Skali 3 2,525 Último mensaje 18 Mayo 2018, 19:22 pm
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines