ciao First of all I make excuses myself for my English not too much corrected. I write in order to speak you to you about a problem that I have found with my first program written in C with gtk. I have written the algorithm in order to resolve the puzzle and have set up all the graphical interface but when start the simulation does not visualize me in real Time the graphic regarding the algorithm that is under. I enclose the code of my program with the hope that someone can gives some council to me. In order to see something i enclose a little png that it must be include in the program folder. Regards Michele *************************************************************************** #include <gdk/gdkx.h> #include <gtk/gtk.h> #define DISCHI 64 #include <stdlib.h> //variabili e strutture globali gint valoreAnelloDrag,rigaAnelloDrag,colonnaAnelloDrag; gint controllo=0,servizio; gint disk=64; gint asta[DISCHI][3]; GtkWidget *event_box[DISCHI][3]; GdkPixbuf *imaPixbuf[DISCHI]; GtkWidget *ringSenzaRef[DISCHI],*ring[DISCHI]; GtkWidget *oggettoFinestra; GtkWidget *vbox3; GtkWidget *hbox5; GtkWidget *label3; GtkWidget *entry1; GtkWidget *SIMULA; GtkWidget *ESCI; GtkWidget *tabella; enum { TARGET_STRING, TARGET_ROOTWIN }; static GtkTargetEntry target_table[] = { { "STRING", 0, TARGET_STRING }, { "text/plain", 0, TARGET_STRING }, { "application/x-rootwin-drop", 0, TARGET_ROOTWIN } }; static guint n_targets = sizeof(target_table) / sizeof(target_table[0]); //prototipi di funzione int puntatore_testa_colonna(int); int fineDelGioco(void); void disegna(void); void inizializza(void); void resettaCol(int); void quick_message (gchar *); void dohanoi(gint, gint, gint, gint); void on_SIMULA_clicked (GtkButton *button, gpointer user_data) { GError **ERR2=0; gint i,j,servizio; gdouble x2; gchar *text; //GtkWidget *entry = lookup_widget (GTK_WIDGET(button), "ENTRY"); text=(gchar*)gtk_entry_get_text(GTK_ENTRY(entry1)); disk=atoi(text); g_print("\n\ndisk=%d\n\n",disk); gint N=disk; gint DA=0, A=2,USANDO=1; //Caricamento immagini dinamico for (i=1;i<=disk;i++){ //equazione retta che passa da A(8,64) e B(20,3) per ottenere la larghezza dell'anello x2=-0.2*disk+20.51; //funzione che carica un pixbuf da un file e lo scala con un fattore che decido io.La larghezza e' ottenuta pensando ad un iperbole equilatera. imaPixbuf[i]=gdk_pixbuf_new_from_file_at_scale("ring.png",(320/disk)*i,x2,FALSE,ERR2); //carico nel widget ringSenzaRef il pixbuf appena creato ringSenzaRef[i]=gtk_image_new_from_pixbuf(imaPixbuf[i]); //carico in ring la referenza appena stanziata ring[i]=g_object_ref(ringSenzaRef[i]); }; //creazione disegno e struttura dinamico for (i=0;i<=disk-1;i++){ for (j=0;j<=2;j++){ //le immagini non possono ricevere eventi percio' le inseriremo in un event box event_box[i][j]=gtk_event_box_new (); gtk_table_attach_defaults (GTK_TABLE (tabella), event_box[i][j], j,j+1,i,i+1); }; }; resettaCol(1); resettaCol(2); inizializza(); disegna(); dohanoi(N, DA, A,USANDO); //Visualizzazione gtk_widget_show_all (oggettoFinestra); }; void on_ESCI_clicked (GtkButton *button, gpointer user_data) { gtk_main_quit(); } //MAIN int main( int argc,char *argv[] ){ gtk_init (&argc, &argv); oggettoFinestra = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (oggettoFinestra), ("Towers of Hanoi 0.1b")); vbox3 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox3); gtk_container_add (GTK_CONTAINER (oggettoFinestra), vbox3); hbox5 = gtk_hbox_new (TRUE, 0); gtk_widget_show (hbox5); gtk_box_pack_start (GTK_BOX (vbox3), hbox5, FALSE, FALSE, 0); label3 = gtk_label_new (("Numero Anelli")); gtk_widget_show (label3); gtk_box_pack_start (GTK_BOX (hbox5), label3, FALSE, FALSE, 0); gtk_widget_set_size_request (label3, 107, -1); entry1 = gtk_entry_new (); gtk_widget_show (entry1); gtk_box_pack_start (GTK_BOX (hbox5), entry1, FALSE, FALSE, 0); gtk_widget_set_size_request (entry1, 41, -1); SIMULA = gtk_button_new_with_mnemonic (("Simula")); gtk_widget_show (SIMULA); gtk_box_pack_start (GTK_BOX (hbox5), SIMULA, FALSE, FALSE, 0); ESCI = gtk_button_new_with_mnemonic (("Esci")); gtk_widget_show (ESCI); gtk_box_pack_start (GTK_BOX (hbox5), ESCI, FALSE, FALSE, 0); tabella = gtk_table_new (3, 3, TRUE); gtk_widget_show (tabella); gtk_box_pack_start (GTK_BOX (vbox3), tabella, TRUE, FALSE, 0); // segnali PULSANTI g_signal_connect ((gpointer) SIMULA, "clicked", G_CALLBACK (on_SIMULA_clicked), NULL); g_signal_connect ((gpointer) ESCI, "clicked", G_CALLBACK (on_ESCI_clicked), NULL); gtk_widget_show_all (oggettoFinestra); //Loop gtk_main (); return 0; }; //FUNZIONI int puntatore_testa_colonna(int colonnaDaEsaminare){ gint i,j,parz,h; for(i=disk-1;i>=0;i--){ if(asta[i][(gint)colonnaDaEsaminare]==0){ g_print("\nIl primo elemento della col %d e' %d con indice%d", colonnaDaEsaminare, asta[i+1][(gint)colonnaDaEsaminare],i+1); parz=i+1; break; }; }; if(asta[disk-1][(gint)colonnaDaEsaminare]==0){ g_print("\nLa colonna %d e' vuota",colonnaDaEsaminare); parz=disk-1; }; if(asta[0][(gint)colonnaDaEsaminare]!=0){ g_print("\nLa colonna %d e' piena",colonnaDaEsaminare); parz=0; }; return parz; }; void resettaCol(int colonnaDaResettare){ gint i,h,j; for (i=0;i<=disk-1;i++) { h=asta[i][colonnaDaResettare]; if(h!=0) { gtk_container_remove (GTK_CONTAINER (event_box[i][colonnaDaResettare]), ring[h]); }; }; }; void inizializza(void){ gint i,j,h; //carico gli anelli per iniziare nell'event box della prima asta e tolgo il flag da controllo in modo che //carichi dischi solo all'inizio della partita if(controllo==0){ //inserisco gli anelli nella prima asta for(i=0;i<=disk-1;i++) { asta[i][0]=i+1; asta[i][1]=0; asta[i][2]=0; }; }; }; void disegna(void){ gint i,j,h; //stampo a schermo la matrice del gioco per questioni di servizio g_print("controllo%d\n",controllo); for (i=0;i<=disk-1;i++) {g_print("\n"); for (j=0;j<=2;j++){ g_print("%4d",asta[i][j]); }; }; //disegno lo stato del gioco in base allo stato degli array for (i=0;i<=disk-1;i++) { for(j=0;j<=2;j++) { h=asta[i][j]; if(h!=0) { gtk_container_add (GTK_CONTAINER (event_box[i][j]), ring[h]); }; }; }; }; void quick_message (gchar *message) { GtkWidget *dialog, *label; /* Create the widgets */ dialog = gtk_dialog_new_with_buttons ("Message", oggettoFinestra, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_NONE, NULL); label = gtk_label_new (message); /* Ensure that the dialog box is destroyed when the user responds. */ g_signal_connect_swapped (dialog, "response", G_CALLBACK (gtk_widget_destroy), dialog); /* Add the label, and show everything we've added to the dialog. */ gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), label); gtk_widget_show_all (dialog); }; void dohanoi(gint N, gint da, gint a, gint usando){ int i,j,h,parz; if (N > 0){ dohanoi(N-1,da,usando,a); g_print("\n\nmuovo da %d --> a %d\n",da,a); sleep(1); for(i=disk-1;i>=0;i--){ if(asta[i][da]==0){ parz=i+1; //salvo in h la posizione dell'anello da rimuovere(il valore contenuto nell'array riflette l'indice del vettore che contiene gli anelli) h=asta[parz][da]; //salvo il numero dell'anello in valoreAnelloDrag.Mi servira' dopo nella sezione DROP valoreAnelloDrag=h; rigaAnelloDrag=parz; //setto a 0 l'elemento trovato asta[parz][da]=0; //rimuovo l'anello dal container gtk_container_remove (GTK_CONTAINER (event_box[parz][da]), ring[h]); break; }; }; //se non trova niente nel for vuol dire che sto togliendo il primo anello di un asta if(asta[0][da]!=0){ h=asta[0][da]; valoreAnelloDrag=asta[0][da]; asta[0][da]=0; //ora rimuovo il widget anello dall'event box gtk_container_remove (GTK_CONTAINER (event_box[0][da]), ring[h]); }; for(i=disk-1;i>=0;i--){ if(asta[i][a]==0){ asta[i][a]=valoreAnelloDrag; //aggiungo l'anello al container gtk_container_add (GTK_CONTAINER (event_box[i][a]), ring[valoreAnelloDrag]); break; }; }; for (i=0;i<=disk-1;i++){ g_print("\n"); for (j=0;j<=2;j++){ g_print("%4d",asta[i][j]); }; }; dohanoi(N-1,usando,a,da); }; };
Attachment:
ring.png
Description: PNG image