[Problema - novato] En este caso, ¿referencia, puntero u otra manera? ¿por qué?

Iniciado por EzianGES, 18 Febrero 2014, 13:46 PM

0 Miembros y 1 Visitante están viendo este tema.

EzianGES

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:

#include <iostream>
#include <string>
int main ()
{
    int matriz[10];
    int *ptr = NULL;
    int valor = 4;
    ptr = matriz;
    for (int i=0; i < 10; i++) {
matriz[i] = valor;
std::cout << " DIRECCIÓN: " << ptr;
std::cout << "| VALOR: " << *ptr << std::endl;
ptr++;
valor += 4;
    }
return 0;
}




El programa muestra una salida en terminal como la siguiente:
CitarADRESS: 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.


eferion

1. No escribas en mayúsculas negrita, queda feo.

2. En el siguiente código:

Código (cpp) [Seleccionar]

int valor;
int *ptr_valor;
valor = 4;
ptr_valor = &valor;
puntero = n;
for (int i=0; i < 10; i++) {
n[i] = *ptr_valor;
showMemoryCellInfoTab(puntero);
puntero++;
*ptr_valor += 4;
}


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

Código (cpp) [Seleccionar]

int valor = 4;
puntero = n;
for (int i=0; i < 10; i++) {
n[i] = valor;
showMemoryCellInfoTab(puntero);
puntero++;
valor += 4;
}


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.

EzianGES

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


#include <iostream>
#include <string>
int main ()
{
int matriz[10];
int *ptr = NULL;
int valor = 4;
    ptr = matriz;
    for (int i=0; i < 10; i++) {
matriz[i] = valor;
std::cout << " DIRECCIÓN: " << ptr;
std::cout << "| VALOR: " << *ptr << std::endl;
ptr++;
valor += 4;
    }
return 0;
}


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

eferion

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

Quería decir negrita...

Cita de: EzianGES en 18 Febrero 2014, 15:13 PM
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.

Cita de: EzianGES en 18 Febrero 2014, 15:13 PM
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.

Cita de: EzianGES en 18 Febrero 2014, 15:13 PM
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.

Cita de: EzianGES en 18 Febrero 2014, 15:13 PM
¿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.

EzianGES

Cita de: eferion en 18 Febrero 2014, 15:16 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

eferion

Código (cpp) [Seleccionar]

#include <iostream>
#include <string>
int main ()
{
  int matriz[10];
  int valor = 4;
  for (int i=0; i < 10; i++)
{
    matriz[i] = valor;
    valor += 4;

    std::cout << " DIRECCIÓN: " << &matriz[i];
    std::cout << "| VALOR: " << matriz[i] << std::endl;
  }
return 0;}

EzianGES

Cita de: eferion en 18 Febrero 2014, 15:24 PM
Código (cpp) [Seleccionar]

#include <iostream>
#include <string>
int main ()
{
 int matriz[10];
 int valor = 4;
 for (int i=0; i < 10; i++)
{
   matriz[i] = valor;
   valor += 4;

   std::cout << " DIRECCIÓN: " << &matriz[i];
   std::cout << "| VALOR: " << matriz[i] << std::endl;
 }
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.

eferion

Hay muchas formas de programar absolutamente lo mismo... la forma de pensar de cada uno es un mundo.

EzianGES

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

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

eferion

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.