[ Pretender @ 03.03.2004. 20:57 ] @
Code:

//FuctionTable.cpp
#include <iostream>
#include <conio>
using namespace std;

// A macro to define dummy functions:
#define DF(N) void N() { \
   cout << "function " #N " called..." << endl; }

DF(a); DF(b); DF(c); DF(d); DF(e); DF(f); DF(g);

void (*func_table[])() = { a, b, c, d, e, f, g };

int main() {
  while(1) {
    cout << "press a key from 'a' to 'g' "
      "or q to quit" << endl;
    char c, cr;
    cin.get(c); cin.get(cr); // second one for CR
    if ( c == 'q' )
      break; // ... out of while(1)
    if ( c < 'a' || c > 'g' )
      continue;
    (*func_table[c - 'a'])();
  }
getch();
} ///:~


1) Sta je CR, i sta radi get(cr) kada unosimo samo 1 karakter?
2) Ne vidim nigde poziv makroa, nego samo poziv f-je (npr. d), koja (tako se cini, mada stvar radi) ne moze da dodje do svoje definicije (?)
3) Cemu DF(a), DF(b),... (odgovor verovatno u sklopu 2))

Nista od ovoga autor nije objasnio.

Tx
[ filmil @ 03.03.2004. 21:59 ] @
Citat:
1) Sta je CR, i sta radi get(cr) kada unosimo samo 1 karakter?
2) Ne vidim nigde poziv makroa, nego samo poziv f-je (npr. d), koja (tako se cini, mada stvar radi) ne moze da dodje do svoje definicije (?)
3) Cemu DF(a), DF(b),... (odgovor verovatno u sklopu 2))
1) Kada uneseš znak sa tastature, ti zapravo upisuješ dve stvari: taj znak i jedno „\n“. cr služi da poklopa taj znak za novi red.
2) Makro se nigde ne poziva, već služi (i to loše) za proizvodnju duplikata funkcija. U C++-u to treba da se radi pomoću šablona (templates), a ne pomoću makroa. Ima puno boljih načina da se ista stvar uradi, ova je otprilike druga najgora mogućnost.
3) da, u sklopu 2) :)

f

[ NastyBoy @ 03.03.2004. 21:59 ] @
Makro ti je definisao funkcije, tako da je, npr. funkcija "a" definisana kao :
Code:

void a()
{
  cout << "function a called..." << endl;
}

gde je konkatenacija stringova iskorshtena za ispis (ako te to buni)

Linija
Code:
DF(a); DF(b); DF(c); DF(d); DF(e); DF(f); DF(g);

definishe sve funkcije na gore pomenuti nachin (znachi a(), b(), c() itd.)

Nakon toga su funkcije zalepljene u niz pointera na funkcije i iskorishcen je trik u
Code:
(*func_table[c - 'a'])();

da se adresira funkcija shodno char parametru, tako da ako je c=='a' onda je index niza nula, shto je ustvari namapirano na funkciju a() itd.

Nadam se da je malo jasnije :)


[ filmil @ 03.03.2004. 22:10 ] @
Јоš jedna sitnica: mnogi kompajleri imaju opciju -E koja ti omogućava da vidiš kako izgleda kod pošto ga pretprocesor „propusti kroz šake“. Da bi video šta je kompajler napravio od tvog koda možeš probati ovo, ako koristiš GCC:

Code:
g++ -E datoteka.cpp


f

[ Pretender @ 04.03.2004. 00:58 ] @
OK.Tx.
Samo, sto se tice CR-a; 1) da li to znaci da je cin.get(cr) obavezno kad god se koristi cin.get(nesto)? 2) sta bi se desilo da se to izostavi ? 3) zasto ovde nije korisceno cin >> c , i zasto se uz taj oblik ne stavlja cin.get(cr) ?

P.S.
Zna li se kako izgleda komanda -E u Borlandu ?
g++ sam skinuo nedavno, ali mi se ucinilo da je instalacija suvise komplikovana (nema SETUP file) pa sam se vratio na B6 (sa Bturbo4.5 jer ne podrzava standard - DT je /of kors/ bio u pravu).
[ filmil @ 04.03.2004. 01:27 ] @

Citat:

Zna li se kako izgleda komanda -E u Borlandu ?



Probaj da pokreneš kompajler sa opcijom /?


To bi trebalo da izlista sve opcije. Ne bih se iznenadio da je /E ono

što tražiš. Nemam kod sebe Borland C++ da proverim.


f
[ Pretender @ 04.03.2004. 02:22 ] @
Eh,
da li bi mogao da mi kazes kako da otvorim command line na compileru.
(i inace sam se spremao da zapomazem s tim u vezi)