Не компилируется программа на си

Тема в разделе "C/C++/C#", создана пользователем Alexeych, 29 май 2011.

Статус темы:
Закрыта.
  1. Alexeych

    Alexeych Гость

    <div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">"Процесс наблюдатель"</div></div><div class="sp-body"><div class="sp-content">//Процесс наблюдатель
    #include <semaphore.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <signal.h>
    #include "sys_reg.h"
    #include <mqueue.h>

    sembuf smb;
    int dmem, dsem;
    char* pmem;
    //sem_t *sm1, *sm2;
    mqd_t mq1, mq2;
    unsigned prio;
    unsigned l;


    const int n=3;
    double Yobs[n];

    double K[n] ={0.24669,0.04649,0.00127};

    //Коэффициенты полиномов передаточной функции
    double c0=1.19757,c1=0.77976,c2=0.58849;
    double z0=0.0067326,z1=0.0735102,z2=0.3533101;

    typedef void (*mdl)(double t, double* py, double* py1);
    void init_rk(int N);
    void done_rk();
    void rkt4(double t, double dt, double* py, mdl model, int N_s);
    void mod_obs(double t, double* py, double* py1);
    double dto;
    double Yout, eps;

    FILE *fx, *fy;

    void observer(){

    rkt4(*tc,(*dt),Yobs,mod_obs,3);
    Yout = Yobs[0]*c0+Yobs[1]*c1+Yobs[2]*c2;
    eps=*Yt-Yout;

    //для проверки наблюдателя в асинхронном режиме
    fprintf(fx,"%f %f %f %f %f %f %f\n",*tc,Yst[0],Yobs[0],Yst[1],Yobs[1],Yst[2],Yobs[2]);
    fprintf(fy,"%f %f %f \n",*tc,*Yt,Yout);

    Yst[0]=Yobs[0];// Это работа наблюдателя
    Yst[1]=Yobs[1];// Для отключения наблюдателя
    Yst[2]=Yobs[2];// закомментировать

    }

    void term(int s){
    fclose(fx);
    fclose(fy);
    done_rk();
    fprintf(stderr,"наблюдатель - завершение работы\n");
    exit(0);
    }

    int main(int argc, char **argv)
    {
    fprintf(stderr,"Наблюдатель - запуск\n");
    signal(SIGTERM,term);
    dsem=semget(SEM, 5, IPC_CREAT | S_IRUSR | S_IWUSR);
    set_shmem(dmem,pmem);

    //sm1=sem_open("/sem1", O_RDWR | O_CREAT, 0660, 0);
    //sm2=sem_open("/sem2", O_RDWR | O_CREAT, 0660, 0);
    mq1=mq_open("/mq1", O_RDWR, 0660, 0);
    mq2=mq_open("/mq2", O_RDWR, 0660, 0);

    *pobs=getpid();
    smb.sem_num=0;
    smb.sem_flg=0;
    smb.sem_op=-1;

    init_rk(n);
    Yobs[0]=Yobs[1]=Yobs[2]=0.0;

    Yout = Yobs[0]*c0+Yobs[1]*c1+Yobs[2]*c2;
    eps=*Yt-Yout;

    fx=fopen("state_var.dat","w");//для проверки работы наблюдателя
    fy=fopen("observer.dat","w"); //в асинхрноом режиме

    semop(dsem,&smb,1); //даем знать диспетчеру о готовности к работе

    while(1){
    //sem_wait(sm1);//ждем освобождения семафора
    mq_receive(mq1,(char*)&l, 8*1024,&prio);
    observer(); //наблюдаем объект
    //sem_post(sm2);//сообщаем о завершении работы
    mq_send(mq2, (char*)&l,sizeof(int), 5);
    }

    return 0;
    }


    double* k[4], *py1, *pdy;

    void mod_obs(double t, double* py, double* py1){
    double V=*Uo;
    py1[0]=py[1]+K[0]*eps;
    py1[1]=py[2]+K[1]*eps;
    py1[2]=V-py[0]*z0-py[1]*z1-py[2]*z2+K[2]*eps;
    }

    void init_rk(int N){
    int i;
    for (i=0; i<4; i++)
    k=(double*)calloc(N, sizeof(double));
    py1=(double*)calloc(N, sizeof(double));
    pdy=(double*)calloc(N, sizeof(double));
    }

    void done_rk(){
    int i;
    for (i=0; i<4; i++)
    delete[] k;
    delete[] py1;
    delete[] pdy;
    }

    void rkt4(double t, double dt, double* py, mdl model, int N_s){
    int i;
    for (i=0; i<N_s; i++) pdy=py;
    model(t,pdy,py1);
    for (i=0; i<N_s; i++) k[0]=dt*(py1);
    for (i=0; i<N_s; i++) pdy=py+k[0]/2.0;
    model(t+dt/2.0,pdy,py1);
    for (i=0; i<N_s; i++) k[1]=dt*(py1);
    for (i=0; i<N_s; i++) pdy=py+k[1]/2.0;
    model(t+dt/2.0,pdy,py1);
    for (i=0; i<N_s; i++) k[2]=dt*(py1);
    for (i=0; i<N_s; i++) pdy=py+k[2];
    model(t+dt,pdy,py1);
    for (i=0; i<N_s; i++) k[3]=dt*(py1[i]);
    for (i=0; i<N_s; i++){
    pdy[i]=(k[0][i]+2.0*k[1][i]+2.0*k[2][i]+k[3][i])/6.0;
    py[i]+=pdy[i];
    }
    }


    При попытке скомпилировать программу, выводится следующее сообщение
    /home/alexey/2011rt/obs.o||In function `main':|
    obs.cc:(.text+0x325)||undefined reference to `mq_open'|
    obs.cc:(.text+0x34e)||undefined reference to `mq_open'|
    obs.cc:(.text+0x465)||undefined reference to `mq_receive'|
    obs.cc:(.text+0x490)||undefined reference to `mq_send'|
    ||=== Build finished: 4 errors, 0 warnings ===|
    Помогите исправить, заранее благодарен[/i][/i][/i][/i][/i][/i][/i][/i]
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Тут код не при чем. Подключи библиотеку необходимую для mqueue (-lrt ??)
     
  3. Alexeych

    Alexeych Гость

    А какая библиотека необходима для mqueue?
    Я думал, что это может быть из-за отсутствия библиотеки, но не нашел какую именно нужно подключить
     
  4. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
     
  5. Alexeych

    Alexeych Гость

    Спасибо за помощь, помогло
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей