Gå til innhold

GTK + XML + C + nybegynner


Anbefalte innlegg

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

post-41-1103054709_thumb.png

Lenke til kommentar
Videoannonse
Annonse

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

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 av søppel
Lenke til kommentar

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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...