Jump to content
xplode_me

[Resolvido] Transformar char em double/float

Recommended Posts

xplode_me

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

Share this post


Link to post
Share on other sites
xplode_me

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 :D

#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?

Share this post


Link to post
Share on other sites
theproject

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 []

Share this post


Link to post
Share on other sites
theproject

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 []

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.