Bonjour à tous,
Je programme sous VC++.net, et je fais un petit programme qui sauve des points d'une image, et qui permet aussi de les recharger lors d'une future session (pratique si on veut pas tout se retaper).
J'ai donc deux fonctions (inspirées du C, je suis de la vieille école):
*pour sauver les points
*pour charger les points:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 void sauvePDC (int **depart,int **arrivee, int a, float coeff_mul) { int *buf; FILE *fichier = NULL; buf = (int*) calloc (4*a+1,sizeof (int)); buf[0] = a; for (int i=0 ; i<a ; i++) { buf[i+1] = int (floor (float(depart[i][0])/coeff_mul) + 0.5); buf[i+a+1] = int (floor (float(depart[i][1])/coeff_mul) + 0.5); buf[i+2*a+1] = int (floor (float(arrivee[i][0])/coeff_mul) + 0.5); buf[i+3*a+1] = int (floor (float(arrivee[i][1])/coeff_mul) + 0.5); } fichier = fopen("config.XY", "w+"); if (fichier != NULL) { fwrite(buf, sizeof(int), 4*a+1, fichier); fclose(fichier); } else { std::cerr << "erreur d'ouverture du fichier" ; std::exit(-1); } free(buf); }
*L'appel se fait via la fonction main.cpp, dont voici les bouts de code qui vous intéressent:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 void chargePDC (int** depart, int** arrivee, int *a, float coeff_mul) { FILE* fichier = NULL; int *buf; buf = (int*) calloc (4*NBPOINTS+1,sizeof (int)); fichier = fopen("config.XY", "r"); if (fichier != NULL) { fread(buf,sizeof(int),4*NBPOINTS+1, fichier); fclose(fichier); } else { std::cerr << "erreur d'ouverture du fichier" ; std::exit(-1); } *a =buf[0]; for (int i=0; i<(*a); i++){ depart[i][0] = int(floor( float( buf[i+1]) * coeff_mul) + 0.5); depart[i][1] = int(floor( float(buf[i+(*a)+1]) * coeff_mul) + 0.5); arrivee[i][0] = int(floor( float(buf[i+2*(*a)+1]) * coeff_mul) + 0.5); arrivee[i][1] = int(floor( float(buf[i+3*(*a)+1]) * coeff_mul) + 0.5); } free(buf); }
Lors de mes tests, j'avais trouvé que mon système de sauvegarde dans ce config.XY fonctionnait correctement. Seulement, lorsque s'autres l'ont testé, ils m'ont rapporté des erreurs bizarres: les points parfois se retrouvait tous collés en haut de l'image. En effet, le fichier config.XY contenait alors beaucoup de 0...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #define NBPOINTS 50 /* Allocation dynamique de mémoire pour les points de contrôles */ depart = (int**) calloc (NBPOINTS,sizeof(int*)); for (int i= 0;i<NBPOINTS;i++) { depart[i] = (int*) calloc(2, sizeof(int)); } arrivee = (int**) calloc (NBPOINTS,sizeof(int*)); for (int i= 0;i<NBPOINTS;i++) { arrivee[i] = (int*) calloc(2, sizeof(int)); } /*Sauve les Points de Controle */ if (main_disp.key == cimg_library::cimg::keyS) { sauvePDC (depart,arrivee, a, coeff_mul); } /* Charge les points de controles*/ if (main_disp.key == cimg_library::cimg::keyC) { chargePDC(depart,arrivee, &a, coeff_mul); }![]()
Je n'ai pas réussi à identifier le problème, mais je ne programme surement pas depuis assez longtemps pour arriver à tout comprendre...
Merci d'avance pour votre aide.
P.S : j'ai bien lu la FAQ concernant la lecture/écriture de fichier, mais avant de tout recoder, je voulais d'abord vous "consulter". Comme je gère des images comme des matrices, et que j'ai pas voulu me lancer dans des vecteurs de vecteurs, je sais pas si c'est un bonne idée de jouer avec les "fstream"....
Partager