elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h")
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h")  (Leído 10,468 veces)
MartNahuel95

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h")
« Respuesta #10 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){
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;


« Última modificación: 9 Junio 2016, 21:32 pm por MartNahuel95 » En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h")
« Respuesta #11 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
  1. 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
  1. #include<stdio.h>
  2. #include<math.h>
  3. #include "Calculos_estadisticos.h"
  4.  
  5. void funciones::carga_arreglo(vectorN &V) {// Si no lo pasas por referencia, no afectará al vector.
  6.    int z = V.n; // Aquí antes estaba vectorN.n, pero lo que quieres hacer es acceder al miembro de 'V'
  7.    for(int i=0; i<z; i++){
  8.        scanf("%d",&vectorN.elementos[i]); // Aquí tienes que poner los corchetes para acceder a cada elemento
  9.    }
  10. }


En línea

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

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h")
« Respuesta #12 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++){
        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:

Código:
funciones.carga_arreglo(arreglo);


main.cpp [Error] expected unqualified-id before '.' token
En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h")
« Respuesta #13 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
  1. struct funciones {
  2.    static void carga_arreglo(arreglo V);
  3.    static double media(arreglo V);
  4.    static double varianza(arreglo V);
  5.    static double desv_est(arreglo V);
  6. };

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
  1. funciones::carga_arreglo(arreglo);
En línea

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

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h")
« Respuesta #14 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?
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h")
« Respuesta #15 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
En línea

MartNahuel95

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h")
« Respuesta #16 en: 10 Junio 2016, 03:00 am »

Genial!!

Muchas Gracias.

Saludos.
En línea

MartNahuel95

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h")
« Respuesta #17 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){
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:

Código:
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.

En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h")
« Respuesta #18 en: 10 Junio 2016, 05:46 am »

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

Código
  1. bool funciones::vector_vacio(vector_n V){
  2.    for(int i = 0; i < V.n; i++) {
  3.        if(0 != V.elementos[i])
  4.            return false;
  5.    }
  6.  
  7.    return true;
  8. }

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

Código
  1. double funciones::media(vector_n V){
  2.    double resultado = 0.0;
  3.    int i;
  4.  
  5.    for(i = 0; i < V.n; i++)
  6.        resultado += V.elements[i];
  7.  
  8.    if(0 == V.n) {// Damos el error
  9.        printf(stdout, "Error. Se ha intentado calcular la media de un conjunto vacío.\n");
  10.        return 0.0;
  11.    } else {
  12.        return resultado / (double)V.n;
  13.    }
  14. }
« Última modificación: 10 Junio 2016, 05:51 am por class_OpenGL » En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h")
« Respuesta #19 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
  1. int funciones::vector_vacio(vector_n V){
  2. return !V.n;
  3. }

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.
« Última modificación: 10 Junio 2016, 05:50 am por AlbertoBSD » En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines