Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Duda con Punteros.

Estas en el tema de Duda con Punteros. en el foro de C/C++ en Foros del Web. Bueno, acabo de registrarme en el foro recomendado por un amigo. mi problema es el siguiente: Estoy aprendiendo punteros, y todavia tengo cierta confusion acerca ...
  #1 (permalink)  
Antiguo 12/07/2011, 20:46
Avatar de sbcl  
Fecha de Ingreso: julio-2011
Mensajes: 29
Antigüedad: 12 años, 9 meses
Puntos: 5
Duda con Punteros.

Bueno, acabo de registrarme en el foro recomendado por un amigo.
mi problema es el siguiente:
Estoy aprendiendo punteros, y todavia tengo cierta confusion acerca de cuando tengo que pasar punteros , o valores en si, etc.

Number_array es una funcion que se le pasa un array (por referencia) unidimensional de una x longitud, y se lo numera.
Por ejemplo

int a [2];
number_array (a);
a[0] = 0
a[1] = 1
a[2] = 2


Para establecer el limite del for, uso iUbound (para los que usen vb, tiene la misma funcion del ubound, pero solo con ints)
su objeto es devolver el limite superior de un array de Ints (el cual tiene como parámetro).

Esto sencillamente tendria que escribir via Cout, 0 1 2. (que serian las 3 posiciones de a)
Pero me escribe 0 *numero enorme* *numero enorme* , los cuales supongo que seran los valores con los que se inicializa el array.

El problema de esto, es que el iUbound no funciona, el sizeof(arr) me devuelve 4(Que es la longitud del puntero), cuando deberia darme 12.

Y mi duda es, como tengo que pasar ese array, que en vez de que me lo tome como puntero, me lo tome como el array entero.

Si algo no se entendio, por favor pregunten, soy medio burro para explicar asi que si no de a entender algo pregunten y contesto ^^

Codigo:

Código:
int i_ubound (int arr[])
{
  return (sizeof(arr) / sizeof(int)) - 1;  
}

void number_array(int arr[])
{
   int limit,x;
   int* p = arr;
   limit = i_ubound(arr);
   for (x = 0;x <= limit;x++)
   {
       *p = x;
       p++;
   }    
}

int main()
{
   int a[3];
   number_array(a);
   cout  << a[0] << "   " << a[1] << "    " << a[2];
   wait(5);   
}
Muchas gracias!

Última edición por sbcl; 12/07/2011 a las 21:07
  #2 (permalink)  
Antiguo 12/07/2011, 22:09
Avatar de CapacProg  
Fecha de Ingreso: marzo-2010
Ubicación: Lima - Perú
Mensajes: 324
Antigüedad: 14 años
Puntos: 71
Respuesta: Duda con Punteros.

Reformula tu algoritmo con tal que no calcules el tamaño de tu vector ya que eso si esta verde, lo que hago es pasar como parámetro esa longitud a la función que la necesite, que ya debes saber su valor al finalizar la lectura de datos (usa una variable contadora).

Rereferente a tu implementación, veo muchos errores, en el manejo de punteros.
__________________
%
El mejor guerrero no es el que triunfa siempre sino el que vuelve sin miedo a la batalla.
%
  #3 (permalink)  
Antiguo 13/07/2011, 08:13
Avatar de sbcl  
Fecha de Ingreso: julio-2011
Mensajes: 29
Antigüedad: 12 años, 9 meses
Puntos: 5
Respuesta: Duda con Punteros.

Es que mi idea es no necesitar de pasar la longitud del vector como parámetro.
El objetivo de esto es tener el Ubound.
  #4 (permalink)  
Antiguo 13/07/2011, 08:43
Avatar de CapacProg  
Fecha de Ingreso: marzo-2010
Ubicación: Lima - Perú
Mensajes: 324
Antigüedad: 14 años
Puntos: 71
Sonrisa Respuesta: Duda con Punteros.

En ese caso intenta esto

Código C++:
Ver original
  1. #define length(x) (sizeof(x)/sizeof(x[0]))
  2. int main() {
  3.  
  4.     int v[10];
  5.     cout<<length(v)<<endl;
  6.     system("PAUSE");
  7.     return 0;
  8. }
La observación que hago es que esto funciona siempre y cuando el arreglo no sea creado dinámicamente, sobre todo por el sizeof.
__________________
%
El mejor guerrero no es el que triunfa siempre sino el que vuelve sin miedo a la batalla.
%
  #5 (permalink)  
Antiguo 13/07/2011, 10:45
Avatar de sbcl  
Fecha de Ingreso: julio-2011
Mensajes: 29
Antigüedad: 12 años, 9 meses
Puntos: 5
Respuesta: Duda con Punteros.

Muchas gracias, por ahora me viene barbaro!
Si necesito algo mas pregunto, muchas gracias por la pronta respuesta! :)
  #6 (permalink)  
Antiguo 13/07/2011, 11:09
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Duda con Punteros.

El problema que tienes es el siguiente. sizeof es una funcion en tiempo de compilacion. Se calcula antes de compilar el programa.
Por eso el compilador en la funcion ubound sizeof(arr) devuelve 4. Ya que en ese ambito el array es simplemente un puntero.
En cambio en la funcion main cuando declaras un array asi a[4]; ahi se asigna memoria y el nombre a es solo ficticio. No existe en memoria el puntero, solo los datos. De esta forma el compilador calcula 12 para su longitud.

Espero que entiendas la explicacion y veas los limites del uso del sizeof. Saludos
  #7 (permalink)  
Antiguo 13/07/2011, 20:07
Avatar de sbcl  
Fecha de Ingreso: julio-2011
Mensajes: 29
Antigüedad: 12 años, 9 meses
Puntos: 5
Respuesta: Duda con Punteros.

Muchas gracias por la respuesta Sam90, si, Soy nuevo en c++, y tengo muy poco en claro estos temas, de memoria, cuando se ejecutan distintas funciones, etc.
Bueno mi duda fue solucionada, pueden cerrar el thread si quieren.
Muchas gracias!

Etiquetas: funcion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:43.