2017-01-29 42 views
0

У меня возникают проблемы с назначением переменной global_duty. Все остальные переменные в уравнении назначаются каждый раз. Насколько я могу сказать, текстовая метка duty_out_lab сбрасывается как минимум дважды. Ive попробовал объявить global_duty как int, gint и gdouble,, но ничего не работает. В первый раз, когда используется уравнение, он дает правильный ответ, а затем каждый раз он выводит только 0. Все компилируется без каких-либо предупреждений.C Математическое уравнение присваивает переменную правильно только один раз

Вот соответствующий код.

#include <gtk/gtk.h>  
int global_ontime; 
int global_offtime; 
int global_duty; 
GtkWidget *duty_out_lab; 

static void 
set_duty() 
{ 
    global_duty = global_ontime/(global_ontime + global_offtime) * 100 ; 
    gchar *str = g_strdup_printf (" %d percent ", global_duty); 
    gtk_label_set_text (GTK_LABEL (duty_out_lab), str); 
    g_free(str); 
    printf ("On time is %d micro seconds\n", global_ontime); 
    printf ("Off time is %d micro seconds\n", global_offtime); 
    printf ("Duty cycle is %d percent \n\n", global_duty); 
} 

static void 
set_ontime (GtkSpinButton *spinbutton, gpointer user_data) 
{ 
    gint value1 = gtk_spin_button_get_value_as_int (spinbutton); 
    global_ontime = value1; 
    set_duty(); 
} 

static void 
set_offtime (GtkSpinButton *spinbutton, gpointer user_data) 
{ 
    gint value2 = gtk_spin_button_get_value_as_int (spinbutton); 
    global_offtime = value2; 
    set_duty(); 
} 

Выход из терминала

On time is 1 micro seconds 
Off time is 0 micro seconds 
Duty cycle is 100 percent 

On time is 1 micro seconds 
Off time is 1 micro seconds 
Duty cycle is 0 percent 

On time is 1 micro seconds 
Off time is 2 micro seconds 
Duty cycle is 0 percent 

On time is 2 micro seconds 
Off time is 2 micro seconds 
Duty cycle is 0 percent 

GTK выходы

] 2 выход хорошее

1 выход плохо

+1

Пожалуйста, напишите ваши замечания, а не ваши выводы. Если ваша программа производит выходные данные, не описывайте ее в свободной прозе, скопируйте ее и вставьте ее дословно. –

+0

На время составляет 1 мкс время выключения 0 микросекунд Рабочий цикл составляет 100 процентов На время составляет 1 мкс время отключения 1 мкс Рабочий цикл 0 процентов На время составляет 1 мкс время выключения 2 микросекунд Рабочий цикл 0 процентов от времени 2 микросекунд время отключения 2 микросекунд Рабочий цикл составляет 0 процентов – fernny500

+0

, когда я вставил его в формат изменен – fernny500

ответ

2

Первый шаг: объявить переменную global_duty как поплавок или два раза.

Второй шаг: Заменить строку

global_duty = global_ontime/(global_ontime + global_offtime) * 100 ; 

от

global_duty = global_ontime * 1.0/(global_ontime + global_offtime) * 100 ; 

В C, результат 2 (целое число), разделенной на 5 (целое число), равно 0 (целое число), и не 0,4 (поплавок/двойной). Аналогично, в вашем случае значение global_duty было усечено до 0. Если вы хотите использовать десятичные значения в качестве ответа, используйте типы данных «float» или «double». Умножение числителя на 1.0 делает тип данных числителя двойным.

+0

@ fenny500: принимайте ответ, если он решает вашу проблему. –

+0

Это сработало. Любопытно, есть ли способ отформатировать его до десяти знаков после запятой? – fernny500

+0

Ответ принят – fernny500