ayuda con funciones

Iniciado por loadenro, 2 Abril 2014, 22:51 PM

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

loadenro

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

ivancea96

Dices donde está el problema, pero cuál es. Muestra el código que falla, que de error, o que no funcione bien.

loadenro

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;

  }



ivancea96

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

loadenro

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

amchacon

Código (cpp) [Seleccionar]
void histograma(float trazas[] )

Te has equivocado al declarar el argumento, sería más bien así:
Código (cpp) [Seleccionar]
void histograma(vector<float> &trazas)
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

loadenro

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

amchacon

Sin ver el código no sabría decirte.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

loadenro

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

amchacon

Puedes pasar los parametros por referencia o devolver una estructura:
Código (cpp) [Seleccionar]
struct datos
{
   vector<float> Datos;
   vector<float> Frecuencias;
}

Datos Histograma(vector<float> &trazas)


Otra solución más "express" es devolver una pareja (pair):
Código (cpp) [Seleccionar]
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
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar