C/C++ Dudas parámetros

Iniciado por h0oke, 23 Mayo 2010, 16:00 PM

0 Miembros y 2 Visitantes están viendo este tema.

.:BlackCoder:.

#20
Me invente un ejemplo yo... Observa este code...
Código (cpp) [Seleccionar]
oid funcionx(int *e);
int main(int argc, char *argv[])
{
   int *p;
   funcionx(p);
   for (int i=0;i<4;i++) p[i]=i+1;//Aca obviamente se vuelve loco...
   
   for (int i=0;i<4;i++) cout<<p[i]<<" ";
   cout<<endl;
   cin.get();
   return EXIT_SUCCESS;
}

void funcionx(int *e){
   e= new int [4];
}


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 (cpp) [Seleccionar]
void funcionx(int *&e);
void apuntaa1(int *e);
void apuntaa2(int *&e);
int main(int argc, char *argv[])
{
    int *p;
    funcionx(p);
    for (int i=0;i<10;i++) p[i]=i+1;
   
    for (int i=0;i<10;i++) cout<<p[i]<<" ";
    cout<<endl;
   
    apuntaa1(p);
    cout<<*p<<endl;
    apuntaa2(p);
    cout<<*p<<endl;
    delete[] p;
    cin.get();
    return EXIT_SUCCESS;
}

void apuntaa1(int *e){
    e++;
}
void apuntaa2(int *&e){
    e++;
}
void funcionx(int *&e){
    e= new int [10];
}
"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja




h0oke

#21
Para asignar memoria con una función, lo solucioné con punteros dobles. Fijate en [C] - Duda estructuras.

void data_reserve(st_p **P){
 (*P) = (st_p *)(malloc(sizeof(st_p)));
 (*P)->name = (char *)(malloc(sizeof(char) * LIMIT));
 (*P)->dir = (char *)(malloc(sizeof(char) * LIMIT));
 (*P)->phone = (char *)(malloc(sizeof(char) * LIMIT));
}


EDIT: Cierto, gracias por tu ejemplo.

CitarComo 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.

.:BlackCoder:.

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 (cpp) [Seleccionar]
struct nodo{
    int nro;
    struct nodo *sgte;
};
typedef struct nodo *Tlista;
void insertaralfinal(Tlista &lista,int valor)
{
Tlista t,q;
q=new(struct nodo);
q->nro=valor;
q->sgte=NULL;

if(lista==NULL)
lista=q;            //Fijense aca
else
{t=lista;
while(t->sgte!=NULL)
t=t->sgte;
t->sgte=q;}     
}



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 (cpp) [Seleccionar]
insertaralfinal(Tlista &lista,
Pero pes no estoy seguro... Asi que si alguien da detalles del funcionamiento interno de ese proceso...


Saludos...
"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja




Littlehorse

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!
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

h0oke

Cita de: 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!

Idem  :xD
CitarMe 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

^Winder^

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.


Yo apoyo la esperanza de Caylees. Frenemos la Leucemia:
www.cayleeshope.com
Libertad conquistada.  (Justicia ;-))

Littlehorse

No, no fue eso lo que dije. Precisamente todo lo contrario.

CitarUsar 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
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

^Winder^

La hora aquí es mala, Little  ;-)

Yo apoyo la esperanza de Caylees. Frenemos la Leucemia:
www.cayleeshope.com
Libertad conquistada.  (Justicia ;-))

final_frontier

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
Sie ist der hellste Stern von allen und wird nie vom Himmel fallen...

Littlehorse

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!
An expert is a man who has made all the mistakes which can be made, in a very narrow field.