paca6
-
Upload
stefan-popa -
Category
Documents
-
view
212 -
download
0
description
Transcript of paca6
Proiectarea Asistata de Calculator pentru Avionica-PACA
Prelegere 6Elemente de limbaj C Librarii, Exemple de aplicaii complexe
Cuprins: 1. Crearea i utilizarea de librrii statice (.lib)2. Crearea i utilizarea de librrii dinamice (.dll)3. Aplicaie pentru calcul balistic;4. Aplicaie pentru transformare coordonate GPS;1. Crearea i utilizarea de librrii statice (.lib)Exemplu 1 Realizarea si utilizarea unei librarii matematice statice pentru cele 4 operaii aritmetice
// MathFuncsLib.h
// definirea unui header cu descrierea librariei
namespace MathFuncs
{
class MyMathFuncs
{
public:
// Returns a + b
static double Add(double a, double b);
// Returns a - b
static double Subtract(double a, double b);
// Returns a * b
static double Multiply(double a, double b);
// Returns a / b
static double Divide(double a, double b);
};
}
// MathFuncsLib.cpp
// compile with: /c /EHsc
// post-build command: lib MathFuncsLib.obj
// surse din librarie
#include "MathFuncsLib.h"
#include
using namespace std;
namespace MathFuncs
{
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}
double MyMathFuncs::Subtract(double a, double b)
{
return a - b;
}
double MyMathFuncs::Multiply(double a, double b)
{
return a * b;
}
double MyMathFuncs::Divide(double a, double b)
{
return a / b;
}
}
// MyExecRefsLib.cpp
// compile with: /EHsc /link MathFuncsLib.lib
// aplicatie cu utilizarea librariei "MathFuncsLib.h"//#include
#include "stdafx.h"
#include "MathFuncsLib.h"
using namespace MathFuncs;
int main()
{
double a = 7.4;
int b = 99;
//double s,d, p, i;
//s=MathFuncs::MyMathFuncs::Add(a, b);
//d=MathFuncs::MyMathFuncs::Subtract(a, b);
//p=MathFuncs::MyMathFuncs::Multiply(a, b);
//i=MathFuncs::MyMathFuncs::Divide(a, b);
printf("a + b = %f\n",MathFuncs::MyMathFuncs::Add(a, b) );
printf("a - b = %f\n",MathFuncs::MyMathFuncs::Subtract(a, b));
printf("a * b = %f\n",MathFuncs::MyMathFuncs::Multiply(a, b));
printf("a / b = %f\n",MathFuncs::MyMathFuncs::Divide(a, b));
return 0;
}
2 Crearea i utilizarea de librrii dinamice (.dll);Librria dinamic va conine module executabile, care vor fi legate la execuie.
Avantajele librriei dinamice const n faptul c nu utilizeaz din librrie dect secvena de cod care intr n execuie. Se poate modifica librria fr s fie nevoie s rebildm ntreaga aplicaie.
Exemplu 2 Realizarea si utilizarea unei librarii matematice dinamice pentru cele 4 operaii aritmetice (reluarea exemplului de la librriile statice)a) definirea unui header cu descrierea librariei
// MathFuncsDll.h
#ifdef MATHFUNCSDLL_EXPORTS
#define MATHFUNCSDLL_API __declspec(dllexport)
#else
#define MATHFUNCSDLL_API __declspec(dllimport)
#endif
namespace MathFuncs
{
// This class is exported from the MathFuncsDll.dll
class MyMathFuncs
{
public:
// Returns a + b
static MATHFUNCSDLL_API double Add(double a, double b);
// Returns a - b
static MATHFUNCSDLL_API double Subtract(double a, double b);
// Returns a * b
static MATHFUNCSDLL_API double Multiply(double a, double b);
// Returns a / b
// Throws const std::invalid_argument& if b is 0
static MATHFUNCSDLL_API double Divide(double a, double b);
};
}
B) surse din librarie// MathFuncsDll.cpp : Defines the exported functions for the DLL application.
//
#include "stdafx.h"
#include "MathFuncsDll.h"
#include
using namespace std;
namespace MathFuncs
{
double MyMathFuncs::Add(double a, double b)
{
return a + b;
}
double MyMathFuncs::Subtract(double a, double b)
{
return a - b;
}
double MyMathFuncs::Multiply(double a, double b)
{
return a * b;
}
double MyMathFuncs::Divide(double a, double b)
{
return a / b;
}
}
c) aplicatie cu utilizarea librariei MathFuncsDll.lib
/// MyExecRefsDll.cpp
// compile with: /EHsc /link MathFuncsDll.lib
#include "stdafx.h"
#include "MathFuncsDll.h"
using namespace MathFuncs;
int main()
{
double a = 7.4;
int b = 99;
printf("a + b = %f\n",MathFuncs::MyMathFuncs::Add(a, b) );
printf("a - b = %f\n",MathFuncs::MyMathFuncs::Subtract(a, b));
printf("a * b = %f\n",MathFuncs::MyMathFuncs::Multiply(a, b));
printf("a / b = %f\n",MathFuncs::MyMathFuncs::Divide(a, b));
return 0;
}3. Aplicaie calcul balistic
#include
#include
// DEFINITII
/* P H Y S I C A L C O N S T A N T S */
#define TZERO 288.15 /* sea-level temperature, deg K */
#define PZERO 101325.0 /* sea-level pressure, N/sq.m */
#define RHOZERO 1.225 /* sea-level density, kg/cu.m */
#define AZERO 340.294 /* speed of sound at S.L. m/sec */
#define BETAVISC 1.458E-6 /* viscosity constant */
#define SUTH 110.4 /* Sutherland's constant deg K */
#define pi 3.1415926536
#define Rp 6356766.0 // raza pamintului in metri
// constante
double rg=180./pi;
double rmi = 3000./pi;
double grm = 3000./180.;
//date comune
int ist,inc;
double ga0, hi0,m,S,d,alp,bep,yc,poo,too,doo,eps,V0,xpv,zpv; // incarcatura
double y[6],yp[6],rez[7],t,dummy,tb,xb,zb,xpt,ypt,zpt,xt,yt,zt,gamin, gamax, distm; // elemente program de calcul
void cit();
double g0();
void step( double, double);
void RK4(double t,double tfin,double y[6], double eps);//prototipul functiei de integrare Runge-Kutta de ordinul 4 cu pas variabil
void F(double t, double y[6]); // prototipul functiei de calcul derivate
void atms (double, double, double, double , double*, double*, double*, double*);
double Cx(double );
double lin(int ,double xl[],double yl[],double );
void SimpleAtmosphere(const double, double*, double*, double*);
double MetricViscosity(const double);
FILE *pfw, *pfr;
Funcia principala
void main()
{
double epsd,dga,dhi,ga2,hi2,Dx2,Dz2,DDx,DDz,ga1,hi1,prag;
double Dx1,Dz1,Dx0,Dz0,Dg,Dh,dung,dist,gam,him,xbm,zbm,xl,zl,eroare,ung_vert,ung_oriz;
int i;
ist=0;
pfw=fopen("rez.dat","w");
cit ();
if(ist==1) return;
epsd=1.;
prag=0.00001;
ga0=ga0*rmi;
hi0=hi0*rmi;
dga=1.;
dhi=1.;
ga2=ga0+dga;
hi2=hi0+dhi;
step(ga2/rmi,hi2/rmi);
if(ist==1) return;
Dx2=xb-xt;
Dz2=zb-zt;
ga1=ga0-dga;
hi1=hi0-dhi;
step(ga1/rmi,hi1/rmi);
if(ist==1) return;
Dx1=xb-xt;
Dz1=zb-zt;
for(i=0;i=1)
{
ga2=ga1;
ga1=ga0;
hi2=hi1;
hi1=hi0;
Dx2=Dx1;
Dx1=Dx0;
Dz2=Dz1;
Dz1=Dz0;
}
DDx=Dx2-Dx1;
DDz=Dz2-Dz1;
if(fabs(DDx)