Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: h0oke en 23 Mayo 2010, 16:00 pm



Título: C/C++ Dudas parámetros
Publicado por: h0oke en 23 Mayo 2010, 16:00 pm
He visto que en C los pasos por referencia se hacen de la siguiente manera:

Código
  1. int funcion(int *a, int *b);

En C++, he visto que se puede utilizar directamente:

Código
  1. int funcion(int &a, int &b);

En C++ es optativo utilizar cualquiera de las dos? Es decir, queda a disposición de la comodidad del programador?


Título: Re: C/C++ Dudas parámetros
Publicado por: .:BlackCoder:. en 23 Mayo 2010, 17:02 pm
Creo que no son la misma cosa.. para mi no lo son... Yo se un poco de C++ y pes prefiero usar las referencias... Por que? Bueno para empezar por comodad porq es mejor hacer...

Código
  1. int funcion(int &a, int &b){
  2. return a+b;}

que...
Código
  1. int funcion(int *a, int *b){
  2. return *a+*b;}
:xD
Ademas... eso depende de que quieras hacer con la funcion... recuerda que lo punteros solo deben utilizarse (segun yo  :xD) para memoria dinamica, si no no tendria sentido... para eso estan los arrays y las referencias...

Espero estar en lo correcto, y haberte ayudado...

Saludos...


Título: Re: C/C++ Dudas parámetros
Publicado por: h0oke en 23 Mayo 2010, 17:12 pm
Exacto, yo también lo veo desde el punto de vista: "Comodidad"... En cuanto a la utilización de punteros en memoria dinámica también lo veo correcto. Pero bien, no sé cuál opción de las primeras es la preferible, tal vez haya algún ingeniero en software que quiera dar su opinión.


Título: Re: C/C++ Dudas parámetros
Publicado por: ^Winder^ en 23 Mayo 2010, 17:43 pm
Lo primero son un paso de punteros y lo segundo son un paso de referencias a valores (paso por referencia), no es lo mismo, de hecho se pueden combinar las dos, puedes pasar punteros por referencia, así si por ejemplo creas un puntero a algún objeto y lo pasas por referencia puedes cambiar dentro de la función el objeto al que apunta, si pasaras solo el puntero no podrías :)

No sé si se me entiende.


Título: Re: C/C++ Dudas parámetros
Publicado por: h0oke en 23 Mayo 2010, 17:47 pm
No he podido entender.

En C teóricamente el paso por referencia se hace con punteros, según había entendido, por ejemplo:

Código
  1. void swap(int *a, int *b)
  2. {
  3.      int aux;
  4.      aux = *a;
  5.      *a = *b;
  6.      *b = aux;
  7. }

En C++, creo que sería de la siguiente forma:

Código
  1. void swap(int &a, int &b)
  2. /* Tambien creo que se pueden emular la función con punteros */
  3. /* Esa es mi duda, ¿cuál es la opción correcta? */
  4. {
  5.      int aux;
  6.      aux = a;
  7.      a = b;
  8.      b = aux;
  9. }

Aunque también, sabía que se podían pasar punteros por referencia sin ningún problema.


Título: Re: C/C++ Dudas parámetros
Publicado por: .:BlackCoder:. en 23 Mayo 2010, 17:54 pm
por ejemplo creas un puntero a algún objeto y lo pasas por referencia puedes cambiar dentro de la función el objeto al que apunta, si pasaras solo el puntero no podrías :)

Como que no?... yo puedo modificar con un puntero los objetos apuntados... Asi sea en una funcion... La unica forma de evitarlo es pasandolo constante (con la palabra reservada const) de resto si se puede... Si estoy errado alguien que me lo aclare...

Saludos...


Título: Re: C/C++ Dudas parámetros
Publicado por: h0oke en 23 Mayo 2010, 18:05 pm
Creo que no estás errado, por eso puse el ejemplo citado.


Título: Re: C/C++ Dudas parámetros
Publicado por: .:BlackCoder:. en 23 Mayo 2010, 18:43 pm
A mi no me prestes atencion porque no soy ingeniero en software... :(

 :laugh: ;-)


Título: Re: C/C++ Dudas parámetros
Publicado por: h0oke en 23 Mayo 2010, 18:50 pm
A mi no me prestes atencion porque no soy ingeniero en software... :(

 :laugh: ;-)
:xD y tu crees que a mi me importa? El foro está hecho para compartir opiniones, sean erradas o no... de todas maneras siempre se termina aprendiendo...


Título: Re: C/C++ Dudas parámetros
Publicado por: .:BlackCoder:. en 23 Mayo 2010, 19:03 pm
No se si te importara pero me parecio comico el comentario:
Pero bien, no sé cuál opción de las primeras es la preferible, tal vez haya algún ingeniero en software que quiera dar su opinión.
Debe ser por el fastidio que tengo... Ando haciendole unas diapositivas a una amiga...  :¬¬


Título: Re: C/C++ Dudas parámetros
Publicado por: ^Winder^ en 23 Mayo 2010, 19:31 pm
Os estais liando ;)

Mirad, si pasais un puntero como parámetro eso es un paso por valor del puntero... por tanto, las modificaciones que hagais al objeto dentro de dicha función se reflejarán en el objeto de fuera (por ser el mismo), pero si intentais cambiar el puntero dentro de dicha función solo estareis modificando una copia del puntero.

Encambio, si pasas un puntero por referencia y modificas el puntero dentro de la función, el cambio también se reflejará fuera :)

Buscad sobre 'paso por valor de puntero' y 'paso por referencia del puntero', y lo vereis mas claro ;)

En C como tal no existe el paso por referencia ni los objetos, simplemente, puedes pasar punteros a variables, en C++ sí es posible. De hecho aparte del tipo puntero  * también teneis el tipo referencia & ;)


Título: Re: C/C++ Dudas parámetros
Publicado por: h0oke en 23 Mayo 2010, 19:41 pm
Bueno al fin y al cabo, todo eso es cierto... Pero mi duda era, ¿cuál es la forma correcta de pasar los valores por referencia en C++? Según estuve hablando queda a disposición de uno.


Título: Re: C/C++ Dudas parámetros
Publicado por: .:BlackCoder:. en 23 Mayo 2010, 19:46 pm
Ahhh winder hablaba sobre el puntero... xD yo crei que decias que no se podia modificar el objeto...  >:D No capte, sorry...

Y no me acuerdo bien pero creo que es cierto... No se puede modificar el puntero en la funcion... a menos que lo pases como referencia... pero  eso si no recuerdo como... Si ponen ejemplos mejor jejeje...

Saludos...


Título: Re: C/C++ Dudas parámetros
Publicado por: h0oke en 23 Mayo 2010, 19:58 pm
Todo lo que dijeron es cierto, no estoy en nada desacuerdo... Pero para pasar objetos(en C++) y modificarlos entonces debería pasarlos con &?


Título: Re: C/C++ Dudas parámetros
Publicado por: .:BlackCoder:. en 23 Mayo 2010, 20:14 pm
Depende brother... si es una variable normal... pes si... Pero si son punteros, debes detenerte y pensar que cambios realizaras, si modificaras el puntero (le reservaras memoria, por ejemplo), pasalos por referencia, y si modificaras SOLO el objeto apuntado, no es necesario pasarlo por referencia...

Eso se hace creo que asi:
Código
  1. void funcionx(int *&p);

Y en C es algo con punteros dobles, como no se xD pero por ahi deben haber ejemplos...

Saludos...


Título: Re: C/C++ Dudas parámetros
Publicado por: h0oke en 23 Mayo 2010, 20:24 pm
Exactly... creo que la duda fue respondida, aunque se fue por una rama interesante también.


Título: Re: C/C++ Dudas parámetros
Publicado por: .:BlackCoder:. en 23 Mayo 2010, 20:36 pm
Aunque aun no me he metido con listas, pilas y colas, he visto mas o menos como funcionan... En esos temas te daras cuenta que no te tienes que dar mala vida por lo de pasar punteros por referencia... ya que se asignan las direcciones...

Me explico declaran los objetos globales, retornan direcciones y se las dan al puntero (a la lista por ejemplo), trabajan con objetos (clases) y muchas otras formas de trabajar las direcciones, sin usar lo de "punteros por referencia"...

Weno te lo digo porque yo por ejemplo, nunca he hecho eso que tu dices... Y ya tenia unos 6 o 5 meses estudiando C++... Pero no esta demas saberlo... Lo que dije en el mensaje anterior lo saque de un foro... Pruebalo a ver como te va, y me avisas  :xD por eso uso tanto la palabra "creo"  :laugh:

Si no funciona me pongo a investigar sobre eso...

Pero pes espero que funcione porque hoy no toy de animo para estudiar...

Saludos...


Título: Re: C/C++ Dudas parámetros
Publicado por: Littlehorse en 23 Mayo 2010, 20:58 pm
Usar referencias y punteros depende exclusivamente de lo que quieras hacer. No es algo que dependa del gusto del programador, ya que usar punteros en lugares donde una referencia basta es una mala practica.

Lo primero que hay que tener en cuenta es que una referencia no es un puntero.
Una vez que se asigna una referencia, no puede ser separada del objeto ya que la referencia no tiene entidad propia (a diferencia de un puntero) la referencia es inherente al objeto, es el objeto en si.

En cualquiera de los casos, siempre que uses parámetros no constantes en una función (como un puntero, no-const) estas implícitamente diciendo que dicha función no debe fiarse del valor, incluso, debe controlar que sea valido.

También hay que destacar que es bastante difícil lograr que una referencia sea NULL, por lo tanto siempre que necesites modificar la referencia y controlar si esta no es NULL, un puntero debería ser la mejor opción.

Como consejo -y creo que ningún programador de C++ va a decirte lo contrario- es que uses las referencias cuando puedas y uses los punteros cuando debas.

Saludos!


Título: Re: C/C++ Dudas parámetros
Publicado por: .:BlackCoder:. en 23 Mayo 2010, 21:09 pm
Ahora aclarenme una duda a mi  :P

Cuando asignas memoria a un puntero, en una funcion... ¿Esa memoria al salir de la funcion sigue perteneciendo al puntero?... Si el puntero es pasado como parametro y por referencia... Porque he visto ejemplos en listas, en los que la asignacion de memoria se hace, y el puntero se paso de forma normal... (por valor quise decir) Luego dicho puntero sigue teniendo la memoria asignada...

Saludos...


Título: Re: C/C++ Dudas parámetros
Publicado por: Littlehorse en 23 Mayo 2010, 21:21 pm
Depende, necesito ver un ejemplo para responderte correctamente.

Por como lo expresas, supongo que es un ejemplo sencillo. En dicho caso, el puntero que tenga ámbito local a esa función desaparecerá cuando la función termine, por lo tanto si la dirección no se retorna o lo que estamos trabajando no es una referencia de algún objeto en otro lado, la dirección se pierde.

Pero como ya te dije, hay tantas formas de solventar esa problemática que tal vez una de ellas fue utilizada en el ejemplo que viste. Si queres, pone un ejemplo de la función y su llamada (sin obviar la declaración de los miembros involucrados) y lo vemos mas a fondo.

Saludos!


Título: Re: C/C++ Dudas parámetros
Publicado por: .:BlackCoder:. en 23 Mayo 2010, 21:35 pm
Me invente un ejemplo yo... Observa este code...
Código
  1. oid funcionx(int *e);
  2. int main(int argc, char *argv[])
  3. {
  4.    int *p;
  5.    funcionx(p);
  6.    for (int i=0;i<4;i++) p[i]=i+1;//Aca obviamente se vuelve loco...
  7.  
  8.    for (int i=0;i<4;i++) cout<<p[i]<<" ";
  9.    cout<<endl;
  10.    cin.get();
  11.    return EXIT_SUCCESS;
  12. }
  13.  
  14. void funcionx(int *e){
  15.    e= new int [4];
  16. }

Como solventas eso... Lo de asignar memoria con una funcion...

Saludos...

Que pregunta mas obvia... Y eso que yo mismo conteste... Aca tienes un ejemplo dr.~ donde se aclara todo...

Código
  1. void funcionx(int *&e);
  2. void apuntaa1(int *e);
  3. void apuntaa2(int *&e);
  4. int main(int argc, char *argv[])
  5. {
  6.    int *p;
  7.    funcionx(p);
  8.    for (int i=0;i<10;i++) p[i]=i+1;
  9.  
  10.    for (int i=0;i<10;i++) cout<<p[i]<<" ";
  11.    cout<<endl;
  12.  
  13.    apuntaa1(p);
  14.    cout<<*p<<endl;
  15.    apuntaa2(p);
  16.    cout<<*p<<endl;
  17.    delete[] p;
  18.    cin.get();
  19.    return EXIT_SUCCESS;
  20. }
  21.  
  22. void apuntaa1(int *e){
  23.    e++;
  24. }
  25. void apuntaa2(int *&e){
  26.    e++;
  27. }
  28. void funcionx(int *&e){
  29.    e= new int [10];
  30. }


Título: Re: C/C++ Dudas parámetros
Publicado por: h0oke en 23 Mayo 2010, 21:46 pm
Para asignar memoria con una función, lo solucioné con punteros dobles. Fijate en [C] - Duda estructuras.

Código
  1. void data_reserve(st_p **P){
  2.  (*P) = (st_p *)(malloc(sizeof(st_p)));
  3.  (*P)->name = (char *)(malloc(sizeof(char) * LIMIT));
  4.  (*P)->dir = (char *)(malloc(sizeof(char) * LIMIT));
  5.  (*P)->phone = (char *)(malloc(sizeof(char) * LIMIT));
  6. }

EDIT: Cierto, gracias por tu ejemplo.

Citar
Como consejo -y creo que ningún programador de C++ va a decirte lo contrario- es que uses las referencias cuando puedas y uses los punteros cuando debas.

Gracias littlehorse, tomaré tu consejo.


Título: Re: C/C++ Dudas parámetros
Publicado por: .:BlackCoder:. en 23 Mayo 2010, 21:55 pm
Me gusta mas como lo hize... Ademas eso ya te lo dije yo mismo, es que ando distraido, y no supe plantear la pregunta... Lo que quise decir es como?, cuando se trabaja con listas se asigna memoria (como las funciones push_back) con funciones externas al main... y sin pasar los punteros como referencias... ejemplo:
Voy a poner solo una parte el codigo completo esta en:
http://foro.elhacker.net/empty-t288131.0.html
Código
  1. struct nodo{
  2.    int nro;
  3.    struct nodo *sgte;
  4. };
  5. typedef struct nodo *Tlista;
  6. void insertaralfinal(Tlista &lista,int valor)
  7. {
  8. Tlista t,q;
  9. q=new(struct nodo);
  10. q->nro=valor;
  11. q->sgte=NULL;
  12.  
  13. if(lista==NULL)
  14. lista=q;            //Fijense aca
  15. else
  16. {t=lista;
  17. while(t->sgte!=NULL)
  18. t=t->sgte;
  19. t->sgte=q;}    
  20. }
  21.  
  22.  

Como es que funciona eso?, yo supongo que es porq se hizo un typedef en el que se define Tlista como un puntero y se pasa una referencia:

Código
  1. insertaralfinal(Tlista &lista,
Pero pes no estoy seguro... Asi que si alguien da detalles del funcionamiento interno de ese proceso...


Saludos...


Título: Re: C/C++ Dudas parámetros
Publicado por: Littlehorse en 23 Mayo 2010, 22:53 pm
Es una referencia a puntero. Igualmente no leí el código con atención, los códigos de mapers me hacen doler la cabeza (podrías haber buscado otro ejemplo  ;D)

Saludos!


Título: Re: C/C++ Dudas parámetros
Publicado por: h0oke en 23 Mayo 2010, 23:58 pm
Es una referencia a puntero. Igualmente no leí el código con atención, los códigos de mapers me hacen doler la cabeza (podrías haber buscado otro ejemplo  ;D)

Saludos!

Idem  :xD
Citar
Me gusta mas como lo hize... Ademas eso ya te lo dije yo mismo, es que ando distraido, y no supe plantear la pregunta..
Igualmente, en C no podía utilizar new... y tampoco referenciar un puntero xD


Título: Re: C/C++ Dudas parámetros
Publicado por: ^Winder^ en 24 Mayo 2010, 00:38 am
Yo en C++ suelo usar & para los pasos por referencia, y los * para crear objetos grandes, pero no quiere decir que sea lo mejor :) como dice Little, dependerá de cada programador.



Título: Re: C/C++ Dudas parámetros
Publicado por: Littlehorse en 24 Mayo 2010, 00:43 am
No, no fue eso lo que dije. Precisamente todo lo contrario.

Citar
Usar referencias y punteros depende exclusivamente de lo que quieras hacer. No es algo que dependa del gusto del programador, ya que usar punteros en lugares donde una referencia basta es una mala practica.

Saludos


Título: Re: C/C++ Dudas parámetros
Publicado por: ^Winder^ en 24 Mayo 2010, 00:56 am
La hora aquí es mala, Little  ;-)


Título: Re: C/C++ Dudas parámetros
Publicado por: final_frontier en 24 Mayo 2010, 03:57 am
Hay un par de diferencias bastante gordas con lo que son los pasos por referencia usando el operador * y el operador &

Una función con el & lo que hace es pasar la variable directamente a la hora de llamarla para indicarle a la función que cuando acabe el ámbito de la función que no se nos cargue la variable

Si a una función le pasas un puntero simple, lo que haces es crear por valor una variable que almacena una dirección de memoria (ojo, por VALOR), y qué pasa cuando acaba el ámbito de la función? la variable y su contenido se van a la basura :P

El ejemplo es el siguiente:

Yo tengo var1 de tipo entero y la función a la que paso var1 como parámetro es por puntero simple, lo que hace C++ es crear una variable de tipo puntero (digamosle mipuntero) que señala (que por cierto es de mala educación xD) a var1... cuando acaba la función, se nos elimina aquello a lo que apunta mipuntero, a que apunta? a var1, pues variable a la basura

Y es así como se puede ir a la porra un programa entero :P

¿Lo he explicado bien o he metido el remo como de costumbre? qué malo es programar a las cuatro de la madrugada :xD


Título: Re: C/C++ Dudas parámetros
Publicado por: Littlehorse en 24 Mayo 2010, 04:09 am
La verdad que la docencia definitivamente no es lo tuyo, porque explicando vas mal. Igualmente acepto la excusa de la hora, pero lee el hilo entero antes de postear  ;D. Lo único que se puede sacar en limpio de todo lo que dijiste fue lo de los ámbitos locales de las variables, pero eso ya esta mencionado en post anteriores. Precisamente por esa razón estábamos hablando de este tema. :D

Saludos!


Título: Re: C/C++ Dudas parámetros
Publicado por: h0oke en 24 Mayo 2010, 04:17 am
Creo que el tema debería ser cerrado. Igualmente se agradecen las opiniones.