Bonjour à tous,
Désolé par avance mais l'explication va être un peu longue.
Je précise que je suis débutant en C . Je travaille avec Code::Blocks sous Linux (Xubuntu 9.10).
Dans le cadre d'un projet scientifique je dois utiliser un simulateur hydraulique ( qui permet de calculer débits, pressions, pertes de charges et plus encore à partir des caractéristiques du réseau).
La difficulté, c'est que ce simulateur doit être appelé par un autre algo écrit en C pour Linux. J'ai donc trouvé une version avec les fichiers source pour Linux d'un simulateur hydraulique appelé EPANET.
Les explications fournies avec les fichiers sources sont disponibles ici.
Les fichiers sources eux-mêmes sont téléchargeables ici.
J'ai donc suivi les instructions de la section "Building the EPANET Toolkit from source" pour compiler la bibliothèque (on obtient bien une bibliothèque et les headers correspondants).
Avant compilation, j'avais jeté un oeil au fichier principal epanet.c et apparemment on peut le compiler soit pour Windows soit pour Linux. Il y a une ligne #define LINUX que j'ai dé-commentée et une ligne #define DLL (pour Windows) que j'ai commentée (comme expliqué dans les commentaires du fichier). C'est peut-être un peu confus comme explication donc, si vous avez le temps d'y jeter un coup d'oeil, ouvrez-le fichier et vous comprendrez.
Afin de tester si ma bibliothèque fonctionne, j'ai créé un petit programme tout simple pour appeler la fonction principale de la bibliothèque.
Auparavant j'ai créé un fichier d'entrée (pour décrire le réseau) comme expliqué dans la documentation d'EPANET (cf. Appendix C p. 139).
Petite précision: à l'origine, ce programme avec son interface graphique ne tourne que sous Windows et la notice fait donc référence à l'utilisation en ligne de commande. Mais je ne vois pas pourquoi le mec qui a adapté ça pour compiler avec GCC aurait changé le fonctionnement du programme...
Bref mon petit programme ça donne ça:
Le prototype de la fonction ENepanet est le suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 #include <stdio.h> #include <stdlib.h> #include "toolkit.h" int main() { char *inputFile = "2L_EPANET_INPUT", *outputFile = "2L_EPANET_OUTPUT"; ENepanet(inputFile, outputFile, NULL, NULL); return 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 int DLLEXPORT ENepanet(char *f1, char *f2, char *f3, void (*pviewprog) (char *)) /*------------------------------------------------------------------------ ** Input: f1 = pointer to name of input file ** f2 = pointer to name of report file ** f3 = pointer to name of binary output file ** pviewprog = see note below ** Output: none ** Returns: error code ** Purpose: runs a complete EPANET simulation ** ** The pviewprog() argument is a pointer to a callback function ** that takes a character string (char *) as its only parameter. ** The function would reside in and be used by the calling ** program to display the progress messages that EPANET generates ** as it carries out its computations. If this feature is not ** needed then the argument should be NULL. **------------------------------------------------------------------------- */
Petite remarque déjà, le coup des pointeurs sur char je ne connais pas. Dans le tuto que j'ai suivi, on utilisait des pointeurs sur FILE.
J'ai supposé qu'il suffisait de mettre le nom des fichiers et placer lesdits fichiers dans le même répertoire.
Mais le vrai problème c'est que mon fichier de sortie reste désespérément vide!
Il n'y a même pas de console qui s'ouvre pour le débogage d'EPANET donc je suppose que l'appel à la fonction de la bibliothèque ne fonctionne même pas!
Pour compléter le tableau, voilà ce que me dit Code::Blocks:
Linking console executable: bin/Release/Test
/bin/sh/: g++: not found
Process terminated with status 127 (0 minutes, 1 seconds)
0 errors, 0 warnings
Je ne comprends pas le "g++: not found"! Normalement, la bibliothèque que j'ai a été compilée avec GCC et c'est aussi GCC qui est utilisé pour compiler mon projet dans Code::Blocks. En plus, vu le nom, g++ doit être un compilateur C++ alors qu'il me semble que ma bibliothèque est en C vu qu'elle est compilée avec GCC (mais mes connaissances dans ce domaine sont pire que vagues, alors...).
Bref, cela fait beaucoup de questions et je n'ai peut-être pas le niveau pour faire tout ça mais je dois avancer dans mon projet qui repose là-dessus.
Donc si vous avez le temps de vous pencher sur mon problème et de me donner un coup de main, je vous en serais très reconnaissant.
Merci au moins de m'avoir lu jusque là!
Partager