Bonjour,

je dois rendre un projet en programmation C, qui consiste a afficher un menu qui permet le traitement d'image sous format PPM, PGM et PBM. Cependant, pour écrire le menu, on nous a demandé de passer par des structures de données et pour chaque menu, il y a plusieurs données, notamment les actions qu'il effectue et ses sous-menus. Je vous laisse mon fichier menu.c et menu.h ci-dessous afin que vous puissiez comprendre un peu plus.

Mon programme marche très bien quand j’implémente des fonctions void dans les actions d'un menu. Cependant, quand je cherche à implémenter une fonction avec un return, erreur de compilation tout-à-fait compréhensible car ma fonction d’implémentation (addActionMenu) n'attend que des fonctions void à implémenter. Je voudrai vous demander comment faire pour implémenter n'importe quel type de fonction dans mon menu svp, et merci !

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
#ifndef __MENU_H__
#define __MENU_H__
 
 
//structures
typedef struct{
  char* nom;
  void (*f) ();
}action;
 
typedef enum item_kind{
  SubMenu_kind,
  Action_kind,
}item_kind;
 
typedef union item_union{
  struct menu* SubMenu;
  action Action;
}item_union;
 
typedef struct item{
  item_kind Kind;
  item_union Union;
}item;
 
struct menu {
  struct menu* parent;
  char* nom;
  item items[9];
  int nbItem;
};
typedef struct menu menu;
 
 
#endif
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
//MENU.C
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include "menu.h"
 
//structure image
typedef struct {
  unsigned char R;
  unsigned char G;
  unsigned char B;
  unsigned char A;
}pixel_t;
typedef struct {
  int h;
  int w;  
  pixel_t* pixel;
}image;
 
//exemple de fonction load_image que je veux implémenté dans le menu ouvrir
image* load_image(){
  char fname[100];
  printf("Entrez le nom complet de l'image à ouvrir svp: ");
  scanf("%s", fname);
 
  image* im = malloc (sizeof(image));  
  FILE* fichier = NULL;
 
  fichier = fopen(fname, "r");
  if(fichier == NULL){
    fprintf(stderr, "Imposible d'ouvrir le fichier %s\n", fname);    
    exit(EXIT_FAILURE);
  }
  return im;
}
 
menu* createMenu(const char* text){
  menu* m = (menu*) malloc(sizeof(menu));
  m->parent = NULL;
  m->nom = malloc(strlen(text + 1) * sizeof(char));
  strcpy(m->nom, text);
  m->nbItem = 0;
  return m;
}
void addMenuAction(menu* m, const char* text, void (*f)()){
    m->items[m->nbItem].Kind = Action_kind;
    m->items[m->nbItem].Union.Action.nom = malloc(strlen(text + 1) * sizeof(char));
    strcpy(m->items[m->nbItem].Union.Action.nom, text);
    m->items[m->nbItem].Union.Action.f = f;
    m->nbItem++;
}
void addSubMenu(menu* m, menu* sm){
  if(sm->parent == NULL){   
    sm->parent = m;
    m->items[m->nbItem].Kind = SubMenu_kind;
    m->items[m->nbItem].Union.SubMenu = sm;
    m->nbItem++;
  }
}
void deleteMenu(menu* m) {
  if(m->parent == NULL) free(m);  
}
void viderBuffer(){
  int c = 0;
  while(c != '\n' && c != EOF) c = getchar();
}
void launchMenu(menu* m){
  int i, cn;
  bool p = false;
  char c;
  printf("%s\n\n", m->nom);
  for(i = 1; i <= m->nbItem; i++){
    switch(m->items[i-1].Kind){
      case SubMenu_kind:
      printf("%d - %s\n\n", i, m->items[i-1].Union.SubMenu->nom);
      break;
      case Action_kind:
      printf("%d - %s\n\n", i, m->items[i-1].Union.Action.nom);
      break;
    }
  }
  do {
    printf("Choice ?");
    c = getchar();
    cn = (int)c;
    if(cn == 112){
      p = true;
      cn = 1;
    }else cn -= 48;    
    viderBuffer();
  }while(cn > m->nbItem || cn < 1);
  cn--;
  if(p && m->parent != NULL) {
    system("clear");
    launchMenu(m->parent);
  }else if (cn > -1 && !p) {
    switch(m->items[cn].Kind){
      case Action_kind: 
      system("clear");
      m->items[cn].Union.Action.f();
      break;
      case SubMenu_kind:   
      system("clear");
      launchMenu(m->items[cn].Union.SubMenu); 
      break;
    }
  } else {
    system("clear");
  }
}
 
bool cont = true;
 
void quit() {
  printf("Au revoir, fermeture du programme.\n");
  cont = false;
}
 
int main() {
	menu* m;
	menu* sm;
 
 
	m = createMenu("Menu principal");
 
	sm = createMenu("Fichier");
	addSubMenu(m, sm);
	addMenuAction(sm,"Ouvrir", load_image);
  //erreur de compilation car la fonction attend un void (*f)
  //alors que moi j'ai besoin d'un return, et comment recupérer le return?
 
	while(cont) launchMenu(m);
 
	deleteMenu(m);
 
	return EXIT_SUCCESS;
 
}