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

Iniciado por RGT, 4 Abril 2015, 07:11 AM

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

RGT


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

rir3760

Cita de: RGT en  4 Abril 2015, 07:11 AMCon 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
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

Hola,


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
:(

rir3760

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:
#include <stdio.h>
#include <stdlib.h>

void imprimir(int num[], size_t num_elem);

int main(void)
{
   int num[] = {5,8,2,3,1,4,6,9,2,10};
   
   imprimir(num, sizeof num / sizeof num[0]);
   
   return EXIT_SUCCESS;
}

void imprimir(int num[], size_t num_elem)
{
   size_t i;
   
   puts("Lista");
   for (i = 0; i < num_elem; i++)
      printf(" %d", num[i]);
   putchar('\n');
}


Un saludo
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

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.

rir3760

Cita de: RGT en  4 Abril 2015, 16:53 PMqué 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.

Cita de: RGT en  4 Abril 2015, 16:53 PMPodrí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
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

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?

rir3760

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:
int Arreglo[] = {1,2,5,6,2,4};

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

void Funcion (int Arreglo[], size_t TamanoArreglo)
{
   /* ... */
}


Un saludo
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

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.

rir3760

Cita de: RGT en  4 Abril 2015, 22:24 PMEl 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.


Cita de: RGT en  4 Abril 2015, 22:24 PMEntonces, 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
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