paca6

22
Proiectarea Asistata de Calculator pentru Avionica-PACA Prelegere 6 Elemente de limbaj C Librarii, Exemple de aplicaţii complexe Cuprins: 1. Crearea şi utilizarea de librării statice (.lib) 2. Crearea şi utilizarea de librării dinamice (.dll) 3. Aplicaţie pentru calcul balistic; 4. Aplicaţie pentru transformare coordonate GPS; 1. Crearea şi utilizarea de librării statice (.lib) Exemplu 1 Realizarea si utilizarea unei librarii matematice statice pentru cele 4 operaţii 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 <stdexcept>

description

curs paca 6

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)