Bonjour à tous
Alors voilà, pour apprendre à programmer, j'ai pomper un code source que j'ai un peu modifier.
Le programme initial servait à convertir la différence entre 2 dates en jours en Années, Mois, Secondes,...
Le but du programme final est une sorte de planning.
Au lieux de travailler en hebdomadaire (5 jours ouvrables et un week-end), je travaille en régime cyclique à savoir que sur 6 jours j'en travaille 4, les 2 autres étant en repos, et cela indéfiniment.
J'ai modifier le programme initial en mettant un "modulo" sur la division de la difference entre les 2 dates converties en jours.
Le résultat me donne le numéro de jour lequel est converti en chaine de caractères
Lorsque je compile mon programme: (je suis sous linux)
$ gcc `pkg-config --libs --cflags gtk+-2.0` monprog.c _o monprog
Je n'obtient pas d'erreur, mais lorsque je l'execute:
Erreur de Segmentation
Je pense que mon erreur est entre les 2 grosses lignes mise en commentaire
Merci pour toute aide !!!
Le code source:
#include <gtk/gtk.h> /* l'interface */
#include <time.h> /* pour time, mktime ... */
#include <stdio.h>
#include <math.h> /* pour floor */
#include <unistd.h> /* pour sleep */
// la fenêtre
GtkWidget *f;
// la boite verticale
GtkWidget *v;
// la boite horizontale
GtkWidget *h;
// la table
GtkWidget *t;
// les combobox
GtkWidget *c[3];
// les spinbox
GtkWidget *s[2];
// les labels
GtkWidget *e[10];
//le bouton
GtkWidget *b;
char * mois[] = {"Janvier" , "Février", "Mars" , "Avril", "Mai" ,
"Juin" , "Juillet" , "Août" , "Septembre" , "Octobre" ,
"Novembre" , "Décembre"};
char *ages[] = {"secondes" , "minutes" , "° Jour" ,
"jours" , "mois"};
struct tm *naissance;
int choixMoisPrecedent;
/* les protoypes */
int init();
gboolean onFerme (GtkObject *w,gpointer d);
int traitement ();
int modificationComboJour (int indiceMois);
int
main(int argc, char **argv)
{
GtkAdjustment *g;
GtkTooltips *tt;
gint i;
gchar *ch;
gtk_init (&argc, &argv);
tt = gtk_tooltips_new ();
gtk_tooltips_enable (tt);
f = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_resizable (GTK_WINDOW(f), 0);
v = gtk_vbox_new (FALSE, 3);
gtk_box_set_spacing (GTK_BOX(v), 0);
gtk_container_add (GTK_CONTAINER(f), v);
//
/* première ligne */
//
h = gtk_hbox_new (FALSE, 5);
gtk_box_set_spacing (GTK_BOX(h), 0);
gtk_box_pack_start (GTK_BOX(v), h, 1, 1, 0);
/* Les combobox */
for (i = 0;i < 3;i++)
{
c[i] = gtk_combo_box_new ();
gtk_box_pack_start (GTK_BOX(h), c[i], 1, 1, 0);
}
//
/* Les spinbuttons */
g = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 23.0, 1.0, 4.0, 0.0);
s[0]= gtk_spin_button_new(g, 0.0, 0);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(s[0]),08.0);
gtk_editable_set_editable(GTK_EDITABLE(s[0]), 0);
gtk_box_pack_start_defaults(GTK_BOX(h), s[0]);
gtk_tooltips_set_tip (GTK_TOOLTIPS (tt), s[0],
"Réglage de l'heure",
"");
//
g = (GtkAdjustment *) gtk_adjustment_new(0.0, 0.0, 59, 1.0, 5.0, 0.0);
s[1]= gtk_spin_button_new(g, 0.0, 0);
gtk_spin_button_set_value(GTK_SPIN_BUTTON(s[1]),45.0);
gtk_editable_set_editable(GTK_EDITABLE(s[1]), 0);
gtk_box_pack_start_defaults(GTK_BOX(h), s[1]);
gtk_tooltips_set_tip (GTK_TOOLTIPS (tt), s[1],
"Réglage des minutes",
"");
//
/* deuxième ligne */
//
t = gtk_table_new(4, 2, FALSE);
gtk_table_set_col_spacings(GTK_TABLE(t),10);
gtk_table_set_row_spacings(GTK_TABLE(t),10);
gtk_box_pack_start(GTK_BOX(v), t, 1, 1, 0);
for(i = 0;i < 10;i++)
{
e[i] = gtk_label_new(NULL);
ch = g_strdup_printf("<b><big>%s</big></b>", ages[i]);
gtk_label_set_markup(GTK_LABEL(e[i]), ch);
g_free(ch);
gtk_table_attach(GTK_TABLE(t), e[i],
(int) 1-(i/5), (int) 2-(i/5),
(int) (i%5), (int) (i%5)+1,
GTK_FILL | GTK_EXPAND,
GTK_FILL | GTK_EXPAND,
0, 0);
// on aligne à droite pour la 1re colonne à gauche pour l'autre
gtk_misc_set_alignment(GTK_MISC(e[i]), (int) (i/5), 0.5);
}
//
/* troisième ligne */
//
b = gtk_button_new_with_label("Quitter");
gtk_box_pack_start_defaults(GTK_BOX(v), b);
gtk_signal_connect(GTK_OBJECT(b), "clicked", (GtkSignalFunc) onFerme, NULL);
gtk_signal_connect(GTK_OBJECT(f), "destroy", (GtkSignalFunc) onFerme, NULL);
gtk_widget_show_all(f);
init();
traitement();
gtk_timeout_add(300, traitement, NULL);
gtk_main();
return 0;
}
int init () {
GtkListStore *l;
GtkTreeIter iter;
GtkCellRenderer *renderer;
gint i;
time_t n;
//
/* 1re combobox */
//
l = gtk_list_store_new(1, GTK_TYPE_INT);
gtk_combo_box_set_model(GTK_COMBO_BOX(c[0]), GTK_TREE_MODEL(l));
//
renderer = gtk_cell_renderer_text_new();
gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(c[0]), renderer, FALSE);
gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(c[0]), renderer, "text", 0, NULL);
//
for(i = 0;i < 30;i++) {
gtk_list_store_append(l, &iter);
gtk_list_store_set(l, &iter, 0, i+1, -1);
}
//
/* Deuxième combobox */
//
l = gtk_list_store_new(1, GTK_TYPE_STRING);
gtk_combo_box_set_model(GTK_COMBO_BOX(c[1]), GTK_TREE_MODEL(l));
//
renderer = gtk_cell_renderer_text_new();
gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(c[1]), renderer, FALSE);
gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(c[1]), renderer, "text", 0, NULL);
//
for(i = 0;i < 12;i++) {
gtk_list_store_append(l, &iter);
gtk_list_store_set(l, &iter, 0, mois[i], -1);
}
//
/* Troisième combobox */
//
l = gtk_list_store_new(1, GTK_TYPE_INT);
gtk_combo_box_set_model(GTK_COMBO_BOX(c[2]), GTK_TREE_MODEL(l));
//
renderer = gtk_cell_renderer_text_new();
gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(c[2]), renderer, FALSE);
gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(c[2]), renderer, "text", 0, NULL);
//
for(i = 0;i < 131;i++) {
gtk_list_store_append(l, &iter);
gtk_list_store_set(l, &iter, 0, i+1900, -1);
}
gtk_combo_box_set_active(GTK_COMBO_BOX(c[0]), 17);
gtk_combo_box_set_active(GTK_COMBO_BOX(c[1]), 4);
gtk_combo_box_set_active(GTK_COMBO_BOX(c[2]), 76);
/*
intialisation à la date
de naissance de Sacha
*/
time(&n);
naissance = localtime(&n);
/* naissance->tm_year = 100;
naissance->tm_mon = 1;// c'est bien en fait le mois de juin...
naissance->tm_mday = 1;
naissance->tm_hour = 8;
naissance->tm_min = 45;
naissance->tm_sec = 0;
*/
return 0;
}
gboolean onFerme (GtkObject *w,gpointer d) {
gtk_main_quit();
return 0;
}
int modificationComboJour (int indiceMois) {
GtkListStore *l;
GtkTreeIter iter;
GtkCellRenderer *renderer;
char *ch;
int i,iactif,choix;
int jourFin;
jourFin = 30;
//je récupère l'indice actif pour le réappliquer à la fin
iactif = gtk_combo_box_get_active(GTK_COMBO_BOX(c[0]));
l = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(c[0])));
gtk_list_store_clear(l);
// maintenant on ajoute au besoin :
if (indiceMois == 0 || indiceMois == 2 || indiceMois == 4 || indiceMois == 6) jourFin=31;
if (indiceMois == 7 || indiceMois == 9 || indiceMois == 11) jourFin=31;
// à faire : traiter les années bissextiles
if (indiceMois == 1) {
jourFin=28;
choix=gtk_combo_box_get_active(GTK_COMBO_BOX(c[2]));
if ((1900+choix)%4 == 0 && (1900+choix)%100 != 0) jourFin=29;
}
//
for(i = 0;i < jourFin;i++) {
gtk_list_store_append(l, &iter);
gtk_list_store_set(l, &iter, 0, i+1, -1);
}
gtk_combo_box_set_active(GTK_COMBO_BOX(c[0]), iactif);
return 0;
}
gboolean traitement (gpointer d) {
time_t maintenant;
time_t debut;
int dif;
int aMi,aH,aJ,aMo;
char nbS[64];
gchar* NomVaccation= NULL;
int choix;
// récupération du contenu des combobox
choix = gtk_combo_box_get_active(GTK_COMBO_BOX(c[0]));
naissance->tm_mday = choix+1;
//
choix = gtk_combo_box_get_active(GTK_COMBO_BOX(c[1]));
if (choixMoisPrecedent != choix) {
naissance->tm_mon = choix;
modificationComboJour(choix);
choixMoisPrecedent=choix;
}
//
choix = gtk_combo_box_get_active(GTK_COMBO_BOX(c[2]));
naissance->tm_year = choix;
if (choixMoisPrecedent == 1) modificationComboJour(1);
//
choix=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(s[0]));
naissance->tm_hour = choix;
//
choix=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(s[1]));
naissance->tm_min = choix;
// calculs fondamentaux
maintenant = time(NULL);
debut = mktime(naissance);
dif = difftime(maintenant,debut);
// on traite l'age en secondes
if (dif < 0) dif = ceil(dif);
sprintf(nbS, "%'.0i", dif);
gtk_label_set_text(GTK_LABEL(e[5]), nbS);
// en minutes
aMi = dif/60;
if (aMi < 0) aMi = ceil(aMi);
sprintf(nbS, "%'.0f", floor(aMi));
gtk_label_set_text(GTK_LABEL(e[6]), nbS);
/***********************************************************************************************
***********************************************************************************************/
// en heures
aH = (dif/(3600*24))%6;
if (aH < 0) aH = ceil(aH);
sprintf(nbS, "%'.0f", floor(aH));
gtk_label_set_text(GTK_LABEL(e[7]), nbS);
// en jours
aJ = dif/(3600*24);
if (aJ < 0) aJ = ceil(aJ);
sprintf(nbS, "%'.0f", floor(aJ));
gtk_label_set_text(GTK_LABEL(e[8]), nbS);
// en mois
aMo = (dif/(3600*24))%6;
switch (aMo)
{
case 0: {sprintf(NomVaccation,"Deuxieme nuit");
gtk_label_set_text(GTK_LABEL(e[9]),NomVaccation);}
case 1: {sprintf(NomVaccation,"Troisième nuit");
gtk_label_set_text(GTK_LABEL(e[9]),NomVaccation);}
case 2: {sprintf(NomVaccation,"Quatrieme nuit");
gtk_label_set_text(GTK_LABEL(e[9]),NomVaccation);}
case 3: {sprintf(NomVaccation,"Repos Légal");
gtk_label_set_text(GTK_LABEL(e[9]),NomVaccation);}
case 4: {sprintf(NomVaccation,"Repos Compensateur");
gtk_label_set_text(GTK_LABEL(e[9]),NomVaccation);}
case 5: {sprintf(NomVaccation,"Premiere Nuit");
gtk_label_set_text(GTK_LABEL(e[9]),NomVaccation);}
default: {sprintf(NomVaccation,"Erreur");
gtk_label_set_text(GTK_LABEL(e[9]),NomVaccation);}
}
// gtk_label_set_text(GTK_LABEL(e[9]),NomVaccation);
g_free(NomVaccation) ;
/*
gchar* sUtf8;
*/
/* Creation du label avec g_locale_to_utf8 */
/*
sUtf8 = g_locale_to_utf8("Texte à afficher", -1, NULL, NULL, NULL);
pLabel=gtk_label_new(sUtf8);
g_free(sUtf8);
*/
/* if (aMo < 0) aMo = ceil(aMo);
sprintf(nbS, "%'.0f", floor(aMo));
gtk_label_set_text(GTK_LABEL(e[9]), NomVaccation);
*/
/**********************************************************************************************
**********************************************************************************************/
gtk_widget_show_all(f);
while (g_main_context_iteration(NULL, FALSE));
//une solution de boucle avant de trouver la fonction gtk_timeout_add...
//usleep(100);
//traitement();
// doit retourner true pour être réexécuter
return TRUE;
}
Sebman