makroprocesori n.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Makroprocesori PowerPoint Presentation
Download Presentation
Makroprocesori

Loading in 2 Seconds...

play fullscreen
1 / 13

Makroprocesori - PowerPoint PPT Presentation


  • 72 Views
  • Uploaded on

Makroprocesori. Zadatak.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Makroprocesori' - rhona


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
zadatak
Zadatak
  • Navesti jedan primer ugneždene parametrizovanemakroekspanzije po sintaksi Cpretprocesora. Makrodefinicija treba da ima jedan parametar X koji se dva puta pojavljuje u telu makroa: jednom bez operatora ## i drugi put sa njim. Potrebno je navesti ulazni program, kao i izlaz pretprocesora.
  • Jedno od mogućih rešenja:

#define MACRO(X) X, X ## 1

#define ORIGINAL ZAMENA

MACRO(ORIGINAL)

  • Ovaj ulazni tekst daće sledeći izlaz:

ZAMENA, ORIGINAL1

  • Pretprocesiranje fajlova:
    • Gcc:

gcc -E <naziv ulaznog fajla>

    • Microsoft Visual Studio (iz konzole Microsoft VS):

cl -E <naziv ulaznog fajla>

zadatak1
Zadatak
  • Definisati strukturu podataka u kojoj biste pamtili jednu makrodefiniciju C pretprocesora u okviru tabele makrodefinicija (tabelu nije potrebno elaborirati). Navesti kako biste popunili tu strukturu podataka primerom makrodefinicije iz rešenja tačke a)?
  • Napomena: Prihvatljiva su i druga rešenja, ovde će biti opisano jednostavnije koje zadovoljava postavku zadatka:

structMdef{

char Name[100]; // imemakrodefinicije

intnumArgs; // brojformalnihargumenata,

// -1 akomakronemazagradu

char Body[1000];// telomakrodefinicije

// U telusa @ioznačena je normalna

// upotreba makroargumenta, a sa

// #i upotreba sa operatorom ##

}

  • Struktura za MACRO bila bi popunjena na sledeći način:

structMdef{ "MACRO", 1, "@1, #1 ## 1 }

zadatak2
Zadatak
  • Jedan makroprocesor tekst obrađuje na nivou pojedinih atoma (atom je niz neblanko znakova, ograničen blanko znacima). Parametri se ekspanduju po vrednosti. Izuzetak je slučaj kada se na dva parametra primeni operator spajanja ## kada se parametri ne ekspanduju nego se u tekst zamene neposredno nadovežu njihove originalne vrednosti, na primer:
  • Makrodefinicije:

#define IME1 ZAMENA1

#define IME2 ZAMENA2

#define MACRO(x,y) x ## y

  • Makropoziv:

MACRO(IME1, IME2) daje tekst zamene IME1IME2

  • Napisati makrodefiniciju, koja bi u datim uslovima, za gornji primer dala tekst zamene ZAMENA1ZAMENA2. Objasniti korak po korak ekspanziju te makrodefinicije.
re enje
Rešenje
  • Tražena makrodefinicija glasi:

#define MACRO2(x, y) MACRO(x,y)

  • Pri pozivu: MACRO2(IME1, IME2) prvo se vrši ekspanzija parametara IME1 i IME2 u ZAMENA1 i ZAMENA2 repsektivno, zatim se obrađuje telo makrodefinicije MACRO2 i u okviru toga vrši poziv MACRO(ZAMENA1, ZAMENA2) koji daje spojene vrednosti svojih argumenata, dakle konačni rezultat ekspanzije je ZAMENA1ZAMENA2.
ekspanzija parametara makroa
EKSPANZIJA PARAMETARA MAKROA
  • Šta ako je (stvarni) parametar P makropoziva M zadat tako da i sam za sebe predstavlja makropoziv?
  • Dve semantike:
    • ekspanzija parametra po vrednosti: parametar P se prvo zasebno ekspanduje i zapamti njegova ekspanzija PE. Zatim, kada se procesira originalni makro M, ekspandovana vrednost parametra (PE)se zamenjuje na svim mestima gde se taj parametar (njegov pozicioni marker) pojavljuje u telu makroa M
    • ekspanzija parametra po imenu: počinje se sa ekspandovanjem tela makroa M i gde god se u telu naiđe na korišćenje P, to se tretira kao zaseban (ugneždeni) makropoziv
zadatak3
Zadatak
  • Date su makrodefinicije:

MCDEFN

MAX A1,A2,A3

LOAD A1

CMP A2

BGT A3

LOAD A2

A3: NOP

MCEND

MCSET N=1

MCDEFN

GENLAB

L##N

MCSET N=N+1

MCEND

  • Koji tekst generiše makropoziv MAX 1,2,GENLAB pod pretpostavkom da su makropozivi:
  • po vrednostiMAX(1,2, GENLAB)
  • b) po imenu?MAX(1,2, GENLAB)
re enje1
Rešenje
  • Date su makrodefinicije:

MCDEFN

MAX A1,A2,A3

LOAD A1

CMP A2

BGT A3

LOAD A2

A3: NOP

MCEND

MCSET N=1

MCDEFN

GENLAB

L##N

MCSET N=N+1

MCEND

  • a) po vrednosti

MAX(1,2, GENLAB) MAX(1,2,L1)

LOAD 1

CMP 2

BGT L1

LOAD 2

L1: NOP

  • b) po imenu?

MAX(1,2, GENLAB)

LOAD 1

CMP 2

BGT L1 Prva verzija: BGT GENLAB

LOAD 2

L2: NOP Prvaverzija: GENLAB: NOP

zadatak4
Zadatak
  • Za potrebe razvoj softvera koji koristi periferiju X razvijen je simulator te periferije. Simulator je u obliku biblioteke koja se u toku razvoja koristi umesto biblioteke za pristup periferiji X. U fajlu “hardHeader.h” dat je potpis funkcije koja se koristi za pristup periferiji, dok je u fajlu “simHeader.h” potpis odgovarajuće funkcije koja umesto periferije koristi simulator. Prikazati deo koda koji, koristeći C pretprocesor, može da se prevede na dva načina: za testiranje koristeći simulator i za produkciju koristeći periferiju. Jedina izmena u kodu smije da bude u komandi za prevođenje. Fajlovi zaglavlja su dati na narednom slajdu.
zadatak5
Zadatak
  • “hardHeader.h”:void test(int param1, int param2, int* result);// primer poziva:// test(a1, a2,// &result);
  • “simHeader.h”:int test(int simStream, int param1, int param2);// primer poziva:// result =// test(simStream,// a1, a2);
varijanta 1
Varijanta 1

#ifdef SIMULACIJA

#include "simHeader.h"

#else

#include "hardHeader.h"

#endif

void main() {

int result, a1 = 1, a2 = 2

#ifdef SIMULACIJA

, simStream = 4

#endif

;

// ostatakkoda

#ifdef SIMULACIJA

result = test(simStream, a1, a2);

#else

test(a1, a2, &result);

#endif

//koriscenjerezultata

}

Prevođenje za simulaciju:

gcc –o p –DSIMULACIJA p.c -lsim

Prevođenje za produkciju:

gcc –o p p.c -lhard

varijanta 2
Varijanta 2

#if SIMULACIJA

#include "simHeader.h"

#else

#include "hardHeader.h"

#endif

void main() {

int result, a1 = 1, a2 = 2

#if SIMULACIJA

, simStream = 4

#endif

;

// ostatakkoda

#if SIMULACIJA

result = test(simStream, a1, a2);

#else

test(a1, a2, &result);

#endif

//koriscenjerezultata

}

Prevođenje za simulaciju:

gcc –o p –DSIMULACIJA=1 p.c -lsim

Prevođenje za produkciju:

gcc –o p –DSIMULACIJA=0 p.c -lhard

varijanta 3
Varijanta 3

#if SIMULACIJA

#include "simHeader.h"

#define testCall(p1,...) p1 = test(__VA_ARGS__)

#define simStreamDef , simStream = 4

#else

#include "hardHeader.h“

#define testCall(p1,p2,p3,...) test(p2,p3,&p1)

#define simStreamDef

#endif

void main() {

int result, a1 = 1, a2 = 2 simStreamDef;

// ostatakkoda

testCall(result,a1,a2,simStream);

//koriscenjerezultata

}

Prevođenje za simulaciju:

gcc –o p –DSIMULACIJA=1 p.c -lsim

Prevođenje za produkciju:

gcc –o p –DSIMULACIJA=0 p.c -lhard