Newsgroup: it.comp.lang.c
Titolo: GUI per programma

Dopo vari mesi di debugging e sviluppo sono riuscito ad ottenere un codice che funziona correttamente.
 
Per renderlo un po' piu' "usabile" vorrei dotarlo di interfaccia grafica e qui iniziano i problemi.
 
Come procedere?
Considerato che mi muovo male in ambiente Microsoft VC (e non conosco il C++) e preferisco sicuramente linux (al massimo con la pistola alla tempia cygwin) ho provato a guardarmi in giro ma, causa mia inesperienza, ho tanta confusione in testa.
 
Proprio perche' non ho mai fatto niente di simile prima (anni fa avevo fatto l'interfaccia grafica con matlab che lanciava un eseguibile c ma non mi ha mai soddisfatto a pieno perche' le due cose erano separate e non c'era alcun controllo tra i due ambiti), ho paura di prendere una strada sbagliata e magari accorgermene dopo 3 o 4 mesi di infruttuosi tentativi.
 
Quello che in definitiva cerco e' una libreria per estendere il mio codice C e dotarlo di interfaccia grafica.
 
Sapreste indirizzarmi verso una direzione?
 
Grazie
 
 
 

 Grazie
 
Premetto che non sono mai riuscito a realizzare
un'interfaccia grafica, ci sono andato meno lontano con
Qt, che oltretutto è molto portabile. Potresti dargli
un'occhiata se i guru del NG non consigliano altrimenti.
 
Libreria per estendere il codice io non la prenderei in
considerazione, meglio separare le cose. Al limite metti
tutto il tuo programma in una classe e fai le chiamate
dall'interfaccia (e viceversa) però chiaramente tutto
dipende da come sei organizzato.
 
 
-- 
- mi dai il tuo numero?
- sono fidanzata
- Mi serve il numero
- Sono fidanzata, ti ho detto
- Aho, ma le vuoi provare 'ste scarpe o no?
 

 chiaramente tutto dipende da come sei organizzato.
 
ops, è il NG di C, non C++, ma tanto l'idea resta



Purtroppo soffro, come ho gia' detto ,del problema di mom conoscere C++


scusate "non conosco"


 
infatti mi ero corretto. Puoi comunque isolare interfaccia 
ed engine anche usando il C.



Come? (Domanda posta al NG..)


 
Potresti anzitutto definire esattamente cosa deve fare il
tuo engine (l'altra è la GUI) e come si interfaccia con
l'esterno. Tipicamente chiamerai dalla GUI una serie di
funzioni messe a disposizione dall'engine, che conviene
nominare con uno schema facilmente rintracciabile. Per esempio
 
EngCall_faiqualcosa () ;
 
Così anzitutto, con una ricerca grep sui sorgenti sai i
punti in cui la tua interfaccia vorrà chiedere qualcosa
all'engine. Secondo poi, è sempre bene wrappare le
funzioni che cambiano con l'ambiente grafico. Per esempio,
non è saggio nel tuo engine scrivere la chiamata diretta
alla funzione della GUI. Per esempio se nell'engine c'è
qualcosa di simile
 
DrawGUIWindow (...) ;
 
e questo nome di funzione vale per l'ambiente in cui
sviluppi, se lo cambi, devi mettere le mani ovunque.
Conviene invece fare qualcosa come
 
my_DrawWindow (...)
{
#ifdef  GUI_1
     DrawGUIWindow (...)
#elif  GUI_2
     WindowDraw (...)
#endif
}
 
Allo stesso modo, avrai qualcosa di simile nell'engine, se
proprio questo deve arrivare a gestire direttamente la GUI
(e va evitato se non altrimenti possibile).
 
Tipico esempio è un grafico con coppie di valori. Un modo 
un po' sporco è chiamare le funzioni di disegno 
dall'engine. Un modo migliore è fare in modo che l'engine 
restituisca un array con le coppie di valori, e passi 
l'array alla GUI tramite le funzioni di interfaccia di cui 
sopra.
 
tutte le funzioni col prefisso che indica un
interfacciamento le metti in un solo file (uno per
engine=>GUI, l'altro per GUI=>engine). Se cambi ambiente 
di sviluppo, metterai le mani su porzioni limitate e ben 
definite del codice.
 
Se ci fai caso molti programmi lavorano così, basta
pensare alle macro di Word. Internamente succede la stessa
cosa, ma in un caso la GUI fa una chiamata all'engine di
word nell'altro accedi alla stessa funzione (che so,
giustifica il testo così e cosà) tramite l'interprete del
dialetto del basic compreso da Word.
 
Tutto questo è molto più facile a dirsi che a farsi e una
certa "mescolanza" tra le due sezioni è inevitabile.
 
Altro modo completamente diverso per separare engine e GUI
potrebbe essere usare i socket, e so che ci sono altri
sistemi ancora.
 
A prescindere dalle inesattezze che io possa aver detto,
la lezione personalmente imparata è separare tutto il
possibile, usare prefissi e schemi di nomi facilmente
intercettabili da grep, e essere molto ordinati.
 
I guru presenti sicuramente correggeranno me e ti diranno
altro.
 
ciao
 
Apx.


 
 
Dipende da cosa fa il tuo programma e dal livello di interattività richiesto.
 
Ad esempio in alcuni casi semplici, puoi dotare il tuo programma di una interfaccia a riga di comando (con getopt), e costruire una GUI che invoca l'eseguibile con le opzioni corrette.
 
In linea di massima, ti suggerisco di progettare una API per le funzionalità offerte dal tuo programma, e costruire una libreria.  L'interfaccia grafica la implementi in un programma che linka questa libreria.
 
Se vuoi usare C, prova a vedere le GKT.
 
 
Ciao  Manlio


Devi prima decidere come vuoi procedere
Quale linguaggio preferiresti  usare e che conosci  ?
L' applicativo deve girare su una sola o piu piattaforme ?
Quali piattaforme ?
E' un' applicativo per uso privato o commerciale ?
Se è commerciale quale licenza vuoi dargli ?
 


D. Quale linguaggio preferiresti  usare e che conosci  ? 
R. Il C
 
D. L'applicativo deve girare su una sola o piu piattaforme ? 
R. Ho cercato di usare un C che vorrebbe essere molto vicino al K&R e quindi la speranza e di riuscirlo a compilare su qualsiasi piattaforma (ovviamente previa verifica); di conseguenza, se fosse possibile, sarebbe bello che fosse indipendente dal sistema operativo. Se cio' non fosse, l'ordine di preferenza sarebba linux, Windows, MacOs 
 
D. Quali piattaforme ? 
R. Come precedentemente, le principali o in ordine di preferenza linux, Windows, MacOs 
 
D. E' un' applicativo per uso privato o commerciale ? 
R. Al momento sicuramente privato.
 
Ciao


Grazie Archaeopteryx per la dettagliata risposta (e per il tempo che mi hai dedicato).

 
 
GTK :)
 
Ciao!


Dovrebbero andare bene anche per windows
Ma programmare GUI in C secondo me è un incubo
 

 Ma programmare GUI in C secondo me è un incubo
 
Condivido, anche se, se quello conosce, quello può usare :)
 
Dipende quant'è difficile quest'inferfaccia: all'estremo il tempo "perso"
imparando un nuovo linugaggio di più ad alto livello potrebbe essere minore
di quello speso nel fare tutto in C plain.
 
C'è anche da dire che programmare in C con le GTK e in C++ con le Qt (anche
usando il creator, che risparmia un sacco di tempo) siamo lì, cambia ben poco.
In caso bisogna andare su tipo sulle QtQuick, o roba simile, ma appunto, è
altra roba (che magari già sa, in fondo è tipo JS/CSS).
Io un'occhiata gliela darei.
 
Ciao!
 
P.S. Un'altra comodità di avere tutto in C, bisogna notare, è che non bisogna
passare troppo tempo a disaccoppiare logica e GUI, cosa di per-se giusta,
ma che a volte non ripaga in termini di tempo o qualità del prodotto finale.


Ringrazio tutti per i consigli.
Ho provato GTK+ e seguendo il tutorial sono riuscito a compilare i primi esempi (pur avendo avuto qualche problema con pkg-config che non era configurato correttamente).
Non era qualcosa di nuovo per me avendo una decina di anni fa lavorato con Xlib e Morif: si catturano gli eventi a cui siamo interessati e si accodano per essere poi gestiti secondo le necessita'.
 
Ancora una volta rivolgendomi a questo NG ho avuto utili consigli e suggerimenti. Peccato che ultimamente non abbia il traffico che meriterebbe grazie alle esperienze e conoscenze che vi gravitano attorno.


Non so cosa tu stia facendo e comunque non credo sia facile da 
indovinare. Per conto mio uso il C quando voglio ottenere cose semplici
(es. calendari, calcoli ripetitivi, notificatori di email, effemeridi
ecc. ecc.) che funzionino. Per la grafica via di system, popen,
snprintf e sscanf  per distribuire i compiti ai vari gxmessage, Xdialog, 
Yad, Gtkdialog ecc. ecc. che servono per input e output.
In linux, naturalmente. Sono qui occasionalmente perché ho bisogno
di qualcuno che mi faccia vedere lo scritto giusto per mettere al
lavoro libspopc con Gmail e la sua SSL.
 
Saluti.