Bonjour à tous,

Je cherche à insérer une valeur dans un tableau de structure et à l'afficher en passant uniquement par des pointeur de fonction (c'est un peu débile je dois le reconnaitre mais c'est la consigne d'un devoir que je dois rendre la semaine prochaine).

Cela me permettra de créer un tableau de valeur sans avoir à spécifier le type de la valeur (en passant pas la variable size_of_data de la structure).

Mais je me retrouve face à des erreur de segmentation (du à l'insertion de la valeur) et je ne sais pas comment afficher la valeur qui est pointé par un void.

Voici mon code:
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
 
typedef void * (* t_data_default_init)();
typedef void (* t_data_reset_to_init)(void * p_data);
typedef void (* t_data_cpy)(void *p_data_dst, void *p_data_src);
 
typedef struct struct_vector{
    size_t nbElement;
    void* element;
    t_data_default_init data_default_init;
    t_data_reset_to_init data_reset_to_init;
    t_data_cpy data_cpy;
    size_t size_of_data;
}s_vector;
 
typedef s_vector* p_s_vector;
 
void my_struct_default_init(p_s_vector p_vector){
    p_vector->nbElement = 0;
    p_vector->element = NULL;
}
 
void my_struct_reset_to_default(p_s_vector p_vector){
    p_vector->nbElement = 0;
    if(p_vector->element != NULL){
        free(p_vector->element);
        p_vector->element = NULL;
    }
}
 
void my_struct_copy(p_s_vector p_dest, p_s_vector p_src){
    p_dest->nbElement = p_src->nbElement;
    p_dest->element = malloc(sizeof(p_src->size_of_data) * (p_src->nbElement + 1));
    strcpy(p_dest->element, p_src->element);
}
 
p_s_vector vector_alloc(size_t n, size_t size_of_data, t_data_default_init data_default_init
    , t_data_reset_to_init data_reset_to_init, t_data_cpy data_cpy){
 
    p_s_vector vect = malloc(sizeof(s_vector));
    vect->size_of_data = size_of_data;
    vect->data_default_init = data_default_init;
    vect->data_reset_to_init = data_reset_to_init;
    vect->data_cpy = data_cpy;
    vect->nbElement = n;
    vect->element = malloc(n * vect->size_of_data);
    for(int i=0; i<n; i++){
         vect->data_default_init(vect->element + (i * vect->size_of_data));
         //vect->element[i] = data_default_init(vect->size_of_data);
    }
 
    // p_s_vector vect = malloc(sizeof(s_vector));
    // vect->nbElement = n;
    // vect->element = malloc(sizeof(double) * n);
    // for(int i=0; i<n; i++){
        // vect->element[i] = i;
    // }
    return vect;
}
 
void vector_free(p_s_vector p_vector){
    for(int i=0; i<p_vector->nbElement; i++){
        p_vector->data_reset_to_init(p_vector->element + i*p_vector->size_of_data);
        //p_vector->element[i] = data_reset_to_init(p_vector->size_of_data);
    }
    free(p_vector->element);
    p_vector->element = NULL;
    free(p_vector);
    p_vector = NULL;
}
 
void vector_insert(p_s_vector p_vector, size_t i, void * v){
    if(i < 0 || i > p_vector->nbElement)
        exit(0);
    else{  
        p_vector->nbElement++;
 
        void * temp = (void*) malloc(p_vector->size_of_data * (p_vector->nbElement));
 
        for(int k=0; k<i; k++){
            p_vector->data_cpy(temp + k * (p_vector->size_of_data), p_vector->element +k*(p_vector->size_of_data));
            p_vector->data_reset_to_init(p_vector->element +k*(p_vector->size_of_data));
        }
 
        p_vector->data_cpy(temp + i * (p_vector->size_of_data), v);
 
        for(int k=i; k<p_vector->nbElement; k++){
            p_vector->data_cpy(temp + (k+1) * (p_vector->size_of_data), p_vector->element +k*(p_vector->size_of_data));
            p_vector->data_reset_to_init(p_vector->element +k*(p_vector->size_of_data));
        }
 
        free(p_vector->element);
        p_vector->element = temp;
    }
}
 
int main(){
    size_t n = 4;
    p_s_vector tab = vector_alloc(n,sizeof(char), my_struct_default_init, my_struct_reset_to_default, my_struct_copy);
 
    vector_insert(tab, 2, 'c');
 
    for(int i = 0; i<tab->nbElement; i++)
        printf("%c\n",tab->element+i*tab->size_of_data);
 
 
    vector_free(tab);
    return 0;
}
De plus je ne sais pas quel spécificateur je doit mettre pour afficher la valeur (de tout type de variable) avec le printf.

Comment pourrai-je contourner ce problème.

Merci d'avance pour votre aide