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

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

0 Miembros y 1 Visitante están viendo este tema.

MartNahuel95

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
#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.

AlbertoBSD

#1
Para que sea de longitud variable necesitas memoria dinamica.

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


N puede ingresarlo el usuario en tiempo de ejecucion.

Si tienss duddas sobre memoria dinamica

[youtube=640,360]https://www.youtube.com/watch?v=iBf7AThP1w8[/youtube]

O sobre arreglos de longitud variable
[youtube=640,360]https://www.youtube.com/watch?v=pw7hzCserBw[/youtube]

En mi firma esta mi canal de youtube.
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

MartNahuel95

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"

#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"
#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"

#include<stdio.h>
#include<math.h>
#include "Calculos_estadisticos.h"



En el que aún no tengo nada

AlbertoBSD

Esque realmente no se que quieres hacer.

Según tu codigo:

typedef int vector3D[D];

Vector 3D es un arreglo de 3 enteros.

Entonces no se por que lo quieres hacer dinamico.

int *vectorN;
vectorN = calloc(sizeof(int),10); // vector de 10 elementos


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

Saludos!!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

class_OpenGL

#4
Si lo que quieres hacer es declarar un tipo de variable que almacene un vector de n elementos, podrías crear la siguiente estructura:

typedef struct {
   int *elementos; // Este puntero apuntará al primer byte del vector
   unsigned int n; // Esta variable almacenará cuantas dimensiones tiene el vector
} vectorN;


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

#include <stdlib.h>
#include <stdio.h>

int main() {
   vectorN vector = {NULL, 0};
   
   fprintf(stdout, "Introduzca las dimensiones que quiera para su vector: ");
   fscanf(stdin, "%u", &vector.n);
   vector.elementos = calloc(vector.n, sizeof(int));
   
   return 0; // No olvides liberar la memoria cuando termines!
}


También podrías crear una función que te haga el trabajo:
#include <stdlib.h>
#include <stdio.h>

void init_vectorN(vectorN *vector, unsigned int n);

int main() {
   vectorN vecto = {NULL, 0};
   unsigned int n;
   
   fprintf(stdout, "Introduzca las dimensiones que quiera para su vector: ");
   fscanf(stdin, "%u", &n);
   init_vectorN(&vector, n);
   
   return 0;
}

void init_vectorN(vectorN *vector, unsigned int n) {
   vector.n = n;
   vector.elementos = calloc(n, sizeof(int));
}

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

MartNahuel95

#include <stdlib.h>
#include <stdio.h>

int main() {
   vectorN vector = {NULL, 0};
   
   fprintf(stdout, "Introduzca las dimensiones que quiera para su vector: ");
   fscanf(stdin, "%u", &vector.n);
   vector.elementos = calloc(vector.n, sizeof(int));
   
   return 0; // No olvides liberar la memoria cuando termines!
}


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

MartNahuel95

Por el momento tengo esto:

En el main.cpp:

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:

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

#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.

class_OpenGL

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

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

AlbertoBSD

segun veo si tiene el (int *) Junto al calloc.

Creo que el error va por el lado de la funcion
#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);
}
}


Donde vectorN es el tipo de dato la variable es V

Deberia de ser asi:

#include<stdio.h>
#include<math.h>
#include "Calculos_estadisticos.h"

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



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

Saludos.
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

class_OpenGL

Cita de: AlbertoBSDsegun 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 *)

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