[Ayuda] Determinar tamaño de un array en C

Buenas, primeramente decir que no estoy seguro que de que este hilo vaya aqui. Si hubiera algún problema que los mod lo muevan/cierren.

Bueno al lio.

¿Existe alguna manera de saber el tamaño de un array en C?. Es decir, yo creo un array[5](por ejemplo) y quiero que el programa me devuelva el tamaño del array.

¿Eso es posible? xD

Muchas gracias.
el tamaño del array? si tienes un array X[5] el total de celdas es 5,en C,de la 0 a la 4,su tamaño es 5,tu mismo lo estas indicando,no entiendo muy bien lo que quieres hacer,si puedes especificar un poco...
elpeluson escribió:el tamaño del array? si tienes un array X[5] el total de celdas es 5,en C,de la 0 a la 4,su tamaño es 5,tu mismo lo estas indicando,no entiendo muy bien lo que quieres hacer,si puedes especificar un poco...


Lo que quiero hacer es una función "standard" que me sirva para llenar cualquier vector en cualquier programa indicandole solamente la dirección del primer elemento. Es por esto que me parece muy interesante que la función pudiera determinar el tamaño del array sin tener que indicarlo manualmente cuando llamo a la misma.

Ahora mismo tengo esto:
#include<stdio.h>
#include<conio.c>
#include<stdlib.h>

void vecin(int *fstpos, int *tam)
{
int i,j;

for(i=1;i<=*tam;i++,fstpos++)
{
printf("Introduzca %d valor del vector",i);
scanf("%d", fstpos);
}
}

main()
{
int vec[5],tam=5;
vecin(&vec[0],&tam);

for(tam=0;tam<=4;tam++)
{
printf("%d", vec[tam]);
}
getch();
}


Como ves, aquí cada vez que llamas a la función debes indicarle tanto la posición del primer elemento como su tamaño. Mi intención es reducir le número de parámetros haciendo que sea la propia función quien determine el tamaño del array.
Creo que en C no se puede

Tanto si lo creas estatico como dinamicamente lo que tienes es un puntero a una dirección de memoria, nada mas
Por lo tanto no tienes tamaño

Una opción seria crear un struct vector donde te guardes el puntero a la primera dirección y el tamaño del vector, te manera que a la función para rellenarlo solo le pases una referencia a tu struct vector

Seria hacer algo asi como la clase vector de c++

Por cierto, por que pasas el tamaño por referencia?
Las tablas en C acaban todas en \0 si no recuerdo mal. Simplemente haz que el bucle recorra hasta dar con el \0.
Esta función por ejemplo te devolvería el tamaño.
int tamaño(char tabla[])
{
int tam=0
while (tabla[tam]!='\0')
tam++;
return tam;
}
¿Con sizeof? Y dividiendo por el tamaño de cada elemento, claro...
o con un for... que te vaya recoriendo todas las posiciones y comparandotelas con "\0"....

tienes varias opciones
d34th escribió:Creo que en C no se puede

Tanto si lo creas estatico como dinamicamente lo que tienes es un puntero a una dirección de memoria, nada mas
Por lo tanto no tienes tamaño

Una opción seria crear un struct vector donde te guardes el puntero a la primera dirección y el tamaño del vector, te manera que a la función para rellenarlo solo le pases una referencia a tu struct vector

Seria hacer algo asi como la clase vector de c++

Por cierto, por que pasas el tamaño por referencia?


De todos modos tendría que declararlo al crear el struct, la idea es que pueda calcularlo. El tamaño lo paso así porque esto es un trozo de código de otro programa y estaba así. No es por nada especial xD.


NanakiXIII escribió:Las tablas en C acaban todas en \0 si no recuerdo mal. Simplemente haz que el bucle recorra hasta dar con el \0.
Esta función por ejemplo te devolvería el tamaño.
int tamaño(char tabla[])
{
int tam=0
while (tabla[tam]!='\0')
tam++;
return tam;
}


Pero eso seria para string, si no me equivoco, los arrays o vectores no terminan en '\0'. Corrigeme si me equivoco.

Slurp escribió:¿Con sizeof? Y dividiendo por el tamaño de cada elemento, claro...


Creo que no termino de entender lo que quieres decir, ¿ Podrías explicarlo un poco por favor?
Coolas escribió:o con un for... que te vaya recoriendo todas las posiciones y comparandotelas con "\0"....

tienes varias opciones


Como le decia al compañero, creo que eso solamente se da en los string (de tipo char), pero no estoy seguro al 100%
sizeof(elarray)/sizeof(eltipodedatodelarray)


Por ejemplo, si tienes un vector v de enteros, el tamaño lo sacas con: sizeof(v) / sizeof(int)
amuchamu escribió:
sizeof(elarray)/sizeof(eltipodedatodelarray)


Por ejemplo, si tienes un vector v de enteros, el tamaño lo sacas con: sizeof(v) / sizeof(int)


Muchas gracias, me has salvado la tarde xD

Un saludo

Edit-- ¿No sabras como implementarlo directamente dentro de la función verdad? (Si, soy un patán del C xD).
amuchamu escribió:
sizeof(elarray)/sizeof(eltipodedatodelarray)


Por ejemplo, si tienes un vector v de enteros, el tamaño lo sacas con: sizeof(v) / sizeof(int)


Ten cuidado por que eso solo funcionara con arrays estaticos
Si creas un array en memoria dinamica eso te devolvera lo que ocupa un puntero en memoria

Como bien habeis dicho ya, los acabados en '\0' con los strings, y en realidad no siempre tiene por que ser asi, nos podriamos encontrar casos en que no se cumple
10 respuestas