Título: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h") Publicado por: MartNahuel95 en 8 Junio 2016, 15:37 pm Buenas, tengo un problema en un proyecto que estoy compilando "Cálculos Estadísticos".
Se supone que el usuario debe poder ingresar la cantidad de elementos que quiere guardar en un vector (Longitud del arreglo). Para luego ponerse a cargar los elementos. Mi proyecto consta de tres archivos: "main.cpp": Aquí iría mi menú, con una instrucción "Switch" el usuario elegiría lo que quiere calcular. "Calculos_estadisticos.h": Aquí deberia "Declarar mi arreglo de ( L ) dimension" y en una estructura crear mis funciones con el arreglo declarado como argumento de cada una. "Calculos_estadisticos.cpp": Aquí iría la programación de las funciones, llamadas desde el arreglo. Lo que ocurre es que si no declaro mi arreglo en el .h con una dimensión preestablecida, obviamente me dice que no está declarado. Ya hice un proyecto anterior, "Calculos_Vectoriales" pero en ese caso tenía que declarar un vector de una dimensión fija L=3. Lo declaré de la siguiente forma Código: #pragma once Necesito hacer lo mismo para mi nuevo proyecto "Calculos_estadisticos" pero no puedo definir el arreglo de dimensión variable. Agradecería Muchísimo una ayuda con esto!! Desde ya muchas gracias. Título: Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h") Publicado por: AlbertoBSD en 9 Junio 2016, 02:01 am Para que sea de longitud variable necesitas memoria dinamica.
Se declara un apuntador ej.. Código
N puede ingresarlo el usuario en tiempo de ejecucion. Si tienss duddas sobre memoria dinamica iBf7AThP1w8 O sobre arreglos de longitud variable pw7hzCserBw En mi firma esta mi canal de youtube. Título: Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h") Publicado por: MartNahuel95 en 9 Junio 2016, 02:58 am Agradezco muchísimo su respuesta en serio, pero de igual manera no entiendo aún cómo hacerlo,
¿en qué archivo debo codificar el ejemplo anterior que me dio? En el "main.cpp"; en la instrucción "switch" que corresponde a (Cargar el arreglo): Debo pedir al usuario la cantidad de elementos que desea cargar. Mi problema es que si no declaro la variable "arreglo" en el Calculos_estadisticos.h no puedo argumentar las funciones dentro de mi estructura. Este sería mi archivo "main.cpp" Código: #include<stdio.h> Este mi archivo "Calculos_vectoriales.h" Código: #pragma once Por último iría mi "Calculos_estadisticos.cpp" Código: #include<stdio.h> En el que aún no tengo nada Título: Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h") Publicado por: AlbertoBSD en 9 Junio 2016, 03:56 am Esque realmente no se que quieres hacer.
Según tu codigo: Código
Vector 3D es un arreglo de 3 enteros. Entonces no se por que lo quieres hacer dinamico. Código
Aqui el detalle que tienes, es que se necesita inicializar cada vez que uses uno nuevo. Saludos!! Título: Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h") Publicado por: class_OpenGL en 9 Junio 2016, 07:02 am Si lo que quieres hacer es declarar un tipo de variable que almacene un vector de n elementos, podrías crear la siguiente estructura:
Código
Entonces, una vez tenemos esa estructura, cuando obtengamos del usuario las dimensiones que quiere para su vector, solamente rellenamos la estructura: Código
También podrías crear una función que te haga el trabajo: Código
Título: Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h") Publicado por: MartNahuel95 en 9 Junio 2016, 16:08 pm Código
En esta parte, vector.elementos = calloc(vector.n, sizeof(int)); por qué es necesario que ante-puesto a calloc se escriba (int*)?? Lo digo porque al usarlo así como usted escribió se produjeron errores. Luego leí ejemplos en Internet y siempre anteponen eso. De por sí, creo que por el momento su respuesta me está ayudando mucho, le agradezco Título: Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h") Publicado por: MartNahuel95 en 9 Junio 2016, 16:32 pm Por el momento tengo esto:
En el main.cpp: Código: case 'C': En Calculos_estadisticos.h: Código: #pragma once y ahora creando mi Calculos_estadisticos.cpp: Código: #include<stdio.h> cuando quiero guardar en z el valor de la (cantidad de elementos cargados por el usuario) me da error. Título: Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h") Publicado por: class_OpenGL en 9 Junio 2016, 17:27 pm Claro. Estás trabajando en C++. En C++, el casteo de tipos es más estricto. Mientras que en C ese código no produciría errores, en C++ tienes que castear el retorno de la función (tienes que poner int * porque calloc retorna el tipo void *).
Básicamente, C++ es más estricto en esas situaciones Título: Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h") Publicado por: AlbertoBSD en 9 Junio 2016, 18:30 pm segun veo si tiene el (int *) Junto al calloc.
Creo que el error va por el lado de la funcion Código
Donde vectorN es el tipo de dato la variable es V Deberia de ser asi: Código
No he compilado el codigo pero deberia de ser ese el problema. Saludos. Título: Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h") Publicado por: class_OpenGL en 9 Junio 2016, 18:44 pm Cita de: AlbertoBSD segun veo si tiene el (int *) Junto al calloc. Creo que se refería al fragmento de código que proporcioné. Puse en código pensando en C, porque no caí en la cuenta de que el usuario está trabajando en C++. Entonces, antes de la función calloc yo tendría que haber puesto (int *) Título: Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h") Publicado por: MartNahuel95 en 9 Junio 2016, 21:28 pm Si AlbertoBSD, ese era el problema, no me había dado cuenta de eso, gracias.
Ahora tengo un nuevo inconveniente en el "main.cpp", al momento de llamar a mi función creada. A mi estructura del arreglo dinámico la renombré así: Código: vectorN arreglo={NULL,0}; Código: switch(op){ Título: Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h") Publicado por: class_OpenGL en 9 Junio 2016, 21:42 pm Si nos guiamos por el ejemplo dado por AlbertoBSD, el argumento sería el vector. Es decir, puedes hacer esto:
Código
Solo quería aclarar que creo que hay algunos pequeños errores en el código de AlbertoBSD. Creo que este sería el código bueno (puede que me equivoque): Código
Título: Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h") Publicado por: MartNahuel95 en 9 Junio 2016, 21:58 pm Cierto, me faltó tambien el [sub i]
También veo que tengo un error aquí: Código: for(int i=0; i<z; i++){ Donde está "vectorN" debe también ser cambiado por "V" Una vez solucionado esto, sigo teniendo un problema al llamar a mi función: Código: funciones.carga_arreglo(arreglo); main.cpp [Error] expected unqualified-id before '.' token Título: Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h") Publicado por: class_OpenGL en 9 Junio 2016, 22:16 pm No me fijé en eso antes. Si quieres acceder a las funciones de una estructura de forma estática, primero, en la estructura, tienes que definirlas como estáticas:
Código
Definirlas de forma estática le dice al compilador que esos métodos (funciones dentro de una clase/estructura) no modificarán ningún miembro del objeto. Una vez declaras las funciones como estáticas, puedes usarlas así: Código
Título: Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h") Publicado por: MartNahuel95 en 10 Junio 2016, 02:48 am Tengo que agradecer en serio a los dos, A class_OpenGL y a AlbertoBSD. En serio Muchas Gracias.
Ahora que ya solucioné mi problema con la carga del arreglo puedo terminar de crear las funciones restantes. Una última pregunta, ¿dónde libero la memoria?. Al liberar la memoria se elimina lo que se haya guardado en el vector no? Título: Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h") Publicado por: AlbertoBSD en 10 Junio 2016, 02:54 am Una última pregunta, ¿dónde libero la memoria?. Al liberar la memoria se elimina lo que se haya guardado en el vector no? Liberar memoria solo marca el espacio como disponible para que sea usado por otra parte del programa. El contenido no es borrado. Tienes que liberarla en una sección del codigo donde de ahi en adelante estes totalmente segura de que no volveras a acceder a esos elementos En codigos pequeños es generalemente al finalizar el programa. En codigos mas grandes hay que tomar el criterio que te comente. Saludos Título: Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h") Publicado por: MartNahuel95 en 10 Junio 2016, 03:00 am Genial!!
Muchas Gracias. Saludos. Título: Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h") Publicado por: MartNahuel95 en 10 Junio 2016, 03:31 am Me surgió un nuevo inconveniente. Creé una función para corroborar que el usuario en tiempo de ejecución no calcule por ejemplo la media antes de cargar elementos al arreglo:
Código: int funciones::vector_vacio(vector_n V){ Pero cuando lo quiero aplicar a la función para hallar la media: Código: double funciones::media(vector_n V){ Me marca error en el argumento de vector_vacio In static member function 'static double funciones::media(vector_n)': [Error] expected primary-expression before 'V' Cuando creí que todo andaba bien, apareció esto jaja, lo siento. Título: Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h") Publicado por: class_OpenGL en 10 Junio 2016, 05:46 am La función 'vacío' se puede hacer más sencilla:
Código
A parte de eso, en la función 'media' hay varios errores: Código
Título: Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h") Publicado por: AlbertoBSD en 10 Junio 2016, 05:47 am Tu primera funcion, que pasa si el usuario agrega puros 00000000000
En resultado de la suma siempre sera 0.. Lo mejor es validar si el varlor de n es distindo de 0 si lo es, quiere decir que el arreglo no esta vacio. Seria: Código
Lo anterior se lee como "Regresa la negacion de V.n, (Si es distinto de 0 regresa 0 [falso], si es 0 regresa 1 [Verdadero])" Sobre el error que te aparece la verdad no tengo ni idea de que sea, prueba este codigo y si te sale error nos dices. Saludos. |