Jak najprościej zaimplementować obsługę słownika w C?

Odpowiedz Nowy wątek
2020-01-12 23:45
0

W pewnym momencie mojej radosnej twórczości w języku C okazało się, że trzeba mi zaimplementować obsługę słownika – rozumianego jako lista par klucz-wartość.

Ustaliłem, że potrzebuję, by każdy element słownika był reprezentowany przez parę (ciąg znaków, liczba zmiennoprzecinkowa). Słownik będzie wielokrotnie wykorzystywany, więc zamierzam przechowywać go w pliku.

Nie wiem, jak to najprościej zrobić w C. Przyszły mi do głowy następujące cztery pomysły:

  • zaimplementowanie własnej obsługi własnej struktury słownika w pliku tekstowym (opcja "hardest");
  • zaimplementowanie własnej obsługi struktury w jakimś popularnym formacie (np. JSON);
  • skorzystanie z biblioteki do obsługi jakiegoś popularnego formatu (np. JSON);
  • skorzystanie z biblioteki do obsługi słowników (o ile taka w ogóle jest dla C) (opcja "softest").

Być-może-istotne-szczegóły-projektowe: przewiduję, że ciąg znaków będzie zawierać następujące znaki: a-z, A-Z, 0-9, łącznik (-) i apostrof. Na razie nie planuję, by zawierał białe znaki; jestem jednak przewidujący, więc pomyślałem, że fajnie by było, gdyby przy implementacji od razu uwzględnić taką możliwość. Przewiduję, że liczba zmiennoprzecinkowa powinna mieć co najmniej dwa miejsca po przecinku; będzie z zakresu (0; 1].

Który z tych pomysłów jest najlepszy (głównie: najprostszy)? Może ktoś zna jakieś biblioteki? Najbardziej chciałbym takie, które są powszechne w repozytoriach dystrybucji Linuksa.


PS. Zapomniałem o dość ważnej rzeczy: jakie operacje przewiduję na słowniku. Otóż:

  1. wyszukiwanie par po kluczu, tj. po ciągu znaków;
  2. dodawanie par;
  3. usuwanie par;
  4. modyfikowanie wartości; ostatecznie mogę to zaimplementować za pomocą usuwania i dodawania, tylko martwię się o wydajność.

Jeszcze jedna uwaga, właśnie co do wydajności: przewiduję, że słownik będzie zawierać co najmniej kilka tysięcy par, a być może i kilkadziesiąt tysięcy (chyba że wcześniej porzucę ten projekt – tak, uwzględniam taką możliwość). Nie wiem, czy to ma znaczenie przy wyborze rozwiązania.


PS2. Fajnie będzie, jeśli będzie łatwo sortować słownik, aczkolwiek to mogę zrobić także jakoś zewnętrznie (może w Bashu?).

Jeszcze przyszło mi do głowy: nie musi to być nawet w języku C. Jednak z uwagi na to, że aktualnie po prostu w nim piszę, oraz z uwagi na wydajność wybrałem go. W przypadku innej technologii wolałbym, by była to taka, którą się posługuję; jako więc alternatywę rozpatruję aktualnie Bash i JavaScript.


edytowany 10x, ostatnio: Silv, 2020-01-13 00:02

Pozostało 580 znaków

2020-01-14 14:32
0

Brzmi rozsądnie. Nawet ma interfejs do C. Zobaczę.


Pozostało 580 znaków

2020-01-14 14:48
1

Pod *nixami to jest klasyka jeśli chodzi o tłumaczenia: https://www.gnu.org/software/gettext/
Pytanie czy chodzi tylko o tłumaczenia i po co Ci dodawanie do pliku bo to się do tego wyboru języka ma dość dziwnie.

edytowany 1x, ostatnio: alagner, 2020-01-14 14:48

Pozostało 580 znaków

2020-01-14 14:52
0

@alagner: nieprecyzyjnie się wyraziłem, przyznaję. Określenie = zdeterminowanie, ustalenie. Innymi słowy – powiedzenie użytkownikowi, w jakim języku jest podany tekst.


edytowany 2x, ostatnio: Silv, 2020-01-14 14:53
musisz to robić słownikowo? a nie tak jak tu https://github.com/saffsd/langid.py/tree/master/langid - alagner 2020-01-14 15:10
@alagner: skąd to bierze dane do identyfikacji? - Silv 2020-01-14 15:13
o ile wiem - rozpoznaje zbitki znaków charakterystyczne dla języków. Ktoś to implementował tu ręcznie chyba przy okazji forumowego CTFa. - alagner 2020-01-14 15:53
Ale gdzie przechowuje dane, na podstawie których rozpoznaje te zbitki? - Silv 2020-01-14 15:54

Pozostało 580 znaków

2020-01-14 14:58
2020-01-14 15:02
0

@Spine: dzięki, ale nie o to mi chodzi. ;)


a powinno :P - Spine 2020-01-14 15:02
Jeśli miałbym myśleć w tych kategoriach, niczego bym się nie nauczył w praktyce ;) – tak wiele już wymyślono, tyle trzeba by dokumentacji czytać. - Silv 2020-01-14 15:04
No ale jak chcesz się uczyć w praktyce, to programuj fajne rzeczy, które Cię interesują. Nudne rzeczy zostaw innym programistom :D Nikogo nie interesuje wykrywanie języka podanego tekstu :P No i dojrzałe rozwiązania raczej będą lepiej działać... - Spine 2020-01-14 16:01
Interesuje mnie robienie czegoś, co: a) przyda się komuś; b) jest na tyle proste (technologicznie i koncepcyjnie), bym nie musiał czytać teorii przez miesiąc przed rozpoczęciem. Wykrywanie języka jest kompromisem między tymi dwoma punktami. Bardzo chętnie bym robił coś, co nie jest kompromisem, tylko całkowicie spełnia oba punkty. Ale nie mam pomysłu. Jeśli masz jakiś pomysł, rozważę. - Silv 2020-01-14 16:05
PS. Możesz rzucić okiem na mojego GitHuba (jeśli Ci się chce). https://github.com/silvuss/silvuss-bracket-string-validator -> spełnia p. b, nie spełnia p. a. https://github.com/silvuss/silvuss-termbase -> spełnia p. a, nie spełnia p. b. https://github.com/silvuss/silvuss-imsy -> przykład kompromisu; jednak zbyt mało spełnia p. a, więc leży odłogiem. https://github.com/silvuss/silvuss-gesp -> przykład kompromisu; podobnie, zbyt mało spełnia p. a. https://github.com/silvuss/silvuss-forcom -> spełnia p. b, nie spełnia p. a. - Silv 2020-01-14 16:19

Pozostało 580 znaków

2020-01-14 15:43
0

Do internacjonalizacji kazdy jezyk programowania ma inne rozwiazanie.
W C to jest ww gettext i tego bym sie trzymal, chyba ze robisz cos w oparciu o VS.

Pliki .po uzywane przez gettext sa calkiem przyjemne i doczekaly sie nawet specjalnych edytorow.


Szacuje się, że w Polsce brakuje 50 tys. programistów

Pozostało 580 znaków

2020-01-14 15:45
0

@vpiotr: nie, nie. Mój program ma wykrywać język podanego tekstu.


Pozostało 580 znaków

2020-01-14 16:52
0

Do wykrywania jezyka to jeszcze przydaloby sie aby ta mapa byla uporzadkowana. Bo sa pewne bloczki ktore od razu definiuja jezyk ("k*#wa"), a sa tez takie ktore moga tylko podpowiedziec jezyk ("mi","ni","oni")

  • jesli robisz to co mysle (analiza czestotliwosciowa).

Szacuje się, że w Polsce brakuje 50 tys. programistów

Pozostało 580 znaków

2020-01-14 16:57
0

I jeszcze jakaś tolerancja na błędnie wpisane słowa, skoro rywalizujemy z Google :]
https://pl.wikipedia.org/wiki[...]%82o%C5%9B%C4%87_Levenshteina

edytowany 2x, ostatnio: Spine, 2020-01-14 16:57

Pozostało 580 znaków

2020-01-14 17:01
1

@vpiotr: rozmyślałem nad tym wstępnie. Jeszcze do przemyślenia, jak już będę mieć prototyp.

@Spine: Wybacz, ale… :D Nie zamierzałem rywalizować z Google… bez szerszej znajomości bodaj uczenia maszynowego chyba się nawet nie da zacząć takiej rywalizacji.


PS. @Spine: ale za wzmiankę o tej odległości dziękuję; chyba już kiedyś o niej słyszałem. To jeszcze do rozważenia. - Silv 2020-01-14 17:14

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0