Je réfléchi en ce moment à la réalisation d'une bibliothèque scientifique et j'ai quelques problèmes de conception. J'aimerai l'écrire en C (voir mes raisons plus bas), et en même temps avoir quelque chose de générique. C'est mon premier code C un peu important, et j'ai sans doutes du mal avec sa conception aussi parce que j'ai fait trop de Python/C++ et que le modèle objet m'est devenu familier.
EDIT: Après les conseils de tout un tas de gens, la lib sera écrite en C++, avec une interface C.
Buts
Cette bibliothèque serait une abstraction au dessus de plusieurs formats de fichiers, stockant tous les mêmes informations. L'idée est de proposer une structure de donnée interne générique, et de lire/écrire ces données dans un fichier en supportant plusieurs formats.
Pourquoi le C
J'aimerai écrire ce code sous la forme d'une bibliothèque qui soit utilisable depuis plusieurs langages. Le C me semble donc être un bon candidat pour faire ça ! Les cibles sont :
- Le C (ça c'est bon)
- Fortran 90 et plus (via
iso_c_binding
) - Python (interface CPython)
- Julia (pas de problème avec
ccall
) - Pourquoi pas Java un jour, mais rien n'est sûr.
Pourquoi le C me pose des problèmes
Principalement parce qu'il manque de généricité : je ne voit pas comment faire pour avoir un unique point d'entrée dans ma bibliothèque. Le C++ me parait assez intéressant pour résoudre des problèmes du C, mais en a d'autres :
- Flux de lecture/écriture réputés être lents, et j'aimerai avoir une bibliothèque efficace.
- Comment faire pour appeler du code C++ depuis le C ou le Fortran ?
Ce que je veux faire
Avoir un point d'entrée unique quelque soit le format de fichier : L'utilisation devrait être aussi simple que :
1 2 3 4 5 6 7 8 9 10 | MyFile *file = open("filename.ext"); MyData data; read(file, &data); // Change data here write(file, &data); close(file); |
Seulement, l'implémentation d'une fonction read
et write
dépends du type de fichier (déterminé dynamiquement à partir de l'extension). Et c'est là qu'est tout le problème …
En gros je pensais avoir une table de hash qui associe les extensions à une structure FILE
, cette structure contenant des pointeurs vers les fonctions à utiliser. Mais je ne suis pas sûr que ce soit la meilleur manière de faire ça, ni que ça convienne totalement. Comment feriez-vous pour résoudre ce problème en C ?