kyrsjo Skrevet 14. desember 2004 Del Skrevet 14. desember 2004 Sitter og koser meg med å lage en periodisk tabell i gode gamle C. Programmet heter "gchem" (gnome chemistry), men butter i... manglende C-kunnskaper, samt manglende GTK-erfaring. Lite screenshot følger. Nå er problemet det, at jeg ønsker å endre en label dynamisk. Funksjonen min er: int ElementButtonRecieve (int elementNumber, GtkButton *button) { //En liten gla'melding. Debuging purposes... g_print ("Got an element!, it was: %d \n", elementNumber); //Setting the struct getElementData(elementNumber); //Setter teksten i lblElNum GtkWidget *lblElNum = lookup_widget(GTK_WIDGET(button), "lblElNum"); gtk_label_set_text(GTK_LABEL(lblElNum), /*(char*)&elementNumber)*/ "hei"); //gtk_label_set_text( return 0; } Denne blir kallt hver gang med argunentene elementNumber (atomnummer), samt at den får videressendt en peker til knappen som som kalte den (den blir kalt hver gang noen tar musa over en knapp - alle grunnstoffene er knapper...), som den så kan bruke til å slå opp de aktuelle vidgetsene. Deretter endres teksten i labelen med denne koden: gtk_label_set_text(GTK_LABEL(lblElNum), /*(char*)&elementNumber)*/ "hei"); (noe utkommentert kode som ikke fungerte så bra...) Jeg greier fint å sette den til "hei", men å sette den til en streng konvertert fra int'en elementNumber, det aner jeg ikke. Dokumentasjonen fra lidn.sourceforge.net sier: http://lidn.sourceforge.net/books/gtk-2.0/...-LABEL-SET-TEXT Jeg har brukt anjuta/glade til å skrive koden - en meget potent IDE. Koden er primært ment for Linux/gnome, men om noen skulle se en stor trang til å prøve å kompilere for windows skal jeg ikke nekte dem. GPL. Link: http://galleri.solution-forge.net/gchem-0.1.tar.gz Lenke til kommentar
søppel Skrevet 14. desember 2004 Del Skrevet 14. desember 2004 (endret) Hm, så det du lurer på er åssen man konverterer en int til en streng (char*)? Edit: man snprintf .. noe rundt der. Endret 14. desember 2004 av søppel Lenke til kommentar
kyrsjo Skrevet 14. desember 2004 Forfatter Del Skrevet 14. desember 2004 gtk_label_set_text(GTK_LABEL(lblElNum), snprintf(5,"%d",elementNumber)); Slik gjorde nå jeg. Men det segfaulta... Fikk en del warnings under compile: main.c: In function `ElementButtonRecieve': main.c:65: warning: passing arg 1 of `snprintf' makes pointer from integer without a cast main.c:65: warning: passing arg 2 of `snprintf' makes integer from pointer without a cast main.c:65: warning: passing arg 3 of `snprintf' makes pointer from integer without a cast main.c:65: warning: passing arg 2 of `gtk_label_set_text' makes pointer from integer without a cast Lenke til kommentar
Peter Skrevet 14. desember 2004 Del Skrevet 14. desember 2004 http://www.cplusplus.com/ref/cstdlib/itoa.html Lenke til kommentar
søppel Skrevet 14. desember 2004 Del Skrevet 14. desember 2004 (endret) itoa er ikke en del av standaren - om jeg ikke tar helt feil. Edit: Portability. Not defined in ANSI-C. Supported by some compilers. Trådstarter, vel - det er ikke sånn du skal gjøre det. Deklarasjonen ser jo slik ut: int snprintf(char *str, size_t size, const char *format, ...); ..om dét - og det som står på resten av man-siden ikke gir mening må du finne frem en bok. Edit2: Eller kopiere av noen som viser deg hvordan, men det vil du vel ikke. heh :] Endret 14. desember 2004 av søppel Lenke til kommentar
kyrsjo Skrevet 15. desember 2004 Forfatter Del Skrevet 15. desember 2004 http://www.cplusplus.com/ref/cstdlib/itoa.html Den så fin ut! Men hva er radix? Lenke til kommentar
buskmann Skrevet 15. desember 2004 Del Skrevet 15. desember 2004 Grunntallet i tallsystemet. Desimale: 10 Heksadesimale: 16 Binære: 2 osv Lenke til kommentar
kyrsjo Skrevet 15. desember 2004 Forfatter Del Skrevet 15. desember 2004 aha. Så den skal vel være 10 da.... Lenke til kommentar
kyrsjo Skrevet 15. desember 2004 Forfatter Del Skrevet 15. desember 2004 Min main.c fil ser nå slik ut: /* * Initial main.c file generated by Glade. Edit as required. * Glade will not overwrite this file. */ #ifdef HAVE_CONFIG_H # include <config.h> #endif #include <gnome.h> #include <stdlib.h> #include "interface.h" #include "support.h" struct currentElement { int elementNumber; double meltingPoint; }; int main (int argc, char *argv[]) { GtkWidget *window_periodic_table; GtkWidget *about_gchem; GtkWidget *window_element_info; #ifdef ENABLE_NLS bindtextdomain (GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); #endif gnome_program_init (PACKAGE, VERSION, LIBGNOMEUI_MODULE, argc, argv, GNOME_PARAM_APP_DATADIR, PACKAGE_DATA_DIR, NULL); /* * The following code was added by Glade to create one of each component * (except popup menus), just so that you see something after building * the project. Delete any components that you don't want shown initially. */ window_periodic_table = create_window_periodic_table (); gtk_widget_show (window_periodic_table); // about_gchem = create_about_gchem (); // gtk_widget_show (about_gchem); // window_element_info = create_window_element_info (); // gtk_widget_show (window_element_info); gtk_main (); return 0; } // All the element buttons call this function, passing its elementNumber int ElementButtonRecieve (int elementNumber, GtkButton *button) { char buffer [10]; //En liten gla'melding. Debuging purposes... g_print ("Got an element!, it was: %d \n", elementNumber); //Setting the struct getElementData(elementNumber); //Setter teksten i lblElNum GtkWidget *lblElNum = lookup_widget(GTK_WIDGET(button), "lblElNum"); //gtk_label_set_text(GTK_LABEL(lblElNum), snprintf(5, "%d", elementNumber)); itoa(elementNumber, buffer, 10); gtk_label_set_text(GTK_LABEL(lblElNum),buffer); //gtk_label_set_text( return 0; } //Should look up element data from an XML file. int getElementData (int element) { g_print ("Looking up: %d \n", element); } Men under kompilasjon får jeg at den ikke finner itoa - funksjonen er tydeligvis ikke definert noe sted... Æsj. Lenke til kommentar
kyrsjo Skrevet 15. desember 2004 Forfatter Del Skrevet 15. desember 2004 int ElementButtonRecieve (int elementNumber, GtkButton *button) { char buffer [10]; //En liten gla'melding. Debuging purposes... g_print ("Got an element!, it was: %d \n", elementNumber); //Setting the struct getElementData(elementNumber); //Setter teksten i lblElNum GtkWidget *lblElNum = lookup_widget(GTK_WIDGET(button), "lblElNum"); //gtk_label_set_text(GTK_LABEL(lblElNum), snprintf(5, "%d", elementNumber)); sprintf(buffer, "%d", elementNumber); gtk_label_set_text(GTK_LABEL(lblElNum),buffer); //gtk_label_set_text( return 0; } Fant noe eksempelkode som forklarte hvordan man faktisk brukte sprintf... Trodde det funka som en funksjon som man dytta inn int'en i ene enden og ut kom strengen - altså en printf som returnerte en streng i steden for å skrive på skjermen. Takk for all hjelp! *rydde opp i koden og begynne å pønske på XML...* Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå