Bonsoir,
J'ai mis au point quelques fonctions permettant de travailler sur des files. Maintenant pour pouvoir me resservir un jour de ces fonctions j'ai souhaité les rendre plus génériques. J'utilise un le type void*. Pour mettre en place mes files, je me sers d'un buffer tournant.
Les fonctions fonctionnent par exemple si je veux faire une structure de type int. En revanche si j'essaye d'utiliser un type personnel (ici des coordonnées) je ne parviens pas à lire ces coordonnées. Je ne sais pas comment faire...
Je vous montre mon code :
libfifo.c :
libfifo.h
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stddef.h> #include "libfifo.h" Fifo* creer_fifo(u_int taille, size_t type) { Fifo* fifo = NULL; if ((fifo = malloc(sizeof(Fifo))) && (fifo->tableau = malloc(taille * type))) { fifo->debut = fifo->fin = fifo->elements = 0; fifo->capacite = taille; } else { fprintf(stderr, "Allocation fifo impossible\n"); } return fifo; } void liberer_fifo(Fifo* fifo) { free(fifo->tableau); free(fifo); } int ajouter_element_fifo(Fifo* fifo, void* element, size_t type) { if (fifo->elements <= fifo->capacite) { memcpy(&(fifo->tableau[fifo->fin]), element, type); fifo->fin = (fifo->fin + 1) % fifo->capacite; fifo->elements++; } else { fprintf(stderr, "Fifo pleine !\n"); return 0; } return 1; } int supprimer_element_fifo(Fifo* fifo) { if (fifo->elements == 0) { return 0; } else { fifo->debut = (fifo->debut + 1) % fifo->capacite; fifo->elements--; } return 1; } int main(void) { int i = 0; Coord c = {1, 1}; Fifo* fifo = NULL; fifo = creer_fifo(10, sizeof(Coord)); for (i = 0; i < 10; i++) { ajouter_element_fifo(fifo, &c, sizeof(Coord)); } for (i = 0; i < 10; i++) { printf("%d %d\n", fifo->tableau[i]->x, fifo->tableau[i]->y); } return 0; }
C'est juste un essai et ça ne fonctionne pas... J'aimerais bien comprendre pourquoi.
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
26
27
28
29
30
31
32
33 #ifndef LIBFIFO_H #define LIBFIFO_H typedef unsigned int u_int; typedef struct coordonnees { u_int x; u_int y; } Coord; typedef struct fifo { void** tableau; int debut; int fin; int elements; int capacite; } Fifo; Fifo* creer_fifo(u_int taille, size_t type); void liberer_fifo(Fifo* fifo); int ajouter_element_fifo(Fifo* fifo, void* element, size_t type); int supprimer_element_fifo(Fifo* fifo); #endif
Merci à vous.
Bye.
PS : Le problème vient surtout de l'utilisation d'un tableau générique, je ne sais pas si ça se fait car je ne le vois pas nulle part...
Partager