Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: EzianGES en 18 Febrero 2014, 13:46 pm



Título: [Problema - novato] En este caso, ¿referencia, puntero u otra manera? ¿por qué?
Publicado por: EzianGES en 18 Febrero 2014, 13:46 pm
Muy buenas tardes gente... ¿cómo les va? Estoy con una pequeña duda... hace unos días retomé programación, y agarré C++ -aunque por problemas eléctricos estuve sin pc algunos días-. Estoy recién comenzando con punteros, referencias, estructuras, etc y estoy probando pequeños programas para ir entendiendo el funcionamiento.

Pues bien, estuve haciendo un pequeño programa en donde se agrega mediante un bucle for valores de 4 en 4 a cada elemento. Es decir, array[0] = 4, array[1] = 8, etc.
Para esto, y a fines de practicar, lo hice utilizando punteros de la siguiente manera:

EDIT:
Código
  1. #include <iostream>
  2. #include <string>
  3. int main ()
  4. {
  5.    int matriz[10];
  6.    int *ptr = NULL;
  7.    int valor = 4;
  8.    ptr = matriz;
  9.    for (int i=0; i < 10; i++) {
  10. matriz[i] = valor;
  11. std::cout << " DIRECCIÓN: " << ptr;
  12. std::cout << "| VALOR: " << *ptr << std::endl;
  13. ptr++;
  14. valor += 4;
  15.    }
  16. return 0;
  17. }
  18.  
  19.  
  20.  

El programa muestra una salida en terminal como la siguiente:
Citar
ADRESS: 0x601180| VALUE: 4
 ADRESS: 0x601184| VALUE: 8
 ADRESS: 0x601188| VALUE: 12
 ADRESS: 0x60118c| VALUE: 16
 ADRESS: 0x601190| VALUE: 20
 ADRESS: 0x601194| VALUE: 24
 ADRESS: 0x601198| VALUE: 28
 ADRESS: 0x60119c| VALUE: 32
 ADRESS: 0x6011a0| VALUE: 36
 ADRESS: 0x6011a4| VALUE: 40

Funciona correctamente peeeeero....

Mis dudas son:
1 ) ¿Existe otra alternativa sin usar punteros?
2 ) De ser así, ¿cuál sería la ideal para ustedes?
3 ) En la línea 29 utilizo puntero++ con el fin de avanzar a la siguiente dirección, funciona, pero está bien pensado o funciona de pedo? jaja
4 ) De estar bien el código, ¿alguna sugerencia para este noob? xD Además de los comentarios que los quité :P

Gracias de antemano y les mando un abrazo.



Título: Re: [Problema - novato] En este caso, ¿referencia, puntero u otra manera? ¿por qué?
Publicado por: eferion en 18 Febrero 2014, 14:54 pm
1. No escribas en mayúsculas negrita, queda feo.

2. En el siguiente código:

Código
  1. int valor;
  2. int *ptr_valor;
  3. valor = 4;
  4. ptr_valor = &valor;
  5. puntero = n;
  6. for (int i=0; i < 10; i++) {
  7. n[i] = *ptr_valor;
  8. showMemoryCellInfoTab(puntero);
  9. puntero++;
  10. *ptr_valor += 4;
  11. }

No entiendo el uso de ptr_valor... de hecho podrías hasta eliminar esa variable:

Código
  1. int valor = 4;
  2. puntero = n;
  3. for (int i=0; i < 10; i++) {
  4. n[i] = valor;
  5. showMemoryCellInfoTab(puntero);
  6. puntero++;
  7. valor += 4;
  8. }

3. Deberías evitar el uso de variables globales. Tal vez sería conveniente crear una clase para gestionar las funciones MemoryCell

4. "n" no dice nada para el nombre de un vector, deberías poner nombres más claros.

5. Queda raro eso de mezclar en tu propio código nombres en español e inglés.

6.  La forma de acceder a "n" en GetMemoryCellInfo y showMemoryCellInfoTab son extraños.


Título: Re: [Problema - novato] En este caso, ¿referencia, puntero u otra manera? ¿por qué?
Publicado por: EzianGES en 18 Febrero 2014, 15:13 pm
1 ) Mayúsculas te referís con poner en mayúsculas las iniciales? Generalmente uso mi_funcion, y en nombres de clases uso mayúsculas para iniciales jaja. Me di un capricho :P

2) Es porque estoy experimentando y quería ver alguna noobeada.

3) No llegué a POO en C++, no conozco la sintáxis :P Usé estructuras para comprenderlas mejor, al principio no me funcionó, hasta que entendí un poco (?)

4) Si, cuando programo algo mas sólido uso identificadores descriptivos, pero al ser una prueba sencilla me resulta mas rápido tipear "n", no voy a reutilizar código de esto, aunque debería respetar un poco mas que ahora vengo a pedir ayuda y lo tienen que leer, así que disculpá D:

5) Si, nunca mezclo, pero me estaba tirando errores, y fuí buscando la solución. Una cosa la escribí ayer a la noche (en inglés) y hoy probé, y metí cosas en español jaja

6) ¿A qué te referís con "extraño"?


Gracias por la respuesta rápida vieja, te agradezco mucho!

EDIT:
Acá el código como corresponde, disculpá haber sido tan desconsiderado jaja

Código
  1. #include <iostream>
  2. #include <string>
  3. int main ()
  4. {
  5. int matriz[10];
  6. int *ptr = NULL;
  7. int valor = 4;
  8.    ptr = matriz;
  9.    for (int i=0; i < 10; i++) {
  10. matriz[i] = valor;
  11. std::cout << " DIRECCIÓN: " << ptr;
  12. std::cout << "| VALOR: " << *ptr << std::endl;
  13. ptr++;
  14. valor += 4;
  15.    }
  16. return 0;
  17. }
  18.  

¿Los punteros están bien utilizados? Es decir, ¿vos usarías punteros en esta situación?


Título: Re: [Problema - novato] En este caso, ¿referencia, puntero u otra manera? ¿por qué?
Publicado por: eferion en 18 Febrero 2014, 15:16 pm
1 ) Mayúsculas te referís con poner en mayúsculas las iniciales? Generalmente uso mi_funcion, y en nombres de clases uso mayúsculas para iniciales jaja. Me di un capricho :P

Quería decir negrita...

2) Es porque estoy experimentando y quería ver alguna noobeada.

Para eso intenta cogerte algún manual, te propondrá prácticas con cierto sentido y orden.

3) No llegué a POO en C++, no conozco la sintáxis :P Usé estructuras para comprenderlas mejor, al principio no me funcionó, hasta que entendí un poco (?)

En serio, busca manuales en internet, es la mejor forma de aprender.

6) ¿A qué te referís con "extraño"?

Lo suyo sería pasar el vector directamente en vez de almacenar la posición en memoria en un puntero y luego trastear con el puntero a discrección... que sí, que funciona, pero no es desde luego un mecanismo ni elegante ni seguro ni sencillo de mantener.

¿Los punteros están bien utilizados? Es decir, ¿vos usarías punteros en esta situación?

Como bien dices se trata de practicar, pero a este ejercicio no le veo demasiado sentido, busca un manual y haz las prácticas que te propone... si quieres entonces pásame tu versión y te comento cómo lo habría hecho yo.


Título: Re: [Problema - novato] En este caso, ¿referencia, puntero u otra manera? ¿por qué?
Publicado por: EzianGES en 18 Febrero 2014, 15:19 pm
Quería decir negrita...

Lo suyo sería pasar el vector directamente en vez de almacenar la posición en memoria en un puntero y luego trastear con el puntero a discrección... que sí, que funciona, pero no es desde luego un mecanismo ni elegante ni seguro ni sencillo de mantener.


¿A qué te estarías refiriendo con "trastear con el puntero a discreción"?
Si, ahí edité el código, mas limpio, como corresponde :P También agregué una pregunta:
¿Los punteros están bien utilizados? Es decir, ¿vos usarías punteros en esta situación?


2) Estoy leyendo "Jumping into C++" y complementando con material extra que vaya googleando o foreando.
Respecto a POO, conozco los conceptos, (usé Python), pero quiero ponerme mas al tanto con estos temas de punteros y similares antes de pasar a POO.
También algunos videotutoriales jeje

Los punteros los utilicé porque en la tabla quería mostrar dirección y valor contenido... y hasta donde se solo lo puedo hacer mediante punteros :P

Estoy haciendo las prácticas de todas formas, pero a veces me surgen dudas puntuales sobre algo y empiezo a barrenar jaja


Título: Re: [Problema - novato] En este caso, ¿referencia, puntero u otra manera? ¿por qué?
Publicado por: eferion en 18 Febrero 2014, 15:24 pm
Código
  1. #include <iostream>
  2. #include <string>
  3. int main ()
  4. {
  5.  int matriz[10];
  6.  int valor = 4;
  7.  for (int i=0; i < 10; i++)
  8. {
  9.    matriz[i] = valor;
  10.    valor += 4;
  11.  
  12.    std::cout << " DIRECCIÓN: " << &matriz[i];
  13.    std::cout << "| VALOR: " << matriz[i] << std::endl;
  14.  }
  15. return 0;}


Título: Re: [Problema - novato] En este caso, ¿referencia, puntero u otra manera? ¿por qué?
Publicado por: EzianGES en 18 Febrero 2014, 15:27 pm
Código
  1. #include <iostream>
  2. #include <string>
  3. int main ()
  4. {
  5.  int matriz[10];
  6.  int valor = 4;
  7.  for (int i=0; i < 10; i++)
  8. {
  9.    matriz[i] = valor;
  10.    valor += 4;
  11.  
  12.    std::cout << " DIRECCIÓN: " << &matriz[i];
  13.    std::cout << "| VALOR: " << matriz[i] << std::endl;
  14.  }
  15. return 0;}

Nah, mirá soy un neófito. Si bien quise experimentar con punteros, no se me había ocurrido esa manera.
man, muchísimas gracias por las correcciones.


Título: Re: [Problema - novato] En este caso, ¿referencia, puntero u otra manera? ¿por qué?
Publicado por: eferion en 18 Febrero 2014, 15:30 pm
Hay muchas formas de programar absolutamente lo mismo... la forma de pensar de cada uno es un mundo.


Título: Re: [Problema - novato] En este caso, ¿referencia, puntero u otra manera? ¿por qué?
Publicado por: EzianGES en 18 Febrero 2014, 15:32 pm
Hay muchas formas de programar absolutamente lo mismo... la forma de pensar de cada uno es un mundo.

Si, el problema es que a veces pienso que mi forma de pensar es un tanto retardada para programar... no sé a cuántos programadores les pasa cosas como las de recién jaja


Título: Re: [Problema - novato] En este caso, ¿referencia, puntero u otra manera? ¿por qué?
Publicado por: eferion en 18 Febrero 2014, 15:35 pm
Cuando uno decide que quiere dedicarse... no se, a pintar por ejemplo, su primera obra no acaba pareciéndose en nada a un Goya... sus primeros pasos serán torpes y su estilo lo irá encontrando por el camino a base de perfeccionar su técnica.

Nadie nace sabiendo...ni tu ni yo ni nadie... por qué te iban a salir los programas a la primera?? Da gracias de que no es así, de otra forma no aprenderías absolutamente nada.

Aprender a programar es como todo, práctica, paciencia e invertir tiempo.



Título: Re: [Problema - novato] En este caso, ¿referencia, puntero u otra manera? ¿por qué?
Publicado por: EzianGES en 18 Febrero 2014, 15:54 pm
Lo sé, lo sé. Pero es que a veces veo errores que cometo que me parecen ya demasiado tontos como para cometerlos. Tontería mía D:

Ahora voy a seguir resolviendo algunos ejercicios del libro n.n