tengo un proyecto que consta de varios módulos, pero por el momento los he probado como archivos independientes, estoy tratando de unirlos y para eso necesito utilizar funciones, he realizado varias combinaciones pero en todas me da error, estoy utilizando Devc++, uno de los módulos realiza el histograma de unos datos que proceden de un archivo .txt, con la lectura del archivo no tengo problema, ni con la conversión char a float, el problema es cuando intento realizar el histograma de esos datos. a continuación menciono cuales serian las entradas y salidas del histograma:
entrada: traza (traza es un vector declarado de la siguiente forma std::vector <float> traza)
salidas:frecuencias y simbolos(ambos declarados de la misma manera que traza)
cabe especificar que no conozco el largo de los vectores. gracias
Dices donde está el problema, pero cuál es. Muestra el código que falla, que de error, o que no funcione bien.
void histograma(float trazas[] ), asi estoy declarando la funcion
histograma(traza[]); asi la estoy llamando, por el momento solo queria pasar a trazas a histograma, sin que histograma me retornara algun valor, pero igual me da error. A continuacion presento el codigo
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <cstdlib>
#include <vector>
////////
using namespace std;
void histograma(float trazas[]);
int main ()
{std::vector<float> simbolos;
std::vector<float> frecuencias;
std::vector<float> probabilidades;
FILE *archivo;
char caracter;
std::vector<float> ayudante;
std::vector<float> traza;
float ayuda;
char numPtr[1];
float por=5;
archivo = fopen("D:\\entrada10.txt","r");
if (archivo == NULL){
printf("\nError de apertura del archivo. \n\n");
}else{
printf("\nEl contenido del archivo de prueba es \n\n");
while (feof(archivo) == 0)
{
caracter = fgetc(archivo);
// printf("%c",caracter);
numPtr[1]=caracter;
ayuda=float(numPtr[1]-48);
// cout<<"\n ayuda="<<ayuda;
int kk=0;
ayudante.push_back(ayuda);
////////////////////////////////// aqui empezamos a tranformar
if (ayuda==-38)
{
// for(int ii=0;ii<ayudante.size();ii++)////mostrando ayudante
// {cout<<"\n ayudante["<<ii<<"]="<<ayudante[ii];}
if (ayudante[0]==-3)/////saber si es negativo
{ kk=1;
ayudante.erase (ayudante.begin());
}//////////
ayudante.pop_back();
int i=0;
float suma=0;
int cifras=0;/////dice cuantas cifras enteras tiene
while (i<ayudante.size()) ///////saber cuantas cifras enteras tiene
{ if(ayudante[i]==-2)//contador de cifras enteras
{cifras=i;
i=ayudante.size();
}
else
{i++;
cifras=i;
}
;
} //////////termina while
int ii=0;
int cifraaux=cifras;
float aux=0;
int k=0;
while (cifras>1)/////parte entera
{aux=ayudante[ii];
k=cifras;
while (k>1) ///////multiplicaciones parte entera
{aux=aux*10;
k--;
}
cifras--;
ii++;
suma=suma+aux;
// cout<<"\n suma="<<suma;
}
suma=suma+ayudante[ii];
int deci=ayudante.size()-cifraaux-1;
ii=ayudante.size()-1;
while (deci>0)////parte decimal
{aux=ayudante[ii];
k=deci;
while(k>0)///haciendo decimales
{aux=aux/10;
k--;
}
deci--;
ii--;
suma=suma+aux;
// cout<<"\n suma="<<suma;
}
if (kk==1)/////////signo negativo
{traza.push_back(suma*-1);
}
else
{traza.push_back(suma);
}
// for(int ii=0;ii<traza.size();ii++)////mostrando ayudante
// {cout<<"\n traza["<<ii<<"]="<<traza[ii];}
ayudante.clear();
/////////////haciendo visajes
int tamanotraza=traza.size();
///////////////
/////////////llamado a histograma
histograma(traza[]);
///////////////////////
return 0;
}
///////////////funcion HISTOGRAMA
void histograma(float trazas[] )
{
int contfre=0;
simbolos.push_back(traza[0]);
for (int ii=0;ii<traza.size();ii++)
{if (traza[ii]==traza[0])
{contfre++;}
}
frecuencias.push_back(contfre);
cout<<"\n simbolos[0]="<<simbolos[0];
cout<<"\n frecuencias[0]="<<frecuencias[0];
for (int i=1;i<traza.size();i++)
{int cont=0;
int contfre=0;
for (int ii=0;ii<simbolos.size();ii++)
{if (traza[i]==simbolos[ii])
{cont++;
break;}
}
if (cont==0)
{simbolos.push_back(traza[i]);
for (int ii=i;ii<traza.size();ii++)
{if (traza[ii]==traza[i])
{contfre++;}
}
frecuencias.push_back(contfre);
}
}
for(int ii=0;ii<simbolos.size();ii++)
{cout<<"\n simbolos["<<ii<<"]="<<simbolos[ii];
cout<<"\n frecuencias["<<ii<<"]="<<frecuencias[ii];}
float sumama=0;
for(int ii=0;ii<simbolos.size();ii++)
{sumama=sumama+frecuencias[ii];}
cout<<"\n sumama="<<sumama;
for(int ii=0;ii<simbolos.size();ii++)
{float ayuda=0;
ayuda=frecuencias[ii]/sumama;
probabilidades.push_back(ayuda);
cout<<"\n probabilidades["<<ii<<"]="<<probabilidades[ii];}
float sumamam=0;
for(int ii=0;ii<simbolos.size();ii++)
{sumamam=sumamam+probabilidades[ii];}
cout<<"\n sumamam="<<sumamam;
}
Justo ahora me fuí del pc. Como no puedo probar el código, te puedo sugerir que pongas "historigrama(traza)", sin los corchetes. Si aún así sigue sin ir, pon por aquí el error que te da.
Enviado desde mi ST21i mediante Tapatalk
al quitarle los corchetes me da el siguiente error
cannot convert `std::vector<float, std::allocator<float> >' to `float' for argument `1' to `void histograma(float)'
void histograma(float trazas ) asi declare la funcion
histograma(traza); asi la llamo
void histograma(float trazas[] )
Te has equivocado al declarar el argumento, sería más bien así:
void histograma(vector<float> &trazas)
realice los cambios y me sigue dando error
a function-definition is not allowed here before '{' token
revise todos las llaves y las tengo completas, entonces el error debe ser en la forma de declarar la funcion creo yo
Sin ver el código no sabría decirte.
ya arregle el problema, al declarar las funciones como me dijiste si funciono, muchas gracias, sin embargo ahora necesito que la funcion histograma me devuelva dos vectores (simbolos y frecuencias) y pues estoy en eso
Puedes pasar los parametros por referencia o devolver una estructura:
struct datos
{
vector<float> Datos;
vector<float> Frecuencias;
}
Datos Histograma(vector<float> &trazas)
Otra solución más "express" es devolver una pareja (pair):
pair<vector<float>,vector<float> > Histograma(vector<float> &trazas)
Para más información sobre la estructura "pair":
https://www.youtube.com/watch?v=6Xqhqn15Bgo
cree una estructura dentro de la funcion histograma de la siguente forma:
struct datos
{
std::vector<float> simbolos;
std::vector<float> frecuencias;
}cd1;
y en cd1 copie los vectores frecuencias y simbolos, pero no se como devolver cd1, creo q lo que tengo mal es la declaracion de la funcion histograma ¿como deberia declarar esa funcion para que pueda retornar una estructura?
No declares la estructura dentro de la función. Declárala como global y usa una función del tipo de tu estructura, tal como te ha indicado amchacon.
De todas formas, te recomiendo que lo hagas por referencias. Es mucho más fácil y te ahorras tener que declarar una estructura nueva.
Ya pude arreglar las dificultades declarando las funciones, pero al ejecutar el programa en su totalidad se me presenta un error que es el siguiente:
se ha producido una violacion de acceso a memoria
dicho error se presenta cuando estoy intentando ejecutar la siguiente linea:
d.push_back(sumpar);
no entiendo porque se presenta el error si solamente le estoy diciendo q escriba en el vector el valor de sumpar, no se si es un problema de falta de memoria o algo asi, cualquier ayuda les agradeceria mucho. nota: estoy trabajando en Dev c++4.9.9.2
Es posible que el error se esté produciendo en la línea inmediatamente anterior...
pues no creo, estas son las lineas anteriores:
while (sumpar<=tem/2)//operacion principal de shannon-fano, ir dividiendo en la mitad las frecuencias
{sumpar=sumpar+vida.frecuencias[v];
u=u+1;
v=v+1;
}
if (u>1) //quito una para q qde siempre por debajo de la mitad o en la mitad
{
sumpar=sumpar-vida.frecuencias[v-1];
u=u-1;
}
d.push_back(sumpar);