xplode_me Posted March 28, 2006 at 08:34 PM Report #19881 Posted March 28, 2006 at 08:34 PM Oi! Estou a tentar colocar o meu programazito em C a trabalhar com uma interface GTK (Gnome (Linux))... O problema é que este procedimento: gtk_entry_get_text(GTK_ENTRY(entry)); , devolve uma string e eu preciso que este valor seja convertido num tipo float para usar aqui: secondsToHours(entry); Alguma maneira de fazer isto? Ja me falaram em sscanf :s
xplode_me Posted March 28, 2006 at 10:19 PM Author Report #19920 Posted March 28, 2006 at 10:19 PM OK já consegui fazer isto funcionar. Aqiu está o código! ATENÇÃO: Copiei o que estava a fazer no anjuta por isso pode ter erros 😄 #ifdef HAVE_CONFIG_H # include <config.h> #endif #include <gtk/gtk.h> #include <math.h> #include <stdlib.h> #include "callbacks.h" #include "interface.h" #include "support.h" float secondsToHours(float seconds) { float hours; float minutes; float horas-gtk float minutos-gtk hours = ((int)(seconds/3600)); minutes = ((((seconds/3600) - ((int)(seconds/3600)))*60)); printf("Já passaram, "); printf("%.0f", hours); printf(" horas e "); printf("%.0f", minutes); printf(" minutos desde o último reboot do router!\n"); return 0; } gboolean on_window1_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data) { gtk_main_quit(); return FALSE; } void on_enviar_clicked (GtkButton *button, gpointer user_data) { GtkWidget * entry = lookup_widget(GTK_WIDGET(button), "inicial"); GtkWidget * label = lookup_widget(GTK_WIDGET(button), "final"); /* gchar output[50]="HELLO SIRS "; strcat(output,gtk_entry_get_text(GTK_ENTRY(entry))); */ float seconds; seconds = atof( gtk_entry_get_text(GTK_ENTRY(entry)) ); secondsToHours(seconds); /* gtk_label_set_text(GTK_LABEL(label),output); */ } void on_limpar_clicked (GtkButton *button, gpointer user_data) { } Agora precisava de mais uma ajudinha.... Eu queria que os valores das "printf("%.0f", hours);" e "printf("%.0f", minutes);" fossem atribuidos a variaveis em vez de serem imprimidos para o terminal. Alguém sabe como?
theproject Posted March 29, 2006 at 01:28 AM Report #19935 Posted March 29, 2006 at 01:28 AM boas, yah claro usa a funcao sprintf, funciona quase como o printf mas em vez de imprimir para o stdout, imprime para uma char[] que lhe das como argumento. Tem cuidado a usar pq ela assume que o teu array tem tamanho suficiente para guardar isso, se nao tiver.. BOOM! foste... Portanto talvez seja melhor usares a snprintf int snprintf(char *str, size_t size, const char *format, ...); Hasta []
xplode_me Posted March 29, 2006 at 09:21 AM Author Report #19949 Posted March 29, 2006 at 09:21 AM Podias dar aí um exemplo sff?
Solution theproject Posted March 29, 2006 at 11:29 AM Solution Report #19959 Posted March 29, 2006 at 11:29 AM Portanto usando o sprintf: char xpto[256]; sprintf(xpto , "%.0f" , hours); a string xpto fica com exactamente o mesmo que seria impresso no terminal pelo printf. Mas como eu referi tem o tal problema de como nao sabes o tamanho da string que akilo vai gerar convem arranjares algo grande onde meter. Uma muito melhor solucao é usar o snprintf pk esta funcao tem um parametro que é basicamente o numero de Bytes máximo que ela pode escrever char xpto[256]; snprintf(xpto , 256*sizeof(char) , "%.0f" , hours); (Ou eu tou a interpretrar mal o man do snprintf ou o valor de retorno é practicamente inutil pois nao conseguimos distinguir se faltam X caracteres de espaco ou se ele escreveu X caracteres na string. Alguem me pode corrigir? Nao vou testar isto.) Bem de kk maneira é so isto, agora como provavelmente nao keres estra string num array local o melhor que tens a fazer e dps de fazeres o snprintf ou sprintf, pegares nessa string, contares o numero de caracteres com o strlen , dps alocares uma cena com esse tamanho +1 com o malloc (ou semelhante) e dps fazeres strcpy que te copia a string original em xpto para o espaco que alocaste. Hasta []
xplode_me Posted March 29, 2006 at 12:35 PM Author Report #19966 Posted March 29, 2006 at 12:35 PM Tnks, got my code working 😄
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now