PDA

View Full Version : [C++] Dubbio su FunctionTable


fbcyborg
23-09-2009, 18:09
Salve a tutti,
stavo studiando sul libro Thinking in C++, e mi sono imbattuto nel seguente codice:
//: C03:FunctionTable.cpp
// Using an array of pointers to functions
#include <iostream>
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'])();
}
} ///:~

Ho però un dubbio:
1) Ho visto che senza l'istruzione "cin.get(cr);", il programma non funziona bene. Suppongo che esso serva per il carriage return, ma non ho capito perché vada catturato.

banryu79
24-09-2009, 08:19
Ho però un dubbio:
1) Ho visto che senza l'istruzione "cin.get(cr);", il programma non funziona bene. Suppongo che esso serva per il carriage return, ma non ho capito perché vada catturato.
E' passato molto tempo da quando ho studiato e mi sono esercitato con il linguaggio C++; vado a memoria e a buon senso, potrei dirti una fesseria:
Il motivo è che quando digiti un carattere e poi digiti <INVIO> per 'inviare', nel buffer dello standard input ci sono ora due caratteri: quello digitato + il carriage return.

A quel punto il secondo e ultimo cin serve per svuotare il buffer dal carriage return, se non lo si fa esso resta nel buffer e al prossimo cin.getc() te lo ritrovi al posto del nuovo carattere digitato (che nel buffer si troverebbe subito dopo il cr).

(Comunque il titolo della discussione mi ha depistato: pensavo avessi dubbi sui function pointer....)

fbcyborg
24-09-2009, 09:44
[/QUOTE]E' passato molto tempo da quando ho studiato e mi sono esercitato con il linguaggio C++; vado a memoria e a buon senso, potrei dirti una fesseria:
Il motivo è che quando digiti un carattere e poi digiti <INVIO> per 'inviare', nel buffer dello standard input ci sono ora due caratteri: quello digitato + il carriage return.

A quel punto il secondo e ultimo cin serve per svuotare il buffer dal carriage return, se non lo si fa esso resta nel buffer e al prossimo cin.getc() te lo ritrovi al posto del nuovo carattere digitato (che nel buffer si troverebbe subito dopo il cr).Ok ho capito, la cosa mi sembra logica grazie.

(Comunque il titolo della discussione mi ha depistato: pensavo avessi dubbi sui function pointer....)
Hai ragione. Il fatto è che inizialmente avevo anche un altro dubbio, solo che poi l'ho rimosso perché l'ho capito da solo, allora ho messo un titolo più generico.