Impossible de lancer une fonction ...

Impossible de lancer une fonction ... - C - Programmation

Marsh Posté le 23-11-2009 à 15:35:27    

Bonjour à tous!
 
J'ai besoin de créer un programme qui va lire les pixels d'une image png 1 par 1 (pour plus tard y reconnaitre des lettres dedans).
 
Voici mon header :

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdarg.h>
  5. #define PNG_DEBUG 3
  6. #include <png.h>
  7. void read_png_file(char* file_name);
  8. void process_file(void);
  9. void abort_(const char * s, ...);


 
 
Et voici mon .c :

Code :
  1. /*
  2. * Copyright 2002-2008 Guillaume Cottenceau.
  3. *
  4. * This software may be freely redistributed under the terms
  5. * of the X11 license.
  6. *
  7. */
  8. #include "open_png.h"
  9. /*
  10. * Ne pas mettre en variables globales
  11. */
  12. int x, y;
  13. int width, height;
  14. png_byte color_type;
  15. png_byte bit_depth;
  16. png_structp png_ptr;
  17. png_infop info_ptr;
  18. int number_of_passes;
  19. png_bytep * row_pointers;
  20. void read_png_file(char* file_name)
  21. {
  22.   printf("Entering read_png_file" );
  23. char header[8]; // 8 is the maximum size that can be checked
  24. /* open file and test for it being a png */
  25. FILE *fp = fopen(file_name, "rb" );
  26. if (!fp)
  27.  abort_("[read_png_file] File %s could not be opened for reading", file_name);
  28. fread(header, 1, 8, fp);
  29. if (png_sig_cmp(header, 0, 8))
  30.  abort_("[read_png_file] File %s is not recognized as a PNG file", file_name);
  31. /* initialize stuff */
  32. png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
  33. if (!png_ptr)
  34.  abort_("[read_png_file] png_create_read_struct failed" );
  35. info_ptr = png_create_info_struct(png_ptr);
  36. if (!info_ptr)
  37.  abort_("[read_png_file] png_create_info_struct failed" );
  38. if (setjmp(png_jmpbuf(png_ptr)))
  39.  abort_("[read_png_file] Error during init_io" );
  40. png_init_io(png_ptr, fp);
  41. png_set_sig_bytes(png_ptr, 8);
  42. png_read_info(png_ptr, info_ptr);
  43. width = info_ptr->width;
  44. height = info_ptr->height;
  45. color_type = info_ptr->color_type;
  46. bit_depth = info_ptr->bit_depth;
  47. number_of_passes = png_set_interlace_handling(png_ptr);
  48. png_read_update_info(png_ptr, info_ptr);
  49. /* read file */
  50. if (setjmp(png_jmpbuf(png_ptr)))
  51.  abort_("[read_png_file] Error during read_image" );
  52. row_pointers = (png_bytep*) malloc(sizeof(png_bytep) * height);
  53. for (y=0; y<height; y++)
  54.  row_pointers[y] = (png_byte*) malloc(info_ptr->rowbytes);
  55. png_read_image(png_ptr, row_pointers);
  56.         fclose(fp);
  57. }
  58. /*
  59. * Voir pour creer un tableau autre que ptr pour se creer unn tableau perso, genre monochromatique en prenant une couleur
  60. * de fond unique et une couleur de lettre unique.  
  61. */
  62. void process_file(void)
  63. {
  64.   if (info_ptr->color_type != PNG_COLOR_TYPE_RGBA)
  65.     abort_("[process_file] color_type of input file must be PNG_COLOR_TYPE_RGBA (is %d)", info_ptr->color_type);
  66.   for (y=0; y<height; y++) {
  67.     png_byte* row = row_pointers[y];
  68.     for (x=0; x<width; x++) {
  69.       /* png_byte* ptr = &(row[x*4]); */
  70.       png_uint_16* ptr = (png_uint_16*)&(row[x*6]);
  71.       printf("Pixel at position [ %d - %d ] has the following RGBA values: %d - %d - %d - %d\n",
  72.      x, y, ptr[0], ptr[1], ptr[2], ptr[3]);
  73.      
  74.       /* set red value to 0 and green value to the blue one */
  75.       ptr[0] = 0;
  76.       ptr[1] = ptr[2];
  77.     }
  78.   }
  79.  
  80. }
  81. void abort_(const char * s, ...)
  82. {
  83.   printf("moo" );
  84.   va_list args;
  85.   va_start(args, s);
  86.   vfprintf(stderr, s, args);
  87.   fprintf(stderr, "\n" );
  88.   va_end(args);
  89.   abort();
  90. }
  91. int main(int argc, char **argv)
  92. {
  93.   if (argc < 2)
  94.     {
  95.       printf("Usage: program_name <file_in>" );
  96.       exit(1);
  97.     }
  98.   printf("Opening %s ...\n", argv[1]);
  99.   read_png_file(argv[1]);
  100.   printf("Proccessing %s ...\n", argv[1]);
  101.   process_file();
  102.   return 0;
  103. }


 
Lors de la compilation du programme, j'obtiens un warning :

Citation :


[ledolequ@fujiw120-l projet]$ gcc -Wall -g -lpng open_png.c
open_png.c: In function 'read_png_file':
open_png.c:43: attention : pointer targets in passing argument 1 of 'png_sig_cmp' differ in signedness
 
La ligne 43 correspond à :
if (png_sig_cmp(header, 0, 8))


 
Et lorsque j'essaie de lancer le programme avec une image en paramètre, voici ce qui se passe :

Citation :


[ledolequ@fujiw120-l projet]$ ./png ref.png  
Opening ref.png ...
[ledolequ@fujiw120-l projet]$  


 
Autrement dit, il a l'air de bloqué entre  

Code :
  1. printf("Opening %s ...\n", argv[1]);
  2.   read_png_file(argv[1]);


 
 
Des idées ? :(


Message édité par Ydalb le 23-11-2009 à 15:36:29

---------------
:o
Reply

Marsh Posté le 23-11-2009 à 15:35:27   

Reply

Marsh Posté le 23-11-2009 à 15:37:52    

quel environnement as-tu pour développer ? Tu dois bien avoir un débugger sous le coude, ce sereait le bon moment pour apprendre à t'en servir, parce que tracer à coups de printf va vite devenir un calvaire


---------------
last.fm
Reply

Marsh Posté le 23-11-2009 à 15:41:23    

Je développe sous CentOS en utilisant emacs. Je vais voir si mon école met à notre disposition des débuggers :)


---------------
:o
Reply

Marsh Posté le 23-11-2009 à 15:43:49    

Avec gdb :

 
Code :
  1. [ledolequ@fujiw120-l projet]$ gdb png
  2. GNU gdb Fedora (6.8-37.el5)
  3. Copyright (C) 2008 Free Software Foundation, Inc.
  4. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
  5. This is free software: you are free to change and redistribute it.
  6. There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
  7. and "show warranty" for details.
  8. This GDB was configured as "i386-redhat-linux-gnu"...
  9. (no debugging symbols found)
  10. (gdb) run ref.png
  11. Starting program: /home2/ledolequ/c/redoublage/projet/png ref.png
  12. (no debugging symbols found)
  13. (no debugging symbols found)
  14. (no debugging symbols found)
  15. (no debugging symbols found)
  16. (no debugging symbols found)
  17. (no debugging symbols found)
  18. Opening ref.png ...
  19. Program exited normally.
  20. (gdb)


Message édité par Ydalb le 23-11-2009 à 15:43:59

---------------
:o
Reply

Marsh Posté le 23-11-2009 à 16:12:58    

tente de mettre un breakpoint dans la fonction où tu remplis tes globales.
 
ta fonction png_read_info ne peut pas échouer ? J'ai comme l'impression que les infos que cette fonction te retourne sont nulles. Avoir soit la width soit la height à 0 expliquerait le comportement que tu obtiens


---------------
last.fm
Reply

Marsh Posté le 23-11-2009 à 16:20:46    

Alors j'ai abandonné emacs pour passer sur eclipse, après quelques minutes à voir comment configurer le bouzin, et utiliser son débugger, le test qui me fait aborder le programme est :
 
Fonction process_file :

Code :
  1. if (info_ptr->color_type != PNG_COLOR_TYPE_RGBA)
  2.      abort_("[process_file] color_type of input file must be PNG_COLOR_TYPE_RGBA (is %d)", info_ptr->color_type);


 
Je l'ai commenté et ça tourne nickel. J'vais me pencher sur ce test pour voir ce qui ne va pas.
 
Merci pour ton aide theshockwave :jap:


---------------
:o
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed