Ver Mensaje Individual
  #4 (permalink)  
Antiguo 30/03/2016, 08:41
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Duda: Contar elementos vector dentro de función.

Cita:
Iniciado por Casert Ver Mensaje
Respecto al uso del free, no veo muy bien donde situarlo, porque la memoria que se reserva es para el vector2 y lo que devuelve la función es el vector2. Por tanto, ¿Se debe liberar después de usarla en el programa usando free(vector2)?
Imagina que vas a una bollería y te compras un bollo y te lo dan con una servilleta para que no te manches. Te vas de la bollería y te comes el bollo en el parque.... ¿En qué momento de esta historia tiras el papel a la basura?

Vale, ahora imagina que la bollería es la función operaVector, el papel es la memoria dinámica y el bollo los datos almacenados en dicha memoria.

Espero que la respuesta a la pregunta del papel sea que lo tiras una vez que te has comido el bollo, es decir, una vez que ya no necesitas los datos que están almacenados en la memoria te la cargas porque ya no la necesitas.

Se que es un ejemplo tonto pero creo que cambiando la perspectiva se consigue que problemas complicados parezcan bastante sencillos y lógicos.

Y bueno, por si no ha quedado del todo claro, la memoria la puedes borrar en cualquier momento, no tiene que ser necesariamente en la misma función que reservó dicha memoria. Más que nada piensa que a la memoria dinámica se accede desde punteros. free te pide un puntero y libera la memoria apuntada por el mismo... le da igual en qué momento fué creada y, entre otras cosas, solo con un puntero es imposible obtener esa información.

Cita:
Iniciado por Casert Ver Mensaje
Por último, ¿En lugar de size_t vectorSize se podría usar de igual manera int vectorSize?
Te pego un párrafo de la documentación de la MSDN (por eso de que está en español)

Cita:
El operando es un identificador que es un elemento unary-expression o una expresión de conversión de tipo (es decir, un especificador de tipo incluido entre paréntesis).El elemento unary-expression no puede representar un objeto de campo de bits, un tipo incompleto ni un designador de función.El resultado es una constante entera sin signo.El encabezado estándar STDDEF.H define este tipo como size_t.
Es decir, esa función te va a devolver siempre un valor con el tipo size_t. ¿Y qué narices es size_t? Pues es un alias. Uno de tantos que pululan por la librería de C.

¿Y por qué usar un alias? Como bien sabes (o deberías saber), los tipos numéricos en C no tienen un tamaño fijo sino que dependen de la arquitectura. Esto hace que escribir programas multiplataforma sea un auténtico dolor de cabeza ya que los rangos de valores cambiarán de una plataforma a otra.

Usar alias permite que el programador se pueda olvidar por unos momentos de ese problema. Ya que el alias no es un tipo fijo se puede cambiar fácilmente entre plataformas con algo tan tonto como esto:

Código C:
Ver original
  1. // Prueba a comentar estos defines de forma alternativa
  2. // compila y compara la salida del programa
  3. #define SISTEMA1
  4. //#define SISTEMA2
  5. //#define SISTEMA3
  6.  
  7. #ifdef SISTEMA1
  8. typedef int miTipo;
  9. #elif SISTEMA2
  10. typedef double miTipo;
  11. #else
  12. typedef char miTipo;
  13. #endif
  14.  
  15. int main()
  16. {
  17.   printf("%d",sizeof(miTipo));
  18. }

Por cierto, los propios compiladores suelen traer un juego de constantes ya definidas que indican ciertas características.

Dicho todo esto y para responder a tu pregunta:

Sí podrías, pero tu programa podría dar problemas en entornos multiplataforma. Otro problema que podrías tener (aunque sería raro de narices) es que el tamaño del objeto no entrase en un int pero sí en un "unsigned int", en ese caso obtendrías un resultado negativo y el programa se volvería errático.

Pero vamos que sin llegar a ser paranóicos te diría que sí, puedes usarlo... pero recuerda que puede dar problemas y, por tanto, no es una buena práctica a adquirir.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.