Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h")

Iniciado por MartNahuel95, 8 Junio 2016, 15:37 PM

0 Miembros y 2 Visitantes están viendo este tema.

MartNahuel95

#10
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í:
vectorN arreglo={NULL,0};

switch(op){
case 'C':
printf("Introduzca la dimension de su conjunto de valores:");
scanf("%d",&arreglo.n);
arreglo.elementos=(int*)calloc(arreglo.n, sizeof(int));

funciones.carga_arreglo(/*Cuál sería el argumento aquí*/);

break;

class_OpenGL

Si nos guiamos por el ejemplo dado por AlbertoBSD, el argumento sería el vector. Es decir, puedes hacer esto:
Código (cpp) [Seleccionar]
funciones.carga_arreglo(arreglo);

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 (cpp) [Seleccionar]
#include<stdio.h>
#include<math.h>
#include "Calculos_estadisticos.h"

void funciones::carga_arreglo(vectorN &V) {// Si no lo pasas por referencia, no afectará al vector.
    int z = V.n; // Aquí antes estaba vectorN.n, pero lo que quieres hacer es acceder al miembro de 'V'
    for(int i=0; i<z; i++){
        scanf("%d",&vectorN.elementos[i]); // Aquí tienes que poner los corchetes para acceder a cada elemento
    }
}

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

MartNahuel95

Cierto, me faltó tambien el [sub i]
También veo que tengo un error aquí:

for(int i=0; i<z; i++){
        scanf("%d",&vectorN.elementos[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:

funciones.carga_arreglo(arreglo);


main.cpp [Error] expected unqualified-id before '.' token

class_OpenGL

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 (cpp) [Seleccionar]
struct funciones {
    static void carga_arreglo(arreglo V);
    static double media(arreglo V);
    static double varianza(arreglo V);
    static double desv_est(arreglo V);
};


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 (cpp) [Seleccionar]
funciones::carga_arreglo(arreglo);

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

MartNahuel95

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?

AlbertoBSD

Cita de: MartNahuel95 en 10 Junio 2016, 02:48 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
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW


MartNahuel95

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:

int funciones::vector_vacio(vector_n V){
int z=V.n;
double suma=0;
for(int i=0;i<z;i++){
suma=suma+V.elementos[i];
}
if(suma != 0){
return 1;
}else{
return 0;
}
}


Pero cuando lo quiero aplicar a la función para hallar la media:

double funciones::media(vector_n V){
if(vector_vacio(vector_n V)==1){
int z=V.n;
double suma=0;
double media=0;
for(int i=0;i<z;i++){
suma=suma+(V.elementos[i]);
}
media=suma/z;
return media;
}else{
printf("Cargue elementos a su arreglo!!");
                return 0;
}
}


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.


class_OpenGL

#18
La función 'vacío' se puede hacer más sencilla:

Código (cpp) [Seleccionar]
bool funciones::vector_vacio(vector_n V){
   for(int i = 0; i < V.n; i++) {
       if(0 != V.elementos[i])
           return false;
   }
   
   return true;
}


A parte de eso, en la función 'media' hay varios errores:

Código (cpp) [Seleccionar]
double funciones::media(vector_n V){
   double resultado = 0.0;
   int i;

   for(i = 0; i < V.n; i++)
       resultado += V.elements[i];

   if(0 == V.n) {// Damos el error
       printf(stdout, "Error. Se ha intentado calcular la media de un conjunto vacío.\n");
        return 0.0;
    } else {
        return resultado / (double)V.n;
    }
}

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

AlbertoBSD

#19
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:

int funciones::vector_vacio(vector_n V){
return !V.n;
}


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.
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW