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 7,857 veces)
MartNahuel95

Desconectado Desconectado

Mensajes: 11


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

const int D=3;
typedef int vector3D[D];

typedef struct vector_estr{
void carga_vector(vector3D V);
double angulo(vector3D A,vector3D B);
double proyeccion(vector3D A,vector3D B);
void punto_medio(vector3D A,vector3D B);
void perpendicular(vector3D A,vector3D B);
void verif_perpendicularidad(vector3D A,vector3D B);
void verif_paralelismo(vector3D A,vector3D B);

private:
int prod_punto(vector3D A, vector3D B);
double modulo(vector3D V);
int vector_vacio(vector3D V);
void imprimir_vector(vector3D V);
};

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.


« Última modificación: 8 Junio 2016, 18:01 pm por MartNahuel95 » En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.640

🏴 Libertad!!!!!


Ver Perfil WWW
Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h")
« Respuesta #1 en: 9 Junio 2016, 02:01 am »

Para que sea de longitud variable necesitas memoria dinamica.

Se declara un apuntador ej..
Código
  1. int *a =NULL;
  2. a= calloc(sizeof(int),N); // N elementos int

N puede ingresarlo el usuario en tiempo de ejecucion.

Si tienss duddas sobre memoria dinamica



O sobre arreglos de longitud variable


En mi firma esta mi canal de youtube.


« Última modificación: 9 Junio 2016, 02:04 am por AlbertoBSD » En línea

Publickey: 03b8b1bf1830c8d407870001ec0e7badb7a6632255fb0051284b14f53791bd6087
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW
MartNahuel95

Desconectado Desconectado

Mensajes: 11


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

void menu(){
printf("\n\n\t\t\tC%clculos Estad%csticos.",160,161);
printf("\n\n\t1)Ingrese el tama%co y datos del arreglo   [C]",164);
printf("\n\t2)Media del arreglo                       [M]");
printf("\n\t3)Varianza del arreglo                    [V]");
printf("\n\t4)Desviaci%cn estandar del arreglo         [D]",162);
printf("\n\t5)Salir                                   [S]");
printf("\n\n\t\tIngrese una opci%cn v%clida [C-M-V-D-S]\n",162,160);
printf("\n\tOpci%cn: ",162);
}

int main(){
menu();
char op;
do{
scanf("%c",&op);
op=toupper(op);
switch(op){
case 'C':
int N;
int *a=NULL;
printf("Ingrese la cantidad de numeros del que estará compuesto el arreglo:");
scanf("%d",&N);
a=calloc(sizeof(int),N);

break;
case 'M':

break;
case 'V':

break;
case 'D':

break;
}
}while(toupper(op)!='S');
}

Este mi archivo "Calculos_vectoriales.h"
Código:
#pragma once

typedef int arreglo[*a];

typedef struct funciones{
  void carga_arreglo(arreglo V);
double media(arreglo V);
  double varianza(arreglo V);
  double desv_est(arreglo V);
 
 
 };

Por último iría mi "Calculos_estadisticos.cpp"

Código:
#include<stdio.h>
#include<math.h>
#include "Calculos_estadisticos.h"


En el que aún no tengo nada
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.640

🏴 Libertad!!!!!


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

Esque realmente no se que quieres hacer.

Según tu codigo:

Código
  1. typedef int vector3D[D];

Vector 3D es un arreglo de 3 enteros.

Entonces no se por que lo quieres hacer dinamico.

Código
  1. int *vectorN;
  2. vectorN = calloc(sizeof(int),10); // vector de 10 elementos
  3.  

Aqui el detalle que tienes, es que se necesita inicializar cada vez que uses uno nuevo.

Saludos!!
En línea

Publickey: 03b8b1bf1830c8d407870001ec0e7badb7a6632255fb0051284b14f53791bd6087
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW
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 #4 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
  1. typedef struct {
  2.    int *elementos; // Este puntero apuntará al primer byte del vector
  3.    unsigned int n; // Esta variable almacenará cuantas dimensiones tiene el vector
  4. } vectorN;

Entonces, una vez tenemos esa estructura, cuando obtengamos del usuario las dimensiones que quiere para su vector, solamente rellenamos la estructura:

Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. int main() {
  5.    vectorN vector = {NULL, 0};
  6.  
  7.    fprintf(stdout, "Introduzca las dimensiones que quiera para su vector: ");
  8.    fscanf(stdin, "%u", &vector.n);
  9.    vector.elementos = calloc(vector.n, sizeof(int));
  10.  
  11.    return 0; // No olvides liberar la memoria cuando termines!
  12. }

También podrías crear una función que te haga el trabajo:
Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. void init_vectorN(vectorN *vector, unsigned int n);
  5.  
  6. int main() {
  7.    vectorN vecto = {NULL, 0};
  8.    unsigned int n;
  9.  
  10.    fprintf(stdout, "Introduzca las dimensiones que quiera para su vector: ");
  11.    fscanf(stdin, "%u", &n);
  12.    init_vectorN(&vector, n);
  13.  
  14.    return 0;
  15. }
  16.  
  17. void init_vectorN(vectorN *vector, unsigned int n) {
  18.    vector.n = n;
  19.    vector.elementos = calloc(n, sizeof(int));
  20. }
« Última modificación: 9 Junio 2016, 07:07 am por class_OpenGL » 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 #5 en: 9 Junio 2016, 16:08 pm »

Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. int main() {
  5.    vectorN vector = {NULL, 0};
  6.  
  7.    fprintf(stdout, "Introduzca las dimensiones que quiera para su vector: ");
  8.    fscanf(stdin, "%u", &vector.n);
  9.    vector.elementos = calloc(vector.n, sizeof(int));
  10.  
  11.    return 0; // No olvides liberar la memoria cuando termines!
  12. }

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
En línea

MartNahuel95

Desconectado Desconectado

Mensajes: 11


Ver Perfil
Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h")
« Respuesta #6 en: 9 Junio 2016, 16:32 pm »

Por el momento tengo esto:

En el main.cpp:

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


break;

En Calculos_estadisticos.h:

Código:
#pragma once


typedef struct vectorN{
int *elementos;
        int n;
};

typedef struct funciones{
  void carga_arreglo(vectorN V);
double media(vectorN V);
  double varianza(vectorN V);
  double desv_est(vectorN V);
 
 
 };

y ahora creando mi Calculos_estadisticos.cpp:

Código:
#include<stdio.h>
#include<math.h>
#include "Calculos_estadisticos.h"

void funciones::carga_arreglo(vectorN V){
int z=vectorN.n;
for(int i=0;i<z;i++){
scanf("%d",&vectorN.elementos);
}
}

cuando quiero guardar en z el valor de la (cantidad de elementos cargados por el usuario) me da error.
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 #7 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
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.640

🏴 Libertad!!!!!


Ver Perfil WWW
Re: Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h")
« Respuesta #8 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
  1. #include<stdio.h>
  2. #include<math.h>
  3. #include "Calculos_estadisticos.h"
  4.  
  5. void funciones::carga_arreglo(vectorN V){
  6. int z=vectorN.n;
  7. for(int i=0;i<z;i++){
  8. scanf("%d",&vectorN.elementos);
  9. }
  10. }

Donde vectorN es el tipo de dato la variable es V

Deberia de ser asi:

Código
  1. #include<stdio.h>
  2. #include<math.h>
  3. #include "Calculos_estadisticos.h"
  4.  
  5. void funciones::carga_arreglo(vectorN V){
  6. int z=V.n;
  7. for(int i=0;i<z;i++){
  8. scanf("%d",&vectorN.elementos);
  9. }
  10. }


No he compilado el codigo pero deberia de ser ese el problema.

Saludos.
En línea

Publickey: 03b8b1bf1830c8d407870001ec0e7badb7a6632255fb0051284b14f53791bd6087
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW
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 #9 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 *)
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

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