• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

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

  • Автор темы Alexeych
  • Дата начала
Статус
Закрыто для дальнейших ответов.
A

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);
for (i=0; i<N_s; i++){
pdy=(k[0]+2.0*k[1]+2.0*k[2]+k[3])/6.0;
py+=pdy;
}
}


При попытке скомпилировать программу, выводится следующее сообщение
/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 ===|
Помогите исправить, заранее благодарен
 
L

lazybiz

Тут код не при чем. Подключи библиотеку необходимую для mqueue (-lrt ??)
 
A

Alexeych

А какая библиотека необходима для mqueue?
Я думал, что это может быть из-за отсутствия библиотеки, но не нашел какую именно нужно подключить
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!