Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
980 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Dessin dans Drawing Area gtk+ sous linux

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Dessin dans Drawing Area gtk+ sous linux

n°2040073
amaury10
Posté le 05-12-2010 à 08:55:31  profilanswer
 

Bonjour à tous,
 
Dans l'optique d'afficher une image au format ppm, je doit remplir une drawing area pixels par pixels.
J'ai donc écrit un morceau de code qui lit l'image et la stocke dans une variable.
 
Le problème survient à l'affichage: J'ai une erreur *** glibc detected ***
 
Voici le programme incriminé:
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <gtk/gtk.h>
  4. #include <string.h>
  5. #include <math.h>
  6. #include "lib_image.h"
  7. #define NB_MAX_LIG 600
  8. #define NB_MAX_COL 600
  9. /*
  10.   Fonction de lecture d'une image au format ppm.
  11.   Attention, cette fonction ne gere pas les lignes de commentaire
  12.   qui pourraient se trouver dans le fichier image (ligne commencant par #)
  13.   Parametre:
  14.   - uneImage: pointeur sur une struture de type Timage qui doit deja etre allouee
  15.   - filename: nom du fichier contenant les données de l'image
  16. */
  17. int Eval(char Chaine[20])
  18. {
  19.     int i,valeur=0;
  20.     for (i=0;i<strlen(Chaine);i++)
  21.     {
  22.         valeur+=(Chaine[i]-48)*pow(10,strlen(Chaine)-i-1);
  23.     }
  24.     return valeur;
  25. }
  26. int Taille_fichier (const char *filename)
  27. {
  28.     char ligne[20];
  29.     int i=0;
  30.     FILE *image;
  31.     image=fopen(filename, "rt" );
  32.     while (fgets( ligne, 20, image ) != NULL)
  33.     {
  34.         i++;
  35.     }
  36.     fclose(image);
  37.     return i;
  38. }
  39. void Lire_Image_PPM (Timage *monImage, const char *filename)
  40. {
  41.     FILE *image;
  42.     char ligne[20],col[20],lig[20];
  43.     int i=0,j=0;
  44.     image=fopen(filename, "rt" );
  45.     fgets(ligne, 20, image);
  46.     fgets(ligne, 20, image);
  47.     while (ligne[i]!=' ')
  48.     {
  49.         lig[i]=ligne[i];
  50.         i++;
  51.     }
  52.     lig[i]='\0';
  53.     i++;
  54.     j=i;
  55.     while (ligne[i]!='\n')
  56.     {
  57.         col[i-j]=ligne[i];
  58.         i++;
  59.     }
  60.     col[i-j]='\0';
  61.     fclose(image);
  62.     (*monImage).nb_col=Eval(col);
  63.     (*monImage).nb_lig=Eval(lig);
  64.     for (i=0;i<(*monImage).nb_lig;i++)
  65.     {
  66.         for (j=0;j<(*monImage).nb_col;j++)
  67.         {
  68.             fgets(ligne, 20, image);
  69.             (*monImage).pixels[j][i].r=Eval(ligne);
  70.             fgets(ligne, 20, image);
  71.             (*monImage).pixels[j][i].v=Eval(ligne);
  72.             fgets(ligne, 20, image);
  73.             (*monImage).pixels[j][i].b=Eval(ligne);
  74.         }
  75.     }
  76. }
  77. void decouper_image(Timage * ima1, Timage * ima2, int c1, int l1, int c2, int l2)
  78. {
  79.     /*
  80.     ...
  81.     a remplir
  82.     ...
  83.     */
  84. }
  85. void Affiche_Image (Timage monImage,char name[20], int argc, char *argv[])
  86. {
  87.     int i,j;
  88.     GtkWidget *image;
  89.     GtkWidget *window;
  90.     GdkGC *gc;
  91.     GdkColor fg;
  92.     GdkRectangle update;
  93.     gtk_init(&argc, &argv);
  94.     //-------------------------Création fenetre---------------------------------------------
  95.     window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  96.     gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
  97.     gtk_window_set_default_size(GTK_WINDOW(window),monImage.nb_lig, monImage.nb_col);
  98.     gtk_window_set_title(GTK_WINDOW(window), name);
  99.     gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
  100.     gtk_container_set_border_width(GTK_CONTAINER(window), 2);
  101.     //------------------------Creation Drawing Area-----------------------------------------
  102.     image = gtk_drawing_area_new();
  103.     gtk_widget_set_usize(image, monImage.nb_lig, monImage.nb_col);
  104.     update.x=0;
  105.     update.y=0;
  106.     update.width=monImage.nb_lig;
  107.     update.height=monImage.nb_col;
  108.     gtk_container_add(GTK_CONTAINER(window), image);
  109.     g_signal_connect_swapped(G_OBJECT(window), "destroy",
  110.                              G_CALLBACK(gtk_main_quit), G_OBJECT(window));
  111.     //---------------------------Remplissage Drawing Area avex pixels--------------------
  112.     for (i=0;i<monImage.nb_lig;i++)
  113.     {
  114.         for (j=0;j<monImage.nb_col;j++)
  115.         {
  116.             //Définition couleur
  117.             fg.red = monImage.pixels[j][i].r*255;
  118.             fg.green = monImage.pixels[j][i].v*255;
  119.             fg.blue = monImage.pixels[j][i].b*255;
  120.             gc = gdk_gc_new(GDK_DRAWABLE (image));
  121.             gdk_gc_set_foreground(gc, &fg);
  122.             //Dessin pixel
  123.             gdk_draw_point(&image,gc, j, i);
  124.         }
  125.     }
  126.     gtk_widget_draw (image,&update);
  127.     gtk_widget_show_all(window);
  128.     gtk_main();
  129. }
  130. int main (int argc, char *argv[])
  131. {
  132.     Timage monImage;
  133.     Lire_Image_PPM (&monImage, "DentDuGeant.ppm" );
  134.     Affiche_Image(monImage, "Dent Du Geant",&argc, &argv);
  135. }


 
A priori, seule la fonction Affiche_Image génère une erreur...
 
Si quelqu'un peut m'aider à résoudre se problème, merci d'avance.


---------------
LAURENT Amaury, Etudiant Ingénieur - Instrumentation Automatique Informatique
mood
Publicité
Posté le 05-12-2010 à 08:55:31  profilanswer
 

n°2040075
Profil sup​primé
Posté le 05-12-2010 à 09:42:37  answer
 

Tu peux essayer de trouver avec Debug.
 
Je n'y pense jamais pour ma par. :/

n°2040082
breizhbugs
Posté le 05-12-2010 à 11:52:32  profilanswer
 

Bonjour,
D'après google, il y a plusieurs type d'erreur glibc "detected", de laquelle s'agit il?
Sinon pour tes couleurs pourquoi tu les multiplie toutes par 255?


---------------
Seul Google le sait...
n°2040092
amaury10
Posté le 05-12-2010 à 13:39:17  profilanswer
 

Merci pour les réponses.
 
Pour les couleurs, il me semble que gtk travail entre 0 et 65535. Mon image est codée sur 8 bits par couleurs.
 
Pour le reste, voici le message d'erreur généré par la console:
*** glibc detected *** /home/alaur/Documents/Programme C/TP5/Traitement image/bin/Debug/Traitement image: malloc(): memory corruption: 0xb771f008
 
Je précise que je travail avec Code::blocks.
 
PS: le code se compile et s'exécute. L'erreur survient donc à l'exécution.


Message édité par amaury10 le 05-12-2010 à 13:40:03

---------------
LAURENT Amaury, Etudiant Ingénieur - Instrumentation Automatique Informatique
n°2040095
GrosBocdel
Posté le 05-12-2010 à 13:52:32  profilanswer
 

tu crées un graphic context pour chaque pixel de ton image  [:cerveau skyzor]

n°2040102
amaury10
Posté le 05-12-2010 à 14:32:30  profilanswer
 

GrosBocdel a écrit :

tu crées un graphic context pour chaque pixel de ton image  [:cerveau skyzor]


 
Tu pourrais préciser un peu ton propos STP? C'est ma première interface graphique avec gtk...
J'ai pas encore appréhendé tous les concepts de gtk.


---------------
LAURENT Amaury, Etudiant Ingénieur - Instrumentation Automatique Informatique
n°2040103
GrosBocdel
Posté le 05-12-2010 à 14:34:48  profilanswer
 

amaury10 a écrit :


 
Tu pourrais préciser un peu ton propos STP? C'est ma première interface graphique avec gtk...
J'ai pas encore appréhendé tous les concepts de gtk.


 
sors
gc = gdk_gc_new(GDK_DRAWABLE (image));
de tes boucles. C'est à faire une seule fois.

n°2040199
amaury10
Posté le 06-12-2010 à 07:42:45  profilanswer
 

GrosBocdel a écrit :


sors
gc = gdk_gc_new(GDK_DRAWABLE (image));
de tes boucles. C'est à faire une seule fois.


 
Salut,
 
C'est fait, mais le problème persiste...


---------------
LAURENT Amaury, Etudiant Ingénieur - Instrumentation Automatique Informatique
n°2040221
GrosBocdel
Posté le 06-12-2010 à 10:17:23  profilanswer
 

amaury10 a écrit :


 
Salut,
 
C'est fait, mais le problème persiste...


 
Si tu l'as bien mis avant tes deux boucles, je ne vois rien de plus que je puisse faire sans compiler le truc complet!
 
Eventuellement place des printf("toto\n" ); un peu partout, ça peut t'aider à savoir quelle ligne provoque le truc, même si avec les ihm ça marche pas toujours.
 
edit je dis une bétise: il me semble que les fonctions du style gtk_main() doivent se trouver dans ton main()
 


Message édité par GrosBocdel le 06-12-2010 à 10:22:01
n°2040354
amaury10
Posté le 06-12-2010 à 18:38:06  profilanswer
 

Merci d'essayer de m'aider. J'ai déplacer le gtk_main() dans le main. Sa ne marche toujours pas.
 
Je vais donc écrire un petit programme en python qui affiche l'image avec TKinter...


---------------
LAURENT Amaury, Etudiant Ingénieur - Instrumentation Automatique Informatique
mood
Publicité
Posté le 06-12-2010 à 18:38:06  profilanswer
 

n°2040357
tpierron
Posté le 06-12-2010 à 19:08:24  profilanswer
 

Ça sent le buffer overflow ton problème, plus que certainement dû à ta fonction de lecture d'image.  
 
Pourrait-on avoir la définition du type Timage (voire tout le fichier lib_image.h si ce n'est pas trop long) ?

n°2040359
GrosBocdel
Posté le 06-12-2010 à 19:12:14  profilanswer
 

tpierron a écrit :

Ça sent le buffer overflow ton problème, plus que certainement dû à ta fonction de lecture d'image.  
 
Pourrait-on avoir la définition du type Timage (voire tout le fichier lib_image.h si ce n'est pas trop long) ?


 
Il y a ça aussi qui est louche:
gdk_draw_point(&image,gc, j, i);
image est déjà un pointeur.
 
Je passe mon tour  [:cosmoschtroumpf] sinon on va corriger les corrections de corrections pendant des heures


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Dessin dans Drawing Area gtk+ sous linux

 

Sujets relatifs
Script shell scripting bash/LinuxDroit d'accès avec Alsa et Gtk (Gnu/Linux)
Cookies en localhostLinux - notification d'insertion disque
dessin du JPanel qui s'efface qd je scrollrechercher éditeur python sous linux
[Java] Problème de dessin dans jPanelCompilation Mesa-7.8.1 sous linux
[PHP] écrire dans un terminal linux à partir d'un scriptControle d'un terminal Linux via PHP
Plus de sujets relatifs à : Dessin dans Drawing Area gtk+ sous linux


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR