LINUX.ORG.RU

Как создать множество в языке Си (чтобы видно было далеко)?

 , , множество


0

2

Первое что приходит в голову - это использовать GHashTable из GLib. Ну там, автоматические биндинги подо всё (Python, C#, Java) через GObject Introspection, наличие документации.

И вот смотрю я на него внимательно: https://docs.gtk.org/glib/type_func.HashTable.get_keys.html

а там написано: «This function is not directly available to language bindings.»

И так почти во всех функциях этого «класса».

Или, в функции Add написано: https://docs.gtk.org/glib/type_func.HashTable.add.html «When a hash table only ever contains keys that have themselves as the corresponding value it is able to be stored more efficiently. See the discussion in the section description.» но в этой документации нет вкладки «дискуссии» в секции «description»…

Я понимаю, что нормальные люди этим не пользуются. Но как вообще они тогда программируют? Работа с множествами это базовая база. А писать надо обязательно на Си, так как это единственный язык с хорошо проработанными FFI (https://en.wikipedia.org/wiki/Foreign_function_interface), это потребуется, когда нужно будет построенную объектную модель скриптовать из под всего.

★★★

Последнее исправление: Shushundr (всего исправлений: 2)

так как это единственный язык с хорошо проработанными FFI

Это ложь, конечно. Нормальные люди не используют C, только и всего.

slovazap ★★★★★
()

чтобы видно было далеко

Бери любую готовую хештаблю или пиги сам, или базу данных даже, хрен знает что у тебя за данные и какой у них размер.

это потребуется, когда нужно будет построенную объектную модель скриптовать из под всего.

Пиши API доступа к данным и работе с ними, а потом под всё пиши биндинги или теже FFI. Интросекцию ты сам описал, то что там функции недоступные по цитате из вне, так ты сам должен свои методы для интросекции делать и во вне выпускать, а не внутренние, пиши свои ибёртки к ним и всё.

Можно сделать ход конём статически собрать с lua и использовать её механизмы хранения и доступа (хештабли) к данным внутри Си которые потом ещё раз обернуть в функции которые уже будут для биндинга/FFI для других языков при этом lua будет из коробки даже когда у тебя в системе вообще не будет ничего из интерпретаторов.

Короче тебе сначала нужно взять хешталю, реализовать своё нечто, написать к нему API и только потом задаваться вопросом по поводу биндинга к всему. Что прям к всему всему надо?

На правах диванной аналитики

LINUX-ORG-RU ★★★★★
()

применяй лучшие практики, иди в ногу со временем. спроси www.phind.com

create an unordered set in c programming language

оно тебе даже код напишет, а ты выдашь его за свой.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от alysnix

Мне надо не как попало, а чтобы хорошо интегрировалось с PyGObject (или как там называется библиотека для питонофикации). А ещё лучше, чтобы уже готовый код был такой в одном из Gnome-приложений.

Shushundr ★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

Короче тебе сначала нужно взять хешталю, реализовать своё нечто, написать к нему API и только потом задаваться вопросом по поводу биндинга к всему.

Сначала мне надо пруф-оф-концепт, иначе я не буду реализовывать своё нечто таким образом совсем, а буду реализовывать его другим образом.

Что прям к всему всему надо?

Ну я там написал - Python, Java, C#. Можно ещё JavaScript из Node.js

Lua не надо. Точно.

Интроспекцию ты сам описал, то что там функции недоступные по цитате из вне, так ты сам должен свои методы для интросекции делать и во вне выпускать, пиши свои ибёртки к ним и всё.

Я не понимаю, какие у интроспекции ограничения. Помог бы учебник по ней

Вот ваша ChatGPT пишет:

limitations of GObject Introspection include:

    It does not support some C constructs, such as unions, bitfields, and variadic functions.
    It does not support introspection of private APIs by default.
    Generating GObject Introspection data can be slow and memory-intensive for large libraries.

Ничто из этого не мешало сделать библиотеку для работы с множествами. Если её ещё нет готовой, это очень странно.

Shushundr ★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 2)

Это все потому, что в разных задачах требуется разная скорость для разных операций над множествами, поэтому работа с ними реализуется по разному.

Вот, например, один из вариантов: https://en.wikipedia.org/wiki/Disjoint-set_data_structure

soomrack ★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Про PyGObject пишут, что она всё создаёт для своих библиотек в рантайме. А для моей библиотеки она так сработает? (Разумеется моя библиотека будет GObject-based и со сгенерированной метаинформацией)

Shushundr ★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 1)

Множества хорошо создаются на Паскале. Но эмулировать их и на Си можно. Битовые поля и массивы потыкай, точнее массивы битовых полей, где каждый бит - это входит/не входит такой-то элемент в множество.

LongLiveUbuntu ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Множества хорошо создаются на Паскале.

речь идет о множестве с произвольным типом членов. например множестве строк или каких-то обьектов. а не просто коротких чисел, что отображается на bitset.

alysnix ★★★
()
Ответ на: комментарий от Shushundr

Не знаю. Почитай доки сделай 1 функцию в качестве эксперимента и заверни её в гобжект и всё такое. Тебе надо пробовать.

https://pygobject.readthedocs.io/en/latest/ погляди как другие делают. Наверное это.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)

Самое лучшее множество это обычный массив. Еще можно скопировать tree.h из *bsd: https://github.com/openbsd/src/blob/master/sys/sys/tree.h

Ну либо с ноля написать hashmap. Он кстати проще реализуется чем дерево если делать не открытую адресацию, а на списках.

Reset ★★★★★
()
Ответ на: комментарий от Reset

Я кстати какое-то время заморачивался и около 300 задач на leetcode решил на чистом Си, множества писал с ноля. Потом лениво стало, стал использовать богомерзкие плюсы :)

Reset ★★★★★
()
Ответ на: комментарий от olelookoe

Разве тебе не ясно, что моя проблема не в том - использовать массив или enum, а в том, как обеспечить внешнюю скриптуемость? Причём не вашим способом (типа CFFI, ctypes и т.п.), а моим через PyGObject ?

Shushundr ★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 1)
Ответ на: комментарий от snizovtsev

Ну, вы бы могли хотя бы план изучения посоветовать,
https://wiki.gnome.org/Projects/GObjectIntrospection/Architecture

Что-то вроде такого:

1) изучить libffi
2) изучить libgirepository
3) прочитать man на g-ir-scanner
4) прочитать man на g-ir-compiler

Как я должен понять прямоугольник «Specific language bindings» мне не ясно до сих пор...

Shushundr ★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 2)

Если производительность не должна быть высокой, можешь сделать свою программу сервером, а другие языки смогут просто вызывать твои методы через SOAP JSON-RPC.

MOPKOBKA ★★★
()

так как это единственный язык с хорошо проработанными FFI

Неправда, можно это сделать и на современном языке, таком как Rust.

PyO3:

use pyo3::prelude::*;

/// Formats the sum of two numbers as string.
#[pyfunction]
fn sum_as_string(a: usize, b: usize) -> PyResult<String> {
    Ok((a + b).to_string())
}

/// A Python module implemented in Rust. The name of this function must match
/// the `lib.name` setting in the `Cargo.toml`, else Python will not be able to
/// import the module.
#[pymodule]
fn string_sum(_py: Python<'_>, m: &PyModule) -> PyResult<()> {
    m.add_function(wrap_pyfunction!(sum_as_string, m)?)?;
    Ok(())
}

ext-php-rs:

#![cfg_attr(windows, feature(abi_vectorcall))]

use ext_php_rs::prelude::*;

/// Gives you a nice greeting!
/// 
/// @param string $name Your name.
/// 
/// @return string Nice greeting!
#[php_function]
pub fn hello_world(name: String) -> String {
    format!("Hello, {}!", name)
}

// Required to register the extension with PHP.
#[php_module]
pub fn module(module: ModuleBuilder) -> ModuleBuilder {
    module
}

Или С++, для него есть тоже удобные библиотеки, например Boost.Python

char const* greet()
{
   return "hello, world";
}

#include <boost/python.hpp>

BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("greet", greet);
}
Биндинги под все не сделаются, но никто так и не делает вроде? Тем более везде свои модели выполнения, свои паттерны.

MOPKOBKA ★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 2)
Ответ на: комментарий от MOPKOBKA

если уж душа лежит к pyObject, ну так и делай с ним..сразу втаскивай python внутрь и работай с его сущностями. хешмапы там точно есть :-)

иначе совсем просто : при отсутствии аллергии к С++, задействуется STL, нормальный си-с-классами-и-стл. Если аллергия есть, но не сильно выражена, то возможно ETL (вроде как минимальный аналог контейнеров stl, но без rtti и сверх-модных плюх).

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

втаскивай python внутрь

нет (не буду)

при отсутствии аллергии к С++

тоже нет (в смысле, аллергия, получается, есть)

Я ещё могу понять, человека, толкающего Rust, но ТАКИХ как ты надо гнать.

Shushundr ★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 1)

а там написано: «This function is not directly available to language bindings.»

Это в том смысле, что для него нет XML описания. Потому что всё равно для каждого высокоуровнего языка надо делать индивидуальный интерфейс.

https://pygobject.readthedocs.io/en/latest/guide/api/basic_types.html отображает GHashTable на питоновский dict.

monk ★★★★★
()
1 февраля 2024 г.
Ответ на: комментарий от anonymous

Сейчас статистика такая. easy: 276 medium: 398 hard: 85

На Си решено 500, на C++ 250, на Erlang 48. На других языках единицы.

Reset ★★★★★
()
Последнее исправление: Reset (всего исправлений: 1)
Ответ на: комментарий от Reset

Когда кто-то говорит мне, что не хочет жить в лучшем климате, доступном на Земле, не хочет иметь зп в пол ляма долларов и заниматься самыми интересными проектами, которые ит только может предложить вместе с лучшими инженерами планеты.. ну да, не могу поверить.

Ты бы хоть съездил посмотрел.

untitl3d
()
Ответ на: комментарий от untitl3d

Когда кто-то говорит мне, что не хочет жить в лучшем климате, доступном на Земле, не хочет иметь зп в пол ляма долларов и заниматься самыми интересными проектами, которые ит только может предложить вместе с лучшими инженерами планеты.. ну да, не могу поверить.

Никому из моих знакомых в Калифорнии не понравилось

Waterlaz ★★★★★
()
Ответ на: комментарий от untitl3d

Мне нравится климат того места где я нахожусь. О своем дальнейшем перемещении скоро будет анонс в моем linkedin. У меня все схвачено. Пол ляма зп пока нет, но получаю очень достойно :)

Reset ★★★★★
()