Errore di segmentazione (core dump creato) - C++

di il
4 risposte

Errore di segmentazione (core dump creato) - C++

Aiutoooo, allora: sto facendo pratica con la libreria odeint di c++ per scrivere eq differenziali...
questa e' una prova in cui tento (nel file "prova_c.cpp") di passare i vettori dello stato ad un altro file "prova_e.h" in cui risolvo numericamente l'equazione e restituisco il vettore al.cpp per stampare i risultati.
nei 2 file uso librerie diverse perchè, nel grosso programma in cui usero' davvero l'equazione, ho scritto vettori e matrici con eigen mentre Odeint sembra lavori solo con std::vector.
questi sono i 2 codici:
prova_c.cpp
    #include <stdio.h>
    #include <iostream>
    #include <Eigen/Dense>
    #include <vector>
    #include <home/acer/tut_eigen/prova_e.h>
       using namespace std;

     using namespace Eigen;

    typedef std::vector< float > state_type;
        Vector3f x(10.0,1.0,1.0);// initial conditions

    Vector3f dxdt(sigma * ( x(1) - x(0) ),R * x(0) - x(1) - x(0) * x(2),-b * x(2) + x(0) * x(1));

    int main(){

    state_type g(x.size());
    for (int i=0;i<=x.size()-1;i++){
    g[i]=x(i);
    }

    state_type dgdt(dxdt.size());
    for (int i=0;i<=dxdt.size()-1;i++){
    dgdt[i]=dxdt(i);

    }

    vector<state_type> vec;
       state_type tempi;


    prova_e( tempi,  vec,  g, dgdt);


    int w=tempi.size();
    Eigen::VectorXf times(w);

    for (int i=0;i<=tempi.size()-1;i++){
    times(i)=tempi[i];
    }
     

    Eigen::Matrix<float,Dynamic, 3 > x_vec;

    for (int i=0;i<=tempi.size()-1;i++){
    x_vec(i,0)=vec[i][0];
    x_vec(i,1)=vec[i][1];
    x_vec(i,2)=vec[i][2];
    }

       /* output */

            cout << times << '\t' << x_vec << '\n';
       
        //]
    return 0;
    }
prova_e.h
    #include <iostream>
    #include <vector>
    #include <home/acer/boost/numeric/odeint.hpp>
        using namespace std;
        using namespace boost::numeric::odeint;
    typedef std::vector< float > state_type;
     const float sigma = 10.0;
    const float R = 28.0;
    const float b = 8.0 / 3.0;
    int pp=0;

    void equation( const state_type &x , state_type &dxdt , double t )
    {
        dxdt[0] = sigma * ( x[1] - x[0] );
        dxdt[1] = R * x[0] - x[1] - x[0] * x[2];
        dxdt[2] = -b * x[2] + x[0] * x[1];
    }

    void write_equation( const state_type &x , const float t )
    {
    vector<state_type> x_vec;
        vector<float> times;

    pp++;

        times[pp]=t;
    x_vec [pp][0]=x[0];
    x_vec [pp][1]=x[1];
    x_vec [pp][2]=x[2];
    }

    void prova_e( state_type& times, vector<state_type>& x_vec, state_type x, state_type dxdt)
    {

    void equation( const state_type &x , state_type &dxdt , double t );

        integrate( equation , x , 0.0 , 25.0 , 0.1 , write_equation );

    }
non so quanti errori ci siano....so solo che quando tento di compilare il terminale mi da:
Errore di segmentazione (core dump creato)

aiutatemi per favoreeeeee
grazie!

4 Risposte

  • Re: Errore di segmentazione (core dump creato) - C++

    Il core dump te lo da in esecuzione non in compilazione!
    Per trovarlo il modo più semplice è compilare con l'opzione di debug -g ed eseguire sotto gdb. Al core dump se non ti viene riferito il punto scrivi "where" per avere un back trace dello stack frame.
  • Re: Errore di segmentazione (core dump creato) - C++

    Si si...sorry, volevo dire esecuzione.
    dato che e' circa 1 mese che uso ubuntu (perche devo lavorare con ros) potresti scrivermi i comandi per intero?....nn sono molto pratico
    grazie mille!
  • Re: Errore di segmentazione (core dump creato) - C++

    Non sono capace di simulare un core-dump su un 64bit, se qualcuno mi scrive qualche riga ringrazio.
    La prassi consiste nel verificare eventuali warnings in fase di compilazione con -Wall e aggiungere le informazioni di debug con -g. Faccio un esempio di errore dentro una funzione della libc per vedere la traccia dello stack prima del segnale e risalire alla riga del sorgente che lo ha causato:
    
    max@studio:~> cat -b prova.c
         1  #include <stdio.h>
         2  int main ()
         3  {
         4          char *a=(char *)0;
         5          puts (a); // <-- SIGSEGV !!!
         6          return 0;
         7  }
    max@studio:~> gcc -Wall -g prova.c
    max@studio:~> gdb -q ./a.out
    Reading symbols from /home/max/a.out...done.
    (gdb) run
    Starting program: /home/max/a.out 
    
    Program received signal SIGSEGV, Segmentation fault.
    0x00007ffff7aef7e2 in __strlen_sse2 () from /lib64/libc.so.6
    (gdb) where
    #0  0x00007ffff7aef7e2 in __strlen_sse2 () from /lib64/libc.so.6
    #1  0x00007ffff7ad7d3b in puts () from /lib64/libc.so.6
    #2  0x0000000000400550 in main () at prova.c:5
    (gdb) break 5
    Breakpoint 1 at 0x400544: file prova.c, line 5.
    (gdb) run
    The program being debugged has been started already.
    Start it from the beginning? (y or n) y
    Starting program: /home/max/a.out 
    
    Breakpoint 1, main () at prova.c:5
    5               puts (a);
    (gdb) print a
    $1 = 0x0
    (gdb) quit
    A debugging session is active.
    
            Inferior 1 [process 12345] will be killed.
    
    Quit anyway? (y or n) y
    max@studio:~> 
    
    gdb funziona in terminale e bisogna conoscere i comandi base (help all per una lista dei comandi).
    Un'alternativa consiste nell'appoggiarsi ddd, un front-end grafico che richiama sempre gdb @back end... Insomma sto GDB è il debugger ufficiale
  • Re: Errore di segmentazione (core dump creato) - C++

    In ogni caso il problema è nella funzione: write_equation.
    Stai definendo un vector<state_type> senza dargli una dimensione.
    Dato che state_type è a sua volta un vector<float> stai creando una matrice senza dimensione.
    Usare operator[] su un vector senza dimensione da comportamento indefinito.
    Stesso discorso per times.

    Soluzione: usare push_back() per inserire gli elementi.

    P.S.
    scrivere: i<=tempi.size()-1 equivale a i<tempi.size()
Devi accedere o registrarti per scrivere nel forum
4 risposte