elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  El "sizeof" para saber el tamaño del arreglo no me funciona
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: El "sizeof" para saber el tamaño del arreglo no me funciona  (Leído 3,897 veces)
RGT

Desconectado Desconectado

Mensajes: 33



Ver Perfil
El "sizeof" para saber el tamaño del arreglo no me funciona
« en: 4 Abril 2015, 07:11 am »

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é?.


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: El "sizeof" para saber el tamaño del arreglo no me funciona
« Respuesta #1 en: 4 Abril 2015, 08:20 am »

Con ese código solamente me muestra el 5.
Si tomamos ese fragmento de código y en base a el creamos el programa mas pequeño posible (sin otra función mas que main) funciona correctamente. Pero si declaras el array en una función y en otra tratas de obtener su tamaño se genera el comportamiento que mencionas.

Para evitar confusiones mejor publica el código fuente completo del programa.

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
RGT

Desconectado Desconectado

Mensajes: 33



Ver Perfil
Re: El "sizeof" para saber el tamaño del arreglo no me funciona
« Respuesta #2 en: 4 Abril 2015, 15:53 pm »

Hola,

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

printf("\nIngrese el elemento: ");
            scanf("%d", &liElemento);
            MostrarConjunto(laiArreglo);                //Mostramos el arreglo
return 0;
}




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

    printf("\nCONJUNTO: ");

    for (liContador = 0; liContador < sizeof (laiArreglo) / sizeof (int); liContador++)
    {
        printf("%d ", laiArreglo[liContador]);
    }
}

Este es el código.... Espero puedan ayudarme
:(
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: El "sizeof" para saber el tamaño del arreglo no me funciona
« Respuesta #3 en: 4 Abril 2015, 16:40 pm »

Como ya te comente no puedes (mas bien no deberías) utilizar el operador sizeof para obtener el tamaño de un array declarado en otra función ya que no obtendrás el valor esperado.

En su lugar lo que debes hacer es modificar la función para que reciba como un segundo argumento el numero de elementos, de esta forma:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void imprimir(int num[], size_t num_elem);
  5.  
  6. int main(void)
  7. {
  8.   int num[] = {5,8,2,3,1,4,6,9,2,10};
  9.  
  10.   imprimir(num, sizeof num / sizeof num[0]);
  11.  
  12.   return EXIT_SUCCESS;
  13. }
  14.  
  15. void imprimir(int num[], size_t num_elem)
  16. {
  17.   size_t i;
  18.  
  19.   puts("Lista");
  20.   for (i = 0; i < num_elem; i++)
  21.      printf(" %d", num[i]);
  22.   putchar('\n');
  23. }

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
RGT

Desconectado Desconectado

Mensajes: 33



Ver Perfil
Re: El "sizeof" para saber el tamaño del arreglo no me funciona
« Respuesta #4 en: 4 Abril 2015, 16:53 pm »

Hola, gracias por ayudarme pero, qué es size_t?
Podrías explicarme por qué le pasas esas cosas de esa forma?, no entiendo la lógica.
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: El "sizeof" para saber el tamaño del arreglo no me funciona
« Respuesta #5 en: 4 Abril 2015, 17:53 pm »

qué es size_t?
size_t es un tipo entero sin signo, el operador sizeof resulta en un valor de ese tipo y esa es la razón de utilizarlo.

Podrías explicarme por qué le pasas esas cosas de esa forma?, no entiendo la lógica.
Lo siento pero honestamente no entiendo la pregunta. ¿Exactamente a que te refieres?

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
RGT

Desconectado Desconectado

Mensajes: 33



Ver Perfil
Re: El "sizeof" para saber el tamaño del arreglo no me funciona
« Respuesta #6 en: 4 Abril 2015, 17:59 pm »

A ver si entendí.

int Arreglo[] = {1,2,5,6,2,4};

Funcion(Arreglo, sizeof (laiArreglo) / sizeof (int));

void Funcion (int Arreglo[], int TamanoArreglo)
{
}

entonces TamanoArreglo sería = 6

es correcto?, esta es la forma?
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: El "sizeof" para saber el tamaño del arreglo no me funciona
« Respuesta #7 en: 4 Abril 2015, 18:28 pm »

Es correcto pero hay tres detalles:
1) Utilizas "laiArreglo" cuando debería ser "Arreglo".
2) Coméntale a tu profesor que prefijos como "lai" son, para ser amables, malos e innecesarios.
3) El tipo del segundo parámetro de la función debe ser size_t.

De esta forma:
Código
  1. int Arreglo[] = {1,2,5,6,2,4};
  2.  
  3. Funcion(Arreglo, sizeof Arreglo / sizeof(int));
  4.  
  5. void Funcion (int Arreglo[], size_t TamanoArreglo)
  6. {
  7.   /* ... */
  8. }

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
RGT

Desconectado Desconectado

Mensajes: 33



Ver Perfil
Re: El "sizeof" para saber el tamaño del arreglo no me funciona
« Respuesta #8 en: 4 Abril 2015, 22:24 pm »

1) Utilizas "laiArreglo" cuando debería ser "Arreglo".
2) Coméntale a tu profesor que prefijos como "lai" son, para ser amables, malos e innecesarios.

El uso de lai (local, arreglo, integer) o de li (local, integer) es algo obligatorio requerido por el profesor de mi universidad. Segun el, ayuda al entendimiento del programa al ver las variables.

3) El tipo del segundo parámetro de la función debe ser size_t.
Entonces, size_t, es utilizado solamente para guardar un numero entero sin signo y el numero es dado por sizeof, correcto?.
Habría alguna diferencia si utilizo size_t ó int, tendría algun efecto diferente?.

Ejemplo:

int tamaño = 10;
for (i = 0; i < tamaño; i++)

size_t tamaño = 10;
for (i = 0; i < tamaño; i++)

Los dos, suponiendo que el INT es positivo, al ser utilizado en un FOR, no tendría diferencia o sí?.

Me gusta aprender todo, perdon por las preguntas, espero que no te moleste.
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: El "sizeof" para saber el tamaño del arreglo no me funciona
« Respuesta #9 en: 5 Abril 2015, 04:33 am »

El uso de lai (local, arreglo, integer) o de li (local, integer) es algo obligatorio requerido por el profesor de mi universidad. Segun el, ayuda al entendimiento del programa al ver las variables.
Si es obligatorio solo queda la resignación pero aun así no es una buena idea, dos razones en contra son:
1) Un compilador decente emitirá un mensaje de error si tratas de utilizar una variable local fuera de su ámbito.
2) Como ya te diste cuenta (experiencia propia) los arrays usualmente no son procesados como tales, en su lugar se utiliza un puntero a su primer elemento.


Entonces, size_t, es utilizado solamente para guardar un numero entero sin signo y el numero es dado por sizeof, correcto?.
Habría alguna diferencia si utilizo size_t ó int, tendría algun efecto diferente?.

[...]

Los dos, suponiendo que el INT es positivo, al ser utilizado en un FOR, no tendría diferencia o sí?.
Cuando el tamaño del objeto (en el caso de los arrays su numero de elementos multiplicado por el tamaño del tipo de estos) es pequeño no hay diferencia ni problema alguno, sin embargo el único tipo que garantiza la capacidad para almacenar el tamaño de cualquier objeto es size_t.

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines