Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - loadenro

#1
Tengo dos funciones, en la primera construyo dos vectores, uno de ellos lo declaro en una estructura y lo nombro elementos,
struct temporales
{std::vector<float> c; //guarda la suma de frecuencias
std::vector<int> cc;//guarda cuantos simbolos suman cada frecuencia
std::vector<float> d;
std::vector<int> elementos;
int XXX;
int numcol;//numero de columna en dic
int numfil;//numero de fila en dic
std::vector<int> posiciones;// nos dice cual fue la posicion del simbolo que salio
int contiteraciones;//numero de iteraciones, se guarda en numerobits
std::vector<float> finalfrecuencias; //las frecuencias pasan a este vector cuando ya se obtiene el codigo para el respectivo simbolo
int tamanovectord;
}paquete;


la funcion en la cual lo construyo es la siguiente:
void funcionprincipal(datos &prioritarios, temporales &secundarios)
{if (secundarios.XXX>0) //para q copie d en c despues de la primera iteración
      {
                      secundarios.tamanovectord=secundarios.d.size();
                  secundarios.c.clear();
                  secundarios.cc.clear();
                  for(int iii=0;iii<secundarios.elementos.size();iii++)
                    {cout<<"\n d["<<iii<<"]="<<secundarios.d[iii];
                    cout<<"\n elementos["<<iii<<"]="<<secundarios.elementos[iii];}
                  for (int i=0;i<secundarios.tamanovectord;i++)
                  { secundarios.c.push_back(secundarios.d[i]); //copio d en c
                  secundarios.cc[i]=secundarios.elementos[i];// copio elementos en cc
                 
                  }           
      }  secundarios.tamanovectord=secundarios.d.size();

                    secundarios.XXX++;
                    secundarios.d.clear();
                    secundarios.elementos.clear();
                    for(int iii=0;iii<secundarios.c.size();iii++)
                    {cout<<"\n c["<<iii<<"]="<<secundarios.c[iii];
                    cout<<"\n cc["<<iii<<"]="<<secundarios.cc[iii];}
                   
int t=0;
int v=0;
int w=0;

int u=0;

for (;;)//en este ciclo se cambia de columna en el vector c
{
    float valortomadoc=secundarios.c[w];
    u=0;
        if (secundarios.cc[w]>1)//necesitamos mas de un simbolo para dividir el valor guardado en c[w]
                    {float sumaparcial=0;
                    while (sumaparcial<=valortomadoc/2)//operacion principal de shannon-fano, ir dividiendo en la mitad las frecuencias
                    {sumaparcial=sumaparcial+prioritarios.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
              {
                           sumaparcial=sumaparcial-prioritarios.frecuencias[v-1];
                           u=u-1;
                          }
secundarios.d.push_back(sumaparcial);
secundarios.elementos.push_back(u);
secundarios.d.push_back(secundarios.c[w]-secundarios.d[t]);
secundarios.elementos.push_back(secundarios.cc[w]-secundarios.elementos[t]);
for(int iii=0;iii<secundarios.elementos.size();iii++)
                    {cout<<"\n d["<<iii<<"]="<<secundarios.d[iii];
                    cout<<"\n elementos["<<iii<<"]="<<secundarios.elementos[iii];}
v=0;
                for (int i=0;i<secundarios.d.size();i++)
{v=v+secundarios.elementos[i];
}
t=t+2;
w=w+1;
        if (w+1>secundarios.tamanovectord)
      {         
        break;
        }
}// termina if para armar d
else {w=w+1;}
}//termina for para armar d
}

despues lo paso a la siguiente funcion:
void asignacion(diccionario &prioritarios1, temporales &secundarios1)
{secundarios1.numfil=0;
int enemigo=secundarios1.d.size();
for (int au=0;au<enemigo;au++)
{   cout<<"\n"<<secundarios1.elementos.size();
    int valord=secundarios1.elementos[au];
    int p=0;
    int pop=1;
    //cout<<"\n numfil="<<numfil;
    while (p<valord)
    {     while (pop<=secundarios1.posiciones.size())//buscamos los simbolos que ya tienen un codigo, para no poner bits en sus codigos
          {     if (secundarios1.numfil==secundarios1.posiciones[pop-1])
                    {//cout<<"\n no entre a fila="<<secundarios.numfil;
                   secundarios1.numfil++;
                   pop=1;
                   }
                   else
                   {pop++;
                   }
          }
          int residuo=au%2;//miramos si la posicion es par o impar, asi sabemos si debemos poner 0 o 1
          if (residuo==0)
          {
                     //cout<<"\n numfil="<<numfil;
                     prioritarios1.dic[secundarios1.numfil][secundarios1.numcol]=0;
          }
          else
          {
              prioritarios1.dic[secundarios1.numfil][secundarios1.numcol]=1;
          }
          secundarios1.numfil++;
          p++;
    }
  }
secundarios1.numcol++;
}   


el lio es que al terminar la ejecucion de la segunda funcion el vector me cambia de tamaño sin desear esto, es decir, cuando ejecuto por primera vez construyo un vector de solo 2 posiciones, pero cuando termina la ejecucion de la segunda funcion el vector ha cambiado su tamaño a 11 elementos, y en la segunda funcion lo unico q hago es leer los elementos del vector, nunca los altero
#2
Desarrolle un programa en c++, al compilar no me da error, pero cuando esta ejecutándose me sale  "se ha producido una violación de acceso a memoria", estudiando el código paso a paso observe q el error aparece cuando estoy ejecutando la siguiente linea:
d.push_back(sumpar);
es decir cuando intento escribir al final de un vector; en el momento que intento escribir en el vector este ya tiene 8 elementos, pero el vector fue declarado utilizando la libreria estandar por lo cual no tiene asignado un tamaño fijo, cual quier posible solucion me serviria de mucho
#3
Programación C/C++ / ayuda con funciones
2 Abril 2014, 22:51 PM
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