Newsgroup: it.comp.lang.c
Titolo: Domande varie..

Per la serie.. le grandi domande senza una risposta :-))
1) Col C , in un programmino DOS , esiste qualche comando per cambiare
il colore del testo da quello di default? Con i codici ANSI?
2) Funzioni che permettano di creare menu le cui opzioni si possono
selezionare con i tasti cursore? (il che presuppone che il "pulsante"
si illumini.. quindi ci serve un modo per cambiare il colore)
3) Printf Vs Cout :-)
Secondo me il printf e' molto piu' "professionale" del cout , a parte
questione di comodita' (trovo piu' comodo i % che i <<) , mi sembra
che il printf sia anche piu' "compatto" nel senso che per fare la
stessa cosa col cout bisogna scrivere di piu'.. (e io che ero abituato
al ? ""..)
4) Che "grado di conoscenza" bisognerebbe avere prima di cimentarsi
nella titanica impresa di far apparire una finestra Win32 con solo il
pulsante "OK" senza scritto niente intorno? :-))
-- 
      Adalberto Simeone -==(U.D.I.C.)==- Avenger Dragon
          E-Mail: 
fn5...@flashnet.it
  UIN: 1414193
                 SETI at Home Project Member

pulsante "OK" senza scritto niente intorno? :-))
La programmazione per win32 è abbastanza difficile solo agli inizi perchè
segue strade che per un normale programmatore DOS sono illogiche. Una volta
afferrati i concetti di base che regolano la gestione delle finestre si ha
davanti un mondo molto vasto con cui potersi sbizzarrire a piacimento
(almeno fino a quando non si ci scontra con i bug del Windows :-) ). Per
poter iniziare è indispensabile un buon libro su Windows (il migliore è il
"Programmare in Windows95" di Charles Petzold, Mondadori), in seguito si puo
continuare affidandosi alla documentazione fornita col proprio compilatore
(considero l'MSDN, fornita col VC++, la più esauriente e tecnicamente
completa).
Naturalmente si ha bisogno di un compilatore x Win32 come il Microsoft
Visual C++ o Borland C++ Builder.
Ciao, Giuseppe
---------------------------------------------------------------------------
_Guybrush su IRCNet canale #programmazione
---------------------------------------------------------------------------

(tipo Ansi.sys).
Io uso il Microsoft Visual Developer Studios Professional (altra
decina di nomi) 6.0 :-)
E c'e' questa libreria conio.h , ma ci sono solo funzioni del tipo
_getch , non ho trovato nessun textcolor o cose del genere (e nemmeno
la guida "conosce" qualcosa del genere.. l'unica cosa e' un comando
java simile)..
Sai dove posso trovare , insieme a quell'altra libreria , Turbovision
, questa "conio.h" giusta?


(considero l'MSDN, fornita col VC++, la piů esauriente e tecnicamente


 
Io la funzione textcolor ( in conio.h ) l'ho trovata nel djgpp del gnu.
Ciao, Luca.
-- 
 Reply to 
luca....@tiscalinet.it
 UIN : 43385135

 questa "conio.h" giusta?
Io posso anche spedirti la libreria conio.h ma non te ne faresti niente: il
compilatore non saprebbe come trattare il codice a 16 bit. Sia la libreria
conio.h che la TurboVision vengono da me utilizzati con il Borland Turbo C++
1.01: la prima è fornita a corredo del compilatore (se ti interessa è
presente in forma "completa" anche con il DJGPP) mentre la seconda è
scaricabile dal sito ftp della Borland (anche se io non sono mai riuscito a
farla funzionare sotto C++....). Vai 
ftp.borland.com
 e cerca di una
directory /tc/tvision o tc/tv o qualcosa del genere. Naturalmente la Turbo
Vision funziona solo con il compilatore Turbo C++.


Non le trovo nemmeno In Borland Turbo c++ per win 3.1
Probabilmente proprio perchè per Win 3.1 queste funzioni non sono state
incluse nel compilatore. La libreria conio.h per DOS "completa" è presente
nel Borland Turbo C++ 1 e nel DJGPP.


anche se hanno l'aspetto di programmi DOS, non possono girare sotto DOS).
Bello :-) Quindi se provassi a fare partire un programmino DOS fatto
col VC++ su una vecchia macchina , riceverei il msg. che dice che
bisogna farlo partire sotto windows?
In ogni caso , la domanda e' la stessa.. c'e' una funzione del genere
per Win32?


per Win32?
No. Comunque per la gestione classica della modalità testo (del tipo:
spostati qua, imposta colore testo, scrivi, spostati là...) esiste tutta una
serie di funzioni apposite del Win32. Prova a cercare nell'MSDN (o nel tuo
reference) gli argomenti riguardo a "console".


reference) gli argomenti riguardo a "console".
Ok provero' a cercare.. BTW ho un'altra domand :-)
In pratica volevo sapere se c'era un modo , data una particolare flag
di evitare di eseguire , chesso' le chiamate ad una particolare
funzione. Cioe' se una flag e' 0 allora ogni chiamata alla funzione X
non deve essere fatta.
Certo per ora ho risolto con una banale macro IF prima della chiamata
alla funzione.. pero' questo bisogna ripeterlo per ogni funzione..
c'e' un modo piu' "elegante"?


 c'e' un modo piu' "elegante"?
Un wrapper? Cioč una funzione di questo tipo:
T mywrapper( params )
{
    if ( flag ) return myfunction( params );
    return ???;
}

c'e' un modo piu' "elegante"?
Non ho capito cosa vuoi dire...... prova a scrivere due righe di esempio.
Forse parli dell'ottimizzazione di un codice del genere?
if(flag!=0)      // Potevo scrivere anche if(flag)
{
  MiaFunc();
  MiaFunc2();
};


Un wrapper? Cioč una funzione di questo tipo:
Ma in questo modo dovrei cmq. chiamarla prima di ogni chiamata alla
funzione...
Intendo uno "statement" fatto una sola volta tipo :
Se il flag e' attivato allora ogni chiamata alla funzione X() deve
essere saltata... 
chesso' magari qualcosa nel preprocessore..
Oppure anche in Windows , uno qualsiasi dei settings , deve essere
controllato ogni volta che l'operazione alla quale si riferisce viene
chiamata in causa?
Per esempio un "setting" del tipo "Disabilita la musica" deve essere
controllato ogni volta che il programma cerca di suonare qualcosa?


 funzione...
No, hai capito male. La chiamata alla tua funzione sarebbe contenuta
dentro il wrapper e tu dovresti chiamare solo il wrapper senza curarti
degli if che metterai al suo interno. Chiaro?
EMG

};
Faccio questo esempio :
il programma normale deve eseguire alcuni calcoli , tuttavia se una
particolare opzione e' attivata , devono uscire scritti i vari
procedimenti e la descrizione di quello che sta avvenendo (chiamando
una funzione apposta). Se l'opzione e' disattivata esce solo il
risultato.
Visto che e' una cosa che si ripete molte volte nel corso del
programma , mi chiedevo se ci fosse un modo "definitivo" che una volta
impostata una particolare variabile tutte le chiamate ad una
particolare funzione vengano ignorate..
Per ora come ho detto ho risolto con una macro.. controllando se la
flag e' attivata ogni volta che si sta per chiamare la funzione che
"scrive la spiegazione".
Mi chiedevo appunto se ci fosse un modo piu' elegante per fare questo.
-- 
      Adalberto Simeone -==(U.D.I.C.)==- Avenger Dragon
          E-Mail: 
fn5...@flashnet.it
  UIN: 1414193
                 SETI at Home Project Member
 
http://web.tiscalinet.it/presstart

degli if che metterai al suo interno. Chiaro?
Ah certo , ma dovrei chiamare il wrapper ogni volta che sto per
lanciare quella funzione.. o sbaglio? Se e' cosi' non e' che si
risolve molto..
Perche' a questo punto potrei farmi una macro..


controllato ogni volta che il programma cerca di suonare qualcosa?
E si, a run-time l'unico metodo possibile è quello di controllare il flag
con un if per decidere se chiamare o no la funzione. Esempio:
if(Music_Enabled=TRUE) Play("Mozart.mid");
Se invece vuoi un controllo a compile-time ti basta utilizzare le direttive
del preprocessore. Esempio:
#ifdef MUSIC
Play("Mozart.mid");
#endif


 Perche' a questo punto potrei farmi una macro..
Beh, anche una macro tipo DEBUG potrebbe andare bene ed è molto usata.
Solo che con il wrapper hai una gestione centralizzata. Magari potresti
mettere wrapper con all'interno la macro (#ifdef) in modo tale da non
avere neanche l'overhead dell'if nella versione definitiva.
EMG

 if(Music_Enabled=TRUE) Play("Mozart.mid");
Oppure che la funzione Play() comprenda tale if:
void Play( char *filename )
{
    if ( Music_Enabled == TRUE )
        /* Esegui la musica */
}
o anche (wrapper)
void myPlay( char *filename )
{
    if ( Music_Enabled == TRUE )
        Play( filename );
}
EMG

Mi chiedevo appunto se ci fosse un modo piu' elegante per fare questo.
Assumiamo di essere nel secondo caso (feature del programma finale). L'unica
possibilità è quella di testare il flag con un if.
if(Flag)
{
  Mia_funz();
};
Non è possibile tenere in considerazione altre possibilità come l'utilizzo
di un puntatore alla funzione per due motivi:
1) perchè tu hai da scegliere solo tra il chiamare la funzione e non fare
nulla e non tra il chiamare due funzioni differenti.
2) questo metodo si rivela efficace (incremento minimo di prestazioni e
pulizia del codice) solo se la tua necessità è quella di controllare lo
stato del flag SOLO ad inizio programma. Ma non mi sembra sia il tuo caso.


 nulla e non tra il chiamare due funzioni differenti.
Basterebbe semplicemente che la seconda funzione non faccia nulla.
EMG