Distribuzione di frequenza [c++]

di il
4 risposte

Distribuzione di frequenza [c++]

Ho scritto un programma che legge da un file una serie di valori double e una volta trovati minimo e massimo dovrebbe suddividere i valori assegnando ciascuno al suo intervallo (il numero di intervalli è deciso dall'utente). Questo programma girava tranquillamente fino all'altro giorno e non capisco perché ora mi vada in crush
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

double *a;

void resize (int at,int* &veclen,double** &vect,double value);

int main()
{
    ifstream inn;
    ofstream outt;
    string filename;
    int inter,pos,*veclength;
    double value,max,min,**vec;

    cout << "Inserire file di input: ";
    cin >> filename;

    inn.open(filename.c_str());
    outt.open("distribution.txt");

    cout << "Numero di intervalli: ";
    cin >> inter;

    vec = new double* [inter];
    veclength = new int [inter];

    for(int i=0; i<inter; i++)
        veclength[i]=0;

    inn >> value;
    max = value;
    min = value;

    while(inn)
    {
        inn >> value;

        if(value > max)
            max = value;
        if(value < min)
            min = value;
    }

    inn.close();

    inn.open(filename.c_str());

    while(inn)
    {
        inn >> value;

        if(value == max)                   // il valore di massimo deve rientrare nell'intervallo subito precedente
        {
            resize(inter-1,veclength,vec,value);
            continue;
        }

        pos = (value-min)*inter/(max-min);          // algoritmo per distribuzione
                                                    // di frequenza
        resize (pos,veclength,vec,value);
    }

    inn.close();

    for(int i=0; i<inter; i++)
        outt << veclength[i] << endl;

    for(int i=0; i<inter;i++)
    {
        cout << "Da " << min+i*(max-min)/inter << " a " << min+(i+1)*(max-min)/inter
             << endl;

        for(int j=0; j<veclength[i];j++)
            cout << vec[i][j] << " ";

        cout << endl;
    }

    outt.close();

    return 0;
}

void resize (int at,int* &veclen,double** &vect,double value)
{
    a = new double[veclen[at]];
    for(int i=0;i<veclen[at];i++)
        a[i] = vect[at][i];

    delete [] vect[at];

    veclen[at]++;
    vect[at] = new double[veclen[at]];

    for(int i=0;i<veclen[at]-1;i++)
        vect[at][i] = a[i];

    vect[at][veclen[at]-1] = value;
}
Posto anche un esempio di file di input
5.74
5.27
0.72
0.24
1.85
2.47
3.48
4.16
7.51
4.60
5.35
5.23
2.22
5.29
5.05
3.48
2.86
3.48
5.41
4.75
5.31
4.95
3.98
5.33
5.57
2.59
5.20

4 Risposte

  • Re: Distribuzione di frequenza [c++]

    Il crash (non crush) l'hai nella funzione resize.
  • Re: Distribuzione di frequenza [c++]

    Perché? Cos'è che non va bene?
  • Re: Distribuzione di frequenza [c++]

    No lo so, non ho controllato ma il crash avviene nella delete della resize
  • Re: Distribuzione di frequenza [c++]

    L'unica cosa che mi può venire in mente è che alla prima iterazione vect[at][ ] non esiste. Non so se questo può mandare in crash il programma. In compenso quando ho fatto la prova col debugger non mi dava problemi con la prima iterazione. A dirla tutta il debugger mi si bloccava sulla lettura del valore dal file
Devi accedere o registrarti per scrivere nel forum
4 risposte