Cherche lib pour faire des listes de caracteres

a marqué ce sujet comme résolu.

Glib. Vu qu’en C, tu es très rapidement à poil, toutes les bibliothèques un peu riches vont souvent offrir beaucoup de choses (structure de données, locking, FS, réseau, …)

Davidbrcz

Wow, ça m’a l’air bien trop complet pour ce que compte faire l’auteur. Une simple recherche pour C linked list library m’emenne vers Liblist, qui se contente de fournir une implémentation de liste chainée.

parceque je n’ai pas envie de réinventer la roue

robert003

Pourquoi ne pas utiliser l’interfaçage entre langage de script/C ?

Par exemple,

Ça te permet d’utiliser la flexibilité des objets du langage de script comme les listes et l’efficacité d’un code compilé en codant en C.

Surtout que les objets du langage de scripts sont très souvent créés en C.

EDIT: En cython, ton code exemple donnerait

1
2
3
4
5
6
7
cdef char c = 'a'
my_list = []

my_list.append(c)

print(my_list[0]) # affiche 97
print(my_list) # affiche [97]
+0 -2

En C, il est important de bien comprendre ce qu’on fait. Sinon, on n’arrive à rien.

Comprendre comment fonctionne une liste chaînée, c’est important. Du coup, ça vaut le coup de tout recoder.

Après, on va pas le refaire tout le temps. Aussi, il existe des algo qui sont souvent plus performant et tous les apprendre serrait extrêmement long. Du coup, utiliser un lib externe c’est pratique. Le problème c’est que souvent il n’en existe pas qui sortent du lot. Mais il en existe plein d’intéressantes.

+0 -2

En C, il est important de bien comprendre ce qu’on fait. Sinon, on n’arrive à rien.

Comprendre comment fonctionne une liste chaînée, c’est important. Du coup, ça vaut le coup de tout recoder.

ache

Seulement il n’exprime pas dans un de ses topics son ignorance sur la construction d’une liste chaînée, si ?

Pourquoi ne pas la créer toi même ? ;)

Pouet_forever

Wow, ça m’a l’air bien trop complet pour ce que compte faire l’auteur.

GaaH

Faut se décider au bout d’un moment. J’ai pas bien compris pourquoi le message de Pouet_Forever a été downvoté.

Le souci en C c’est que tout n’est pas standard. Contrairement au C++, il n’existe pas de STL qui fournisse une implémentation et une interface portables pour manipuler les listes chaînées en C (en fait, en C++, tu t’en fiches pas mal de l’implémentation de la STL en tant qu’utilisateur). Et d’une architecture à une autre les besoins et les contraintes varient. Glib peut être overkill dans certains cas.

Et ce qu’il faut souligner avec Glib, c’est que son fonctionnement se rapproche pas mal de Java où il faut impérativement faire "dériver" ta structure de GObject. J’avais bien réinventé la roue pour pas grand-chose au final, en plus.

Tes besoins sont trop spécifiques pour t’en limiter au C ? Tu n’as pas besoin d’un gros bric-à-brac d’outils ? Je persiste et signe : fais ton propre module.

+1 -1

En C, il est important de bien comprendre ce qu’on fait. Sinon, on n’arrive à rien.

Comprendre comment fonctionne une liste chaînée, c’est important. Du coup, ça vaut le coup de tout recoder.

ache

Seulement il n’exprime pas dans un de ses topics son ignorance sur la construction d’une liste chaînée, si ?

fred1599

Dans le doute je précise.

+0 -0

En fait je commence à comprendre pourquoi Pouet a autant de downvotes, surtout de la part de personnes qui n’embrassent pas autant le C que des cadors type Lucas-84 ou encore Taurre (voire pas du tout, mais je ne suis pas dans la tête des gens).

C’est parce que pour un programmeur C, c’est évident que l’écriture d’un module de liste chaînées est peu coûteux sur moult aspects. Pour les autres, ça ne l’est pas.

Le C est un langage pour programmer des systèmes. Il est encore utilisé pour programmer des systèmes embarqués, tous autant hétérogènes les uns des autres. Il est tout à fait normal de voir d’une entreprise à une autre des modules internes où il est question de gérer ses chaînes de caractère / ses listes chaînées "à sa sauce". La roue est réinventée…

Pour plusieurs raisons : l’éco-système du C, si il existe, ne vaut en rien celui de langages de plus haut niveau (je pense en connaissance de cause à python, avec pip qui fait le café). Penser qu’il est possible de comparer l’art de la programmation en C à écrire des scripts dans des langages aux paradigmes et aux approches différents, c’est selon moi une erreur.

Maintenant, robert003, si tu veux une lib en C pour manipuler les listes, il y en a dans le noyau Linux. Ce sont même des listes doublement chaînées qui servent à référencer les processus et les threads en cours d’exécution sur le système (Windows utilise la même technique pour gérer ses processus et ses threads, mais le code source de leur noyau n’est pas ouvert. Tu peux peut-être les contacter pour leur demander un snippet qui gère des listes chaînées de données quelconques, mais tu te rendras compte que ça n’est peut-être pas adapté à tes besoins).

J’ai trouvé un code intéressant et bien plus intelligent que la glib en matière de conteneurs : https://github.com/chipot/calm-containers

C’est du C qui utilise des macros un peu comme les templates en C++. C’est un peu plus chiant à utiliser, évidemment, car tu dois définir et enlever la définition de certaines constantes manuellement, mais ça peut peut-être répondre à tes besoins.

Et si tu as le malheur de me dire "ouais mais je veux pas utiliser l’allocation dynamique", alors je te dis merde. :)

+0 -0

Moi je comprends pas le coup des downvote, mais passons. Je comprends le fait de ne pas vouloir réinventer la roue, mais il n’y as pas de lib pour tout et pas forcement adaptée a ton besoin.

Maintenant, robert003, si tu veux une lib en C pour manipuler les listes, il y en a dans le noyau Linux. […]

Ge0

Oui, et d’ailleurs c’est assez rigolo de voir comment elles sont faites. Ce n’est pas une liste qui contient un objet, mais l’inverse ! La déclaration de la liste devient simplement :

1
2
3
struct list {
    struct list *next, *prev;
};

Ok mais comment tu retrouves la valeur (la struct parente) du coup ?
Tu t’amuses avec les offsets ?

+0 -0

Salut,

J’appuye les suggestions et dires de Ge0, ache et Pouet_forever. La première chose avant d’aller chercher après une bibliothèque, c’est de savoir quel est ton besoin réel. S’il est simple, autant construite toi-même une petite structure qui va bien adaptée à tes besoins sans recourir à des bibliothèques externes. C’est d’ailleurs assez fréquent de voir de la gestion dédiée de listes chaînées (ou d’autres structures de données) dans les projets C.

Ensuite, si tu ne souhaites pas employer tes propres fonctions, il y a, comme cela a été dit, des solutions simples et éprouvées pour cela. L’en-tête <linux/list.h> du noyau Linux a été cité (je ne connaissais pas d’ailleurs, merci pour l’info ;) ), mais tu as également un en-tête dédié du côté des *BSD <sys/queue.h> (le lien pointe ici vers OpenBSD, mais il est normalement présent sous la même forme dans les autres projets).

Puis bon, à un moment il est nécessaire de balancer l’argument « il ne faut pas réinventer la roue » pour éviter les excès. C’est pas déconnant de construire deux ou trois fonctions pour gérer des listes chaînées au lieu de se taper la Glib comme dépendance (je ne nie pas que c’est une bonne bibliothèque, mais c’est juste overkill dans ce cas ci).

x’D C’est beau le C …

ache

Yep. <3

+2 -0

Moi je comprends pas le coup des downvote, mais passons. Je comprends le fait de ne pas vouloir réinventer la roue, mais il n’y as pas de lib pour tout et pas forcement adaptée a ton besoin.

```

Pouet_forever

Les downvotes seraient utiles si les personnes expriment pourquoi ce désaccord, ce qui ne semblent pas être le cas ici… je ne juge pas les fonctionnement du forum, ils font comme ils veulent, mais montrer son désaccord en écrivant pourquoi me semble bien plus formateur. C’est comme si on te mettait 0 à un devoir sans te donner la correction.

Les downvotes seraient utiles si les personnes expriment pourquoi ce désaccord, ce qui ne semblent pas être le cas ici…

fred1599

Les -1 peuvent déjà être utiles en tant que tels. La réponse de l’OP au message de Pouet_forever illustre d’ailleurs très bien la raison.

Personnellement je voulais étayer mon avis, mais j’ai cruellement manqué de temps cette semaine. La raison de mon -1 est effectivement de ne pas réinventer la roue, pour un problème tellement éculé que de bonnes implémentations se trouvent partout.

Je ne considère pas que l’écriture d’un module de listes chaînées soit « peu coûteux sur moult aspects ». Oui, quand tu crées juste ta petite structure, une fonction d’allocation et une fonction d’ajout en tête de liste, ça représente une petite quantité de code.
Mais tu peux vite avoir besoin de calculer la taille de ta liste, de supprimer des éléments, de trouver l’index d’un élément, d’ajouter à gauche ou à droite, etc. Ou encore, d’avoir besoin à un autre endroit dans le projet d’une liste chaînée pour un autre type de données, et de te retrouver bloqué par ton implémentation simpliste.

Il y a des bibliothèques pour ça, autant en faire bon usage.

Et puis on commence avec des listes chaines et puis un jour on besoin de tableau ou de map ou de tas ou de priority queue ou que sais je d’autre.... On refait tout à chaque fois ?

Et il ne faut surtout pas oublier que tout le temps passé à ré-inventer la roue est du temps de perdu sur la résolution du problème initial.

+1 -1

Les downvotes seraient utiles si les personnes expriment pourquoi ce désaccord, ce qui ne semblent pas être le cas ici…

fred1599

Les -1 peuvent déjà être utiles en tant que tels. La réponse de l’OP au message de Pouet_forever illustre d’ailleurs très bien la raison.

entwanne

Personnellement, les -1 ne prêtent qu’à une seule interprétation: le désaccord

Mais jamais l’on devine le pourquoi de ce désaccord… à moins de faire de la transmission de pensée. Et puis discuter de ses expériences ça en apporte à d’autres, surtout en informatique, c’est assez efficace !

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte