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

El "sizeof" para saber el tamaño del arreglo no me funciona

Estas en el tema de El "sizeof" para saber el tamaño del arreglo no me funciona en el foro de C/C++ en Foros del Web. Código: int liContador, laiArreglo[] = {5,8,2,3,1,4,6,9,2,10}; printf("\nCONJUNTO: "); for (liContador = 0; liContador < sizeof (laiArreglo) / sizeof (int); liContador++) { printf("%d ", laiArreglo[liContador]); } ...
  #1 (permalink)  
Antiguo 03/04/2015, 23:05
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 4 meses
Puntos: 5
Pregunta El "sizeof" para saber el tamaño del arreglo no me funciona

Código:
int liContador, laiArreglo[] = {5,8,2,3,1,4,6,9,2,10};

    printf("\nCONJUNTO: ");

    for (liContador = 0; liContador < sizeof (laiArreglo) / sizeof (int); liContador++)
    {
        printf("%d ", laiArreglo[liContador]);
    }
Con ese código solamente me muestra el 5.

Anteriormente tenía laiArreglo[10] y me funcionaba correctamente. Al hacer esto laiArreglo[] = {5,8,2,3,1,4,6,9,2,10}, ya me dejo de funcionar. El FOR solo llega hasta 1 y no hasta 10.

Por qué?.
  #2 (permalink)  
Antiguo 04/04/2015, 00:59
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: El "sizeof" para saber el tamaño del arreglo no me funciona

A mi si me imprime todos

Código C:
Ver original
  1. #include<stdio.h>
  2.  
  3. int main() {
  4.  
  5. int liContador, laiArreglo[] = {5,8,2,3,1,4,6,9,2,10};
  6.  
  7.     printf("\nCONJUNTO: ");
  8.  
  9.     for (liContador = 0; liContador < sizeof (laiArreglo) / sizeof (int); liContador++)
  10.     {
  11.         printf("%d ", laiArreglo[liContador]);
  12.     }
  13.     return 0;
  14. }
  #3 (permalink)  
Antiguo 04/04/2015, 01:40
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: El "sizeof" para saber el tamaño del arreglo no me funciona

Tampoco no le veo nada malo :S
  #4 (permalink)  
Antiguo 04/04/2015, 04:37
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: El "sizeof" para saber el tamaño del arreglo no me funciona

Hola RGT.

Así, tál como lo mostras, no concibo que no te funcione. Pero si no me equivoco, estas haciendo algo como esto:
Código C:
Ver original
  1. ...
  2. void mostrar ( int *v ) {
  3.   int i;
  4.   for ( i = 0; i < sizeof(v) / sizeof(int); i++ )
  5.     printf ( "%d ", v[i] );
  6. }
  7.  
  8. int main ( ) {
  9.   int v[10] = {5, 8, 2, 3, 1, 4, 6, 9, 2, 10};
  10.   mostrar ( v );
  11.   ...
de ese modo sí que entiendo el comportamiento que comentas... Por que,
Código:
sizeof ( v ) = 4 y sizeof ( int ) = 4

entonces:
sizeof ( v ) / sizeof ( int ) = 1

por lo que:
for ( i = 0; i < 1 ; i++) -> i = 0
de ese modo, sólo se muestra el valor de v[0] que es 5.

Deberías hacer algo similar a esto:
Código C:
Ver original
  1. ...
  2. void mostrar ( int* v, int sz ) {
  3.   int i;
  4.   for ( i = 0; i < sz; i++ )
  5.     printf ( "%d ", v[i] );
  6. }
  7.  
  8. int main ( ) {
  9.   int v[10] = {5,8,2,3,1,4,6,9,2,10};
  10.   mostrar ( v, sizeof(v) / sizeof(int) );

Saludos.
  #5 (permalink)  
Antiguo 04/04/2015, 07:45
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 4 meses
Puntos: 5
Respuesta: El "sizeof" para saber el tamaño del arreglo no me funciona

Hola,
Realmente tengo esto:

Código:
int liOpcionMenu, laiArreglo[] = {5,8,2,3,1,4,6,9,2,10}, liElemento;

printf("\nIngrese el elemento: ");
            scanf("%d", &liElemento);
            EliminarElemento(liElemento, laiArreglo);   //Llamamos a la función
            MostrarConjunto(laiArreglo);                //Mostramos el arreglo





void MostrarConjunto(int laiArreglo[])
{
    int liContador;

    printf("\nCONJUNTO: ");

    for (liContador = 0; liContador < sizeof (laiArreglo) / sizeof (int); liContador++)
    {
        printf("%d ", laiArreglo[liContador]);
    }
}
el sizeof no funciona dentro de funciones, eso es?.
  #6 (permalink)  
Antiguo 04/04/2015, 08:12
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: El "sizeof" para saber el tamaño del arreglo no me funciona

Cuando pasas un array como parámetro, en realidad estás pasando un puntero al primer elemento del array.

Por eso, el ejemplo que te ha puesto ecfisa es igual a lo que tú tienes, y por tanto el comportamiento es el mismo y la explicación de ecfisa es la correcta.

Mira aquí:
http://c.conclase.net/curso/index.ph...UN2_ArrayParam
__________________
Mi calculadora en Qt
  #7 (permalink)  
Antiguo 04/04/2015, 08:22
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 4 meses
Puntos: 5
Respuesta: El "sizeof" para saber el tamaño del arreglo no me funciona

Ya lo leí y ahora entendi mejor pero,
No entendi el ejemplo de ella, que fue lo que hizo?..
  #8 (permalink)  
Antiguo 04/04/2015, 08:45
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: El "sizeof" para saber el tamaño del arreglo no me funciona

Cita:
Iniciado por RGT Ver Mensaje
Ya lo leí y ahora entendi mejor pero,
No entendi el ejemplo de ella, que fue lo que hizo?..
En el enlace que te he puesto queda explicado.

Bueno, al entender que el pasar un array como parámetro es equivalente a pasar un puntero al primer elemento del array, ecfisa ha supuesto que estabas haciendo esto último (que en todo caso es realmente lo mismo).

Y como esa dirección de memoria no te da información del tamaño total del array, lo suyo es que estas funciones se usen con dos parámetros, uno el propio array (o puntero al primer elemento) y otro el tamaño del array, puesto que una vez dentro de la función no se podrá averiguar.

Edito:

Sin embargo, si defines el array con su tamaño en la función si podrás saber dicho tamaño dentro de la función, pero la función será poco operativa (solo valdrá para arrays con el tamaño indicado por la función).

Te pongo un ejemplo de tres formas de enfocar la función:
1.- Pasando como parámetro a la función un array con tamaño definido (sencillo pero poco funcional)
2.- Pasando como parámetro a la función un array sin tamaño predefinido y un valor que indique el tamaño del array.
3.- Pasando como parámetro un puntero y el tamaño del array.
Código C++:
Ver original
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. void mostrar (int array[], int tam);
  6. void mostrar2 (int array[5]);
  7. void mostrar3 (int* punt, int tam);
  8.  
  9. int main()
  10. {
  11.  
  12.     int v[]={10,20,30,40,50};
  13.  
  14.     mostrar (v, sizeof(v)/sizeof(int));
  15.     mostrar2(v);
  16.     mostrar3(v,sizeof(v)/sizeof(int));
  17.  
  18.     return 0;
  19. }
  20.  
  21. void mostrar (int array[], int tam)
  22. {
  23.     for (int i=0;i<tam;i++)
  24.     {
  25.         cout<<array[i]<<"-";
  26.     }
  27.     cout<<endl;
  28. }
  29.  
  30. void mostrar2 (int array[5])
  31. {
  32.     for (int i=0;i<=sizeof(array[5]);i++)
  33.     {
  34.         cout<<array[i]<<"-";
  35.     }
  36.     cout<<endl;
  37. }
  38.  
  39. void mostrar3 (int* punt, int tam)
  40. {
  41.     for (int i=0;i<tam;i++)
  42.     {
  43.         cout<<*(punt+i)<<"-";
  44.     }
  45.     cout<<endl;
  46. }

Espero que esto te ayude
__________________
Mi calculadora en Qt

Última edición por dehm; 04/04/2015 a las 08:58
  #9 (permalink)  
Antiguo 04/04/2015, 09:22
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 4 meses
Puntos: 5
Respuesta: El "sizeof" para saber el tamaño del arreglo no me funciona

ok, a ver si entendí.

Tenemos esto:
mostrar ( Arreglo, sizeof(Arreglo) / sizeof(int) );

void mostrar (int Arreglo, int TamanoArreglo)
{
............
}

Estaremos pasando:
El arreglo obvio y de segundo el tamaño del arreglo (ejemplo: 10) para de esa forma no tener que buscar el tamaño dentro de la función.
Correcto?.
(Excusame, aprendo lento y me gusta aprender correctamente toda la logica.)

Respecto a los ejemplos que me diste:

1.- Pasando como parámetro a la función un array con tamaño definido (sencillo pero poco funcional)
Me gusto, es la más fácil creo. No es recomendable que use esta entonces?.

2.- Pasando como parámetro a la función un array sin tamaño predefinido y un valor que indique el tamaño del array.
Esto funciona para cualquier manera que inicialize el arreglo?.

Ejemplo:
Arreglo[6]
Arreglo[] = {1,2,5,6,4,1}

void mostrar2 (int array[6]) //Considero esto poco funcional ya que tendría que cambiar el valor adentro de los [] cada vez que quiera un arreglo de tamaño diferente.

3.- Pasando como parámetro un puntero y el tamaño del array.

Para qué sirve el *?, no sé usar punteros todavía.
:(


Gracias por toda tu explicacion hermano, me ayudas muchisimo, espero que no te moleste...
  #10 (permalink)  
Antiguo 04/04/2015, 09:33
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: El "sizeof" para saber el tamaño del arreglo no me funciona

Hola RGT.

La explicación y ejemplos que te ha puesto dehm han sido mas que claros, solo agregar que un modo que la función reciba la información necesaria en un solo parámetro puede ser:
Código C++:
Ver original
  1. #include <stdio.h>
  2.  
  3. typedef struct {
  4.   int *sv;
  5.   int sz;
  6. } stArray;
  7.  
  8. void mostrar (stArray v) {
  9.   int i;
  10.   for ( i = 0; i < v.sz; i++ )
  11.     printf ( "%d ", v.sv[i] );
  12. }
  13.  
  14. int main() {
  15.   int vv[10] = {5, 8, 2, 3, 1, 4, 6, 9, 2, 10};
  16.   stArray stv;
  17.  
  18.   stv.sv = vv;
  19.   stv.sz = sizeof(vv) / sizeof(vv[0]);
  20.   mostrar(stv);
  21.   ...
pero en definitiva los datos enviados siguen siendo dos...

Cita:
Para qué sirve el *?, no sé usar punteros todavía.
En este enlace vas a encontrar un buen tratamiento sobre el tema.

Saludos.
  #11 (permalink)  
Antiguo 04/04/2015, 09:49
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 4 meses
Puntos: 5
Respuesta: El "sizeof" para saber el tamaño del arreglo no me funciona

Cita:
Iniciado por ecfisa Ver Mensaje
Hola RGT.

La explicación y ejemplos que te ha puesto dehm han sido mas que claros, solo agregar que un modo que la función reciba la información necesaria en un solo parámetro puede ser:
Código C++:
Ver original
  1. #include <stdio.h>
  2.  
  3. typedef struct {
  4.   int *sv;
  5.   int sz;
  6. } stArray;
  7.  
  8. void mostrar (stArray v) {
  9.   int i;
  10.   for ( i = 0; i < v.sz; i++ )
  11.     printf ( "%d ", v.sv[i] );
  12. }
  13.  
  14. int main() {
  15.   int vv[10] = {5, 8, 2, 3, 1, 4, 6, 9, 2, 10};
  16.   stArray stv;
  17.  
  18.   stv.sv = vv;
  19.   stv.sz = sizeof(vv) / sizeof(vv[0]);
  20.   mostrar(stv);
  21.   ...
pero en definitiva los datos enviados siguen siendo dos...


En este enlace vas a encontrar un buen tratamiento sobre el tema.

Saludos.
Hola,
no entiendo bien tus ejemplos :(
usas diferentes variables y cosas raras ej:
stv.sz
sv
sz
starray v
v.sz
v.sv

me estoy volviendo loco tratando de entender ahahahhaa
  #12 (permalink)  
Antiguo 04/04/2015, 10:03
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: El "sizeof" para saber el tamaño del arreglo no me funciona

Bueno, si no has empezado a ver punteros y estructuras, mejor olvida esa parte.
Simplemente quédate con la idea:

Al pasar un array como parámetro de una función, sólo se pasa la dirección del primer elemento del array. Con esa información, la función no tiene forma de saber el tamaño del array, por lo que le debes de suministrar ese dato de forma expresa como otro parámetro.
__________________
Mi calculadora en Qt
  #13 (permalink)  
Antiguo 04/04/2015, 10:06
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 4 meses
Puntos: 5
Respuesta: El "sizeof" para saber el tamaño del arreglo no me funciona

Cita:
Iniciado por dehm Ver Mensaje
Bueno, si no has empezado a ver punteros y estructuras, mejor olvida esa parte.
Simplemente quédate con la idea:

Al pasar un array como parámetro de una función, sólo se pasa la dirección del primer elemento del array. Con esa información, la función no tiene forma de saber el tamaño del array, por lo que le debes de suministrar ese dato de forma expresa como otro parámetro.
Hola,

Ejemplo:
Código:
int Arreglo[] = {2,5,4,8,2};

mostrar ( Arreglo, sizeof(Arreglo) / sizeof(int) );

void mostrar (int Arreglo[], int TamanoArreglo)
{
............
}
entonces TamanoArreglo sería igual a 5, cierto?. esta es la idea?, puedo usarlo de esta forma?.
  #14 (permalink)  
Antiguo 04/04/2015, 10:31
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: El "sizeof" para saber el tamaño del arreglo no me funciona

Eso es!
__________________
Mi calculadora en Qt
  #15 (permalink)  
Antiguo 04/04/2015, 10:50
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 11 años, 9 meses
Puntos: 22
Respuesta: El "sizeof" para saber el tamaño del arreglo no me funciona

Cita:
no entiendo bien tus ejemplos :(
usas diferentes variables y cosas raras ej:
stv.sz
sv
...
me estoy volviendo loco tratando de entender ahahahha
Te pido disculpas, soy medio haragán para escribir.

Espero que quede mas entendible de este modo:
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. typedef struct {
  4.   int *array;  // arreglo
  5.   int size;    // tamaño
  6. } stArray;
  7.  
  8. void mostrar (stArray sa) {
  9.   int i;
  10.   for ( i = 0; i < sa.size; i++ )
  11.     printf ( "%d ", sa.array[i] );
  12. }
  13.  
  14. int main() {
  15.   int array10[10] = {5, 8, 2, 3, 1, 4, 6, 9, 2, 10};
  16.   stArray sArray;
  17.  
  18.   sArray.array = array10;
  19.   sArray.size  = sizeof(array10) / sizeof(array10[0]);
  20.   mostrar(sArray);
  21.  
  22.   getchar();
  23.   return 0;
  24. }

Cita:
entonces TamanoArreglo sería igual a 5, cierto?. esta es la idea?, puedo usarlo de esta forma?.
A ver, cuando declaras:
Código C++:
Ver original
  1. int Arreglo[] = {2,5,4,8,2};
Así es, "Arreglo" tiene cinco elementos a los cuales accedes mediante los índices 0 a 4 (Arreglo[0], ..., Arreglo[4])

Si "Arreglo" está declarado "por encima" de la función,
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. int Arreglo[] =  {2,5,4,8,2};
  4.  
  5. void mostrar (...
la función lo conoce (es del ámbito), por lo que podes usar sin problemas: sizeof(Arreglo) / sizeof(int). Es mas, hasta podes omitir enviar el arreglo como parámetro:
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. int Arreglo[] =  {2,5,4,8,2};
  4.  
  5. void mostrar ( void ) {
  6.   int i;
  7.   for ( i = 0; i < sizeof(Arreglo) / sizeof(int); i++ )
  8.   ...
  9. }
En cambio cuando está declarado fuera del ámbito de la función, como en este caso:
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. void mostrar (int *arreglo, int tamanio) {
  4.   int i;
  5.   for ( i = 0; i < tamanio; i++ )
  6.     printf ( "%d ", arreglo[i] );
  7. }
  8.  
  9. int main() {
  10.   int Arreglo[] = {2,5,4,8,2};
  11.   mostrar(Arreglo, sizeof(Arreglo)/sizeof(Arreglo[0]));
  12.   ...
Debes enviar su tamaño o especificarlo explícitamente. Las formas en que podes declarar los parámetros para pasar el arreglo, te lo mostró dehm en el código del mensaje #8

Si no fuí claro en algún punto por favor decime e intento explicarlo de otro modo.

Saludos.
  #16 (permalink)  
Antiguo 04/04/2015, 15:00
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 4 meses
Puntos: 5
Respuesta: El "sizeof" para saber el tamaño del arreglo no me funciona

Cita:
Iniciado por ecfisa Ver Mensaje
Te pido disculpas, soy medio haragán para escribir.

Espero que quede mas entendible de este modo:
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. typedef struct {
  4.   int *array;  // arreglo
  5.   int size;    // tamaño
  6. } stArray;
  7.  
  8. void mostrar (stArray sa) {
  9.   int i;
  10.   for ( i = 0; i < sa.size; i++ )
  11.     printf ( "%d ", sa.array[i] );
  12. }
  13.  
  14. int main() {
  15.   int array10[10] = {5, 8, 2, 3, 1, 4, 6, 9, 2, 10};
  16.   stArray sArray;
  17.  
  18.   sArray.array = array10;
  19.   sArray.size  = sizeof(array10) / sizeof(array10[0]);
  20.   mostrar(sArray);
  21.  
  22.   getchar();
  23.   return 0;
  24. }


A ver, cuando declaras:
Código C++:
Ver original
  1. int Arreglo[] = {2,5,4,8,2};
Así es, "Arreglo" tiene cinco elementos a los cuales accedes mediante los índices 0 a 4 (Arreglo[0], ..., Arreglo[4])

Si "Arreglo" está declarado "por encima" de la función,
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. int Arreglo[] =  {2,5,4,8,2};
  4.  
  5. void mostrar (...
la función lo conoce (es del ámbito), por lo que podes usar sin problemas: sizeof(Arreglo) / sizeof(int). Es mas, hasta podes omitir enviar el arreglo como parámetro:
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. int Arreglo[] =  {2,5,4,8,2};
  4.  
  5. void mostrar ( void ) {
  6.   int i;
  7.   for ( i = 0; i < sizeof(Arreglo) / sizeof(int); i++ )
  8.   ...
  9. }
En cambio cuando está declarado fuera del ámbito de la función, como en este caso:
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. void mostrar (int *arreglo, int tamanio) {
  4.   int i;
  5.   for ( i = 0; i < tamanio; i++ )
  6.     printf ( "%d ", arreglo[i] );
  7. }
  8.  
  9. int main() {
  10.   int Arreglo[] = {2,5,4,8,2};
  11.   mostrar(Arreglo, sizeof(Arreglo)/sizeof(Arreglo[0]));
  12.   ...
Debes enviar su tamaño o especificarlo explícitamente. Las formas en que podes declarar los parámetros para pasar el arreglo, te lo mostró dehm en el código del mensaje #8

Si no fuí claro en algún punto por favor decime e intento explicarlo de otro modo.

Saludos.
Hola, gracias por la explicación.

Tenía las funciones abajo del MAIN y no me funcionaba como dices, tuve que enviar el tamaño en otro argumento con los métodos que me han enseñado.

Otra cosa que leí es que debería usar size_t para guardar tamaños usando sizeof.

Ejemplo;

Código:
funcion(Arreglo, sizeof (Arreglo) / sizeof (int);

void funcion(int Arreglo[], size_t TamanoArreglo)
{
{
es correcto esto?.
y también es cierto que haciendo eso no tendría que enviar el Arreglo a la función?

Ejemplo:
Código:
funcion(sizeof (Arreglo) / sizeof (int);

void funcion(size_t TamanoArreglo)
{
podría usar el Arreglo normalmente y TamanoArreglo también....
{
  #17 (permalink)  
Antiguo 04/04/2015, 15:37
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: El "sizeof" para saber el tamaño del arreglo no me funciona

size_t es un entero sin signo, o sea unsigned int que puede variar de un compilador a otro ya que algunos pueden ser long etc etc. Pero básicamente se trata de una variable que no puede guardar números negativos ya que un array no debería tener numeros negativos como array[-10] (Eso seria un disparate XD).

size_t es un typedef de un entero sin signo que puede variar de un compilador a otro.
  #18 (permalink)  
Antiguo 04/04/2015, 15:45
RGT
Usuario no validado
 
Fecha de Ingreso: noviembre-2008
Mensajes: 505
Antigüedad: 15 años, 4 meses
Puntos: 5
Respuesta: El "sizeof" para saber el tamaño del arreglo no me funciona

Cita:
Iniciado por vangodp Ver Mensaje
size_t es un entero sin signo, o sea unsigned int que puede variar de un compilador a otro ya que algunos pueden ser long etc etc. Pero básicamente se trata de una variable que no puede guardar números negativos ya que un array no debería tener numeros negativos como array[-10] (Eso seria un disparate XD).

size_t es un typedef de un entero sin signo que puede variar de un compilador a otro.
Hola, gracias por tu respuesta.
O sea, no es necesario el uso de size_t?, con el uso de int, también es válido?.

Etiquetas: arreglo, funcion, int, tamaño
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 03:18.